// Copyright 2021 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include "base/values.h" #include "components/metrics/structured/event.h" #include "components/metrics/structured/mojom/event.mojom.h" #include "components/metrics/structured/mojom/event_mojom_traits.h" #include "mojo/public/cpp/test_support/test_utils.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" using testing::AllOf; using testing::ContainerEq; using testing::Eq; using testing::Property; namespace metrics::structured { namespace { void ExpectEventsEqual(const Event& expected, const Event& actual) { EXPECT_THAT(expected, AllOf(Property(&Event::project_name, Eq(actual.project_name())), Property(&Event::event_name, Eq(actual.event_name())), Property(&Event::IsEventSequenceType, Eq(actual.IsEventSequenceType())))); for (const auto& expected_pair : expected.metric_values()) { auto actual_pair = actual.metric_values().find(expected_pair.first); ASSERT_FALSE(actual_pair == actual.metric_values().end()); EXPECT_EQ(expected_pair.second, actual_pair->second); } // Check uptimes only if event is part of a sequence. if (expected.IsEventSequenceType() && actual.IsEventSequenceType()) { EXPECT_EQ(expected.recorded_time_since_boot(), actual.recorded_time_since_boot()); } } } // namespace TEST(EventStructTraitsTest, ValidEvent) { const std::string kProjectName = "project_name"; const std::string kEventName = "event_name"; Event test_event(kProjectName, kEventName); ASSERT_TRUE(test_event.AddMetric("hmac", Event::MetricType::kHmac, base::Value("1234"))); ASSERT_TRUE(test_event.AddMetric("long", Event::MetricType::kLong, base::Value("123456789"))); ASSERT_TRUE( test_event.AddMetric("int", Event::MetricType::kInt, base::Value(123))); ASSERT_TRUE(test_event.AddMetric("double", Event::MetricType::kDouble, base::Value(123.4))); ASSERT_TRUE(test_event.AddMetric("string", Event::MetricType::kRawString, base::Value("string"))); ASSERT_TRUE(test_event.AddMetric("boolean", Event::MetricType::kBoolean, base::Value(false))); // Doesn't matter what the values of the string are. Event output("", ""); ASSERT_TRUE( mojo::test::SerializeAndDeserialize(test_event, output)); ExpectEventsEqual(test_event, output); } TEST(EventStructTraitsTest, EventWithUptime) { Event sequence_event("project_name", "event_name", true); sequence_event.SetRecordedTimeSinceBoot(base::Microseconds(500)); ASSERT_TRUE(sequence_event.AddMetric("double", Event::MetricType::kDouble, base::Value(1.0))); // Doesn't matter what the values of the string are. Event test_output("", ""); ASSERT_TRUE(mojo::test::SerializeAndDeserialize(sequence_event, test_output)); ExpectEventsEqual(sequence_event, test_output); } } // namespace metrics::structured