You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Gems/AWSMetrics/Code/Tests/MetricsEventTest.cpp

187 lines
6.5 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <AWSMetricsConstant.h>
#include <MetricsEvent.h>
#include <AzCore/UnitTest/TestTypes.h>
namespace AWSMetrics
{
class MetricsEventTest
: public UnitTest::ScopedAllocatorSetupFixture
{
public:
static constexpr int NumTestMetrics = 10;
static const char* const AttrName;
static const char* const AttrValue;
AZStd::vector<MetricsAttribute> GetRequiredMetricsAttributes()
{
AZStd::vector<MetricsAttribute> result;
result.emplace_back(MetricsAttribute(AwsMetricsAttributeKeyClientId, "0.0.0.0-{00000000-0000-1000-A000-000000000000}"));
result.emplace_back(MetricsAttribute(AwsMetricsAttributeKeyEventId, "{00000000-0000-1000-A000-000000000000}"));
result.emplace_back(MetricsAttribute(AwsMetricsAttributeKeyEventName, "test_event"));
result.emplace_back(MetricsAttribute(AwsMetricsAttributeKeyEventTimestamp, "0000-00-00T00:00:00Z"));
return AZStd::move(result);
}
};
const char* const MetricsEventTest::AttrName = "name";
const char* const MetricsEventTest::AttrValue = "value";
TEST_F(MetricsEventTest, AddAttribute_SingleAttribute_Success)
{
MetricsEvent metrics;
int numAttributes = metrics.GetNumAttributes();
metrics.AddAttribute(MetricsAttribute(AttrName, AttrValue));
ASSERT_EQ(metrics.GetNumAttributes(), numAttributes + 1);
}
TEST_F(MetricsEventTest, AddAttribute_DuplicateAttribute_Fail)
{
MetricsEvent metrics;
int numAttributes = metrics.GetNumAttributes();
metrics.AddAttribute(MetricsAttribute(AttrName, AttrValue));
AZ_TEST_START_TRACE_SUPPRESSION;
metrics.AddAttribute(MetricsAttribute(AttrName, AttrValue));
AZ_TEST_STOP_TRACE_SUPPRESSION(1);
ASSERT_EQ(metrics.GetNumAttributes(), numAttributes + 1);
}
TEST_F(MetricsEventTest, AddAttribute_NoAttributeName_Fail)
{
MetricsEvent metrics;
int numAttributes = metrics.GetNumAttributes();
AZ_TEST_START_TRACE_SUPPRESSION;
metrics.AddAttribute(MetricsAttribute());
AZ_TEST_STOP_TRACE_SUPPRESSION(1);
ASSERT_EQ(metrics.GetNumAttributes(), numAttributes);
}
TEST_F(MetricsEventTest, SetAttributes_ListOfAttributes_Success)
{
MetricsEvent metrics;
AZStd::vector<MetricsAttribute> attributes;
for (int index = 0; index < NumTestMetrics; ++index)
{
attributes.emplace_back(MetricsAttribute(AZStd::string::format("%s%i", AttrName, index), AttrValue));
}
metrics.AddAttributes(attributes);
ASSERT_EQ(metrics.GetNumAttributes(), NumTestMetrics);
}
TEST_F(MetricsEventTest, GetSizeInBytes_SingleAttribute_Success)
{
MetricsEvent metrics;
MetricsAttribute attribute(AttrName, AttrValue);
metrics.AddAttribute(attribute);
ASSERT_EQ(metrics.GetSizeInBytes(), attribute.GetSizeInBytes());
}
TEST_F(MetricsEventTest, SerializeToJson_DefaultAndCustomAttributes_Success)
{
MetricsEvent metrics;
metrics.AddAttribute(MetricsAttribute(AttrName, AttrValue));
metrics.AddAttribute(MetricsAttribute(AwsMetricsAttributeKeyEventName, AttrValue));
std::ostream stream(nullptr);
AWSCore::JsonOutputStream jsonStream{ stream };
AWSCore::JsonWriter writer{ jsonStream };
ASSERT_TRUE(metrics.SerializeToJson(writer));
}
TEST_F(MetricsEventTest, ReadFromJson_DefaultAndCustomAttributes_Success)
{
MetricsEvent metrics;
rapidjson::Document doc;
rapidjson::Value metricsObjVal(rapidjson::kObjectType);
metricsObjVal.AddMember(rapidjson::StringRef(AwsMetricsAttributeKeyEventName), rapidjson::StringRef(AttrValue), doc.GetAllocator());
rapidjson::Value customEventDataObjVal(rapidjson::kObjectType);
customEventDataObjVal.AddMember(rapidjson::StringRef(AttrName), rapidjson::StringRef(AttrValue), doc.GetAllocator());
metricsObjVal.AddMember(rapidjson::Value(AwsMetricsAttributeKeyEventData, doc.GetAllocator()).Move(),
customEventDataObjVal.Move(), doc.GetAllocator());
ASSERT_TRUE(metrics.ReadFromJson(metricsObjVal));
ASSERT_EQ(metrics.GetNumAttributes(), 2);
}
TEST_F(MetricsEventTest, ReadFromJson_InvalidJsonValue_Fail)
{
MetricsEvent metrics;
rapidjson::Document doc;
rapidjson::Value metricsObjVal(rapidjson::kNumberType);
AZ_TEST_START_TRACE_SUPPRESSION;
ASSERT_FALSE(metrics.ReadFromJson(metricsObjVal));
AZ_TEST_STOP_TRACE_SUPPRESSION(1);
}
TEST_F(MetricsEventTest, ReadFromJson_InvalidEventData_Fail)
{
MetricsEvent metrics;
rapidjson::Document doc;
rapidjson::Value metricsObjVal(rapidjson::kObjectType);
metricsObjVal.AddMember(rapidjson::StringRef(AwsMetricsAttributeKeyEventName), rapidjson::StringRef(AttrValue), doc.GetAllocator());
rapidjson::Value customEventDataVal(rapidjson::kNumberType);
metricsObjVal.AddMember(rapidjson::Value(AwsMetricsAttributeKeyEventData, doc.GetAllocator()).Move(),
customEventDataVal.Move(), doc.GetAllocator());
AZ_TEST_START_TRACE_SUPPRESSION;
ASSERT_FALSE(metrics.ReadFromJson(metricsObjVal));
AZ_TEST_STOP_TRACE_SUPPRESSION(1);
}
TEST_F(MetricsEventTest, ValidateAgainstSchema_InvalidMetricsAttributeFormat_Fail)
{
AZStd::vector<MetricsAttribute> metricsAttributes = GetRequiredMetricsAttributes();
metricsAttributes[1].SetVal("InvalidClientId");
MetricsEvent metrics;
metrics.AddAttributes(metricsAttributes);
ASSERT_FALSE(metrics.ValidateAgainstSchema());
}
TEST_F(MetricsEventTest, ValidateAgainstSchema_MissingRequiredMetricsAttribute_Fail)
{
AZStd::vector<MetricsAttribute> metricsAttributes = GetRequiredMetricsAttributes();
metricsAttributes.pop_back();
MetricsEvent metrics;
metrics.AddAttributes(metricsAttributes);
ASSERT_FALSE(metrics.ValidateAgainstSchema());
}
TEST_F(MetricsEventTest, ValidateAgainstSchema_ValidRequiredMetricsAttributes_Success)
{
AZStd::vector<MetricsAttribute> metricsAttributes = GetRequiredMetricsAttributes();
MetricsEvent metrics;
metrics.AddAttributes(metricsAttributes);
ASSERT_TRUE(metrics.ValidateAgainstSchema());
}
}