1 // Copyright 2024 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/trace_event/trace_logging_minimal_win.h"
6
7 #include <gtest/gtest.h>
8
9 #include "base/functional/callback_helpers.h"
10
11 // Test fixture for TlmProvider
12 class TlmProviderTest : public ::testing::Test {
13 protected:
14 TlmProviderTest() = default;
15
MockOSEventRegister()16 void MockOSEventRegister() {
17 TlmProvider::StaticEnableCallback(nullptr, 1, 1, 0, 0, nullptr, &provider_);
18 }
19
20 TlmProvider provider_;
21 };
22
23 // Test default constructor
TEST_F(TlmProviderTest,DefaultConstructor)24 TEST_F(TlmProviderTest, DefaultConstructor) {
25 TlmProvider default_provider;
26 EXPECT_FALSE(default_provider.IsEnabled());
27 }
28
29 // Test parameterized constructor
TEST_F(TlmProviderTest,ParameterizedConstructor)30 TEST_F(TlmProviderTest, ParameterizedConstructor) {
31 EXPECT_FALSE(provider_.IsEnabled());
32 }
33
34 // Test Register method
TEST_F(TlmProviderTest,Register)35 TEST_F(TlmProviderTest, Register) {
36 ULONG result = provider_.Register("TestProvider", GUID(), base::DoNothing());
37 EXPECT_EQ(result, 0UL);
38 }
39
40 // Test Unregister method
TEST_F(TlmProviderTest,Unregister)41 TEST_F(TlmProviderTest, Unregister) {
42 provider_.Register("TestProvider", GUID(), base::DoNothing());
43 provider_.Unregister();
44 EXPECT_FALSE(provider_.IsEnabled());
45 }
46
47 // Test IsEnabled method
TEST_F(TlmProviderTest,IsEnabled)48 TEST_F(TlmProviderTest, IsEnabled) {
49 provider_.Register("TestProvider", GUID(), base::DoNothing());
50 EXPECT_FALSE(provider_.IsEnabled());
51 MockOSEventRegister();
52 EXPECT_TRUE(provider_.IsEnabled());
53 }
54
55 // Test WriteEvent method
TEST_F(TlmProviderTest,WriteEvent)56 TEST_F(TlmProviderTest, WriteEvent) {
57 provider_.Register("TestProvider", GUID(), base::DoNothing());
58 MockOSEventRegister();
59
60 EXPECT_TRUE(provider_.IsEnabled());
61 EVENT_DESCRIPTOR event_descriptor = {};
62 ULONG result = provider_.WriteEvent("TestEvent", event_descriptor);
63 EXPECT_EQ(result, 0UL);
64 }
65
66 // Test WriteEvent with TlmMbcsStringField
TEST_F(TlmProviderTest,WriteEventWithMbcsStringField)67 TEST_F(TlmProviderTest, WriteEventWithMbcsStringField) {
68 provider_.Register("TestProvider", GUID(), base::DoNothing());
69 MockOSEventRegister();
70
71 EXPECT_TRUE(provider_.IsEnabled());
72 EVENT_DESCRIPTOR event_descriptor = {};
73 TlmMbcsStringField field("TestField", "TestValue");
74 ULONG result = provider_.WriteEvent("TestEvent", event_descriptor, field);
75 EXPECT_EQ(result, 0UL);
76 }
77
78 // Test WriteEvent with TlmUtf8StringField
TEST_F(TlmProviderTest,WriteEventWithUtf8StringField)79 TEST_F(TlmProviderTest, WriteEventWithUtf8StringField) {
80 provider_.Register("TestProvider", GUID(), base::DoNothing());
81 MockOSEventRegister();
82
83 EXPECT_TRUE(provider_.IsEnabled());
84 EVENT_DESCRIPTOR event_descriptor = {};
85 TlmUtf8StringField field("TestField", "TestValue");
86 ULONG result = provider_.WriteEvent("TestEvent", event_descriptor, field);
87 EXPECT_EQ(result, 0UL);
88 }
89
90 // Test WriteEvent with TlmInt64Field
TEST_F(TlmProviderTest,WriteEventWithInt64Field)91 TEST_F(TlmProviderTest, WriteEventWithInt64Field) {
92 provider_.Register("TestProvider", GUID(), base::DoNothing());
93 MockOSEventRegister();
94
95 EXPECT_TRUE(provider_.IsEnabled());
96 EVENT_DESCRIPTOR event_descriptor = {};
97 TlmInt64Field field("TestField", 1234567890);
98 ULONG result = provider_.WriteEvent("TestEvent", event_descriptor, field);
99 EXPECT_EQ(result, 0UL);
100 }
101
102 // Test WriteEvent with TlmUInt64Field
TEST_F(TlmProviderTest,WriteEventWithUInt64Field)103 TEST_F(TlmProviderTest, WriteEventWithUInt64Field) {
104 provider_.Register("TestProvider", GUID(), base::DoNothing());
105 MockOSEventRegister();
106
107 EXPECT_TRUE(provider_.IsEnabled());
108 EVENT_DESCRIPTOR event_descriptor = {};
109 TlmUInt64Field field("TestField", 1234567890);
110 ULONG result = provider_.WriteEvent("TestEvent", event_descriptor, field);
111 EXPECT_EQ(result, 0UL);
112 }
113
114 // Test fixture for TlmInt64Field
115 class TlmStringView final : public TlmFieldBase {
116 public:
TlmStringView(std::string_view name)117 TlmStringView(std::string_view name) : TlmFieldBase(name) {}
118 };
119
120 class TlmChar final : public TlmFieldBase {
121 public:
TlmChar(const char * name)122 TlmChar(const char* name) : TlmFieldBase(name) {}
123 };
124
125 class TlmFieldBaseTest : public ::testing::Test {};
126
127 // Test the constructor and Value() method
TEST_F(TlmFieldBaseTest,CharConstructorAndValue)128 TEST_F(TlmFieldBaseTest, CharConstructorAndValue) {
129 char name[] = {'T', 'e', 's', 't', 'F', 'i', 'e', 'l', 'd', 0};
130 unsigned long len = strlen(name);
131 TlmChar field(name);
132
133 // Mock doing stuff in the mem around the null terminated string
134 name[9] = 0xAB;
135
136 // We should be able to use the string view to initialize
137 // Name().data(), this shouldn't cause an error.
138 TlmStringView field2(field.Name());
139
140 EXPECT_EQ(field.Name().data(), name);
141 EXPECT_EQ(field.Name().size(), len);
142
143 EXPECT_EQ(field2.Name().data(), name);
144 EXPECT_EQ(field2.Name().size(), len);
145 }
146