#include #include #include #include "opentelemetry/sdk/common/attribute_utils.h" #include "Common.h" #include "TestGeckoTraceEvents.h" #include "mozilla/GeckoTrace.h" namespace mozilla::gecko_trace::tests { class GeckoTraceEventDefinitionsTest : public TestWithInMemorySpanExporter {}; using AttributeMap = std::unordered_map; [[maybe_unused]] static AttributeMap GetEventAttributes( const std::shared_ptr& spanData) { auto spans = spanData->GetSpans(); EXPECT_EQ(spans.size(), 1u) << "Expected exactly 1 span"; const auto& span = spans[0]; auto events = span->GetEvents(); EXPECT_EQ(events.size(), 1u); return events[0].GetAttributes(); } [[maybe_unused]] static void AssertOnlyKeys( const AttributeMap& attrs, const std::set& expected) { std::set actual; for (const auto& [k, _] : attrs) actual.insert(k); EXPECT_EQ(actual, expected); } TEST_F(GeckoTraceEventDefinitionsTest, SimpleEventAttributes) { // Test with all attributes set { GECKO_TRACE_SCOPE("gtests", "Test simple event") event::TestSimple() .WithTestString("test_value") .WithTestInteger(42) .WithTestBoolean(true) .Emit(); } #ifdef GECKO_TRACE_ENABLE auto attrs = GetEventAttributes(mSpanData); AssertOnlyKeys(attrs, {"test_string", "test_integer", "test_boolean"}); EXPECT_EQ(std::get(attrs["test_string"]), "test_value"); EXPECT_EQ(std::get(attrs["test_integer"]), 42); EXPECT_EQ(std::get(attrs["test_boolean"]), true); #else EXPECT_EQ(mSpanData->GetSpans().size(), 0u) << "Expected exactly 0 spans"; #endif } TEST_F(GeckoTraceEventDefinitionsTest, SimpleEventMissingAttributes) { // Test with only one attribute set { GECKO_TRACE_SCOPE("gtests", "Test simple event with missing attributes") event::TestSimple().WithTestInteger(-1).Emit(); } #ifdef GECKO_TRACE_ENABLE auto attrs = GetEventAttributes(mSpanData); AssertOnlyKeys(attrs, {"test_integer"}); EXPECT_EQ(std::get(attrs["test_integer"]), -1); #else EXPECT_EQ(mSpanData->GetSpans().size(), 0u) << "Expected exactly 0 spans"; #endif } TEST_F(GeckoTraceEventDefinitionsTest, ComplexEventAllAttributes) { // Test multi-level inheritance with all attributes set { GECKO_TRACE_SCOPE("gtests", "Test complex event") event::TestComplex() .WithTestString("test_value") .WithTestInteger(42) .WithTestBoolean(true) .WithTestData("additional_data") .WithRetryCount(3) .Emit(); } #ifdef GECKO_TRACE_ENABLE auto attrs = GetEventAttributes(mSpanData); AssertOnlyKeys(attrs, {"test_string", "test_integer", "test_boolean", "test_data", "retry.count"}); EXPECT_EQ(std::get(attrs["test_string"]), "test_value"); EXPECT_EQ(std::get(attrs["test_integer"]), 42); EXPECT_EQ(std::get(attrs["test_boolean"]), true); EXPECT_EQ(std::get(attrs["test_data"]), "additional_data"); EXPECT_EQ(std::get(attrs["retry.count"]), 3); #else EXPECT_EQ(mSpanData->GetSpans().size(), 0u) << "Expected exactly 0 spans"; #endif } TEST_F(GeckoTraceEventDefinitionsTest, ComplexEventPartialAttributes) { // Test multi-level inheritance with only some attributes set { GECKO_TRACE_SCOPE("gtests", "Test complex event with partial attributes") event::TestComplex().WithTestString("x").WithRetryCount(-5).Emit(); } #ifdef GECKO_TRACE_ENABLE auto attrs = GetEventAttributes(mSpanData); AssertOnlyKeys(attrs, {"test_string", "retry.count"}); EXPECT_EQ(std::get(attrs["test_string"]), "x"); EXPECT_EQ(std::get(attrs["retry.count"]), -5); #else EXPECT_EQ(mSpanData->GetSpans().size(), 0u) << "Expected exactly 0 spans"; #endif } TEST_F(GeckoTraceEventDefinitionsTest, DeepInheritanceEvent) { { GECKO_TRACE_SCOPE("gtests", "Test deep inheritance event") event::TestDeepInheritance() .WithTestString("test_value") .WithTestInteger(42) .WithTestBoolean(true) .WithTestData("additional_data") .WithRetryCount(3) .WithExtraInfo("deep_inheritance_info") .Emit(); } #ifdef GECKO_TRACE_ENABLE auto attrs = GetEventAttributes(mSpanData); AssertOnlyKeys(attrs, {"test_string", "test_integer", "test_boolean", "test_data", "retry.count", "extra.info"}); EXPECT_EQ(std::get(attrs["test_string"]), "test_value"); EXPECT_EQ(std::get(attrs["test_integer"]), 42); EXPECT_EQ(std::get(attrs["test_boolean"]), true); EXPECT_EQ(std::get(attrs["test_data"]), "additional_data"); EXPECT_EQ(std::get(attrs["retry.count"]), 3); EXPECT_EQ(std::get(attrs["extra.info"]), "deep_inheritance_info"); #else EXPECT_EQ(mSpanData->GetSpans().size(), 0u) << "Expected exactly 0 spans"; #endif } } // namespace mozilla::gecko_trace::tests