// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/trace_event/trace_logging_minimal_win.h"
#include <gtest/gtest.h>
#include "base/functional/callback_helpers.h"
// Test fixture for TlmProvider
class TlmProviderTest : public ::testing::Test {
protected:
TlmProviderTest() = default;
void MockOSEventRegister() {
TlmProvider::StaticEnableCallback(nullptr, 1, 1, 0, 0, nullptr, &provider_);
}
TlmProvider provider_;
};
// Test default constructor
TEST_F(TlmProviderTest, DefaultConstructor) {
TlmProvider default_provider;
EXPECT_FALSE(default_provider.IsEnabled());
}
// Test parameterized constructor
TEST_F(TlmProviderTest, ParameterizedConstructor) {
EXPECT_FALSE(provider_.IsEnabled());
}
// Test Register method
TEST_F(TlmProviderTest, Register) {
ULONG result = provider_.Register("TestProvider", GUID(), base::DoNothing());
EXPECT_EQ(result, 0UL);
}
// Test Unregister method
TEST_F(TlmProviderTest, Unregister) {
provider_.Register("TestProvider", GUID(), base::DoNothing());
provider_.Unregister();
EXPECT_FALSE(provider_.IsEnabled());
}
// Test IsEnabled method
TEST_F(TlmProviderTest, IsEnabled) {
provider_.Register("TestProvider", GUID(), base::DoNothing());
EXPECT_FALSE(provider_.IsEnabled());
MockOSEventRegister();
EXPECT_TRUE(provider_.IsEnabled());
}
// Test WriteEvent method
TEST_F(TlmProviderTest, WriteEvent) {
provider_.Register("TestProvider", GUID(), base::DoNothing());
MockOSEventRegister();
EXPECT_TRUE(provider_.IsEnabled());
EVENT_DESCRIPTOR event_descriptor = {};
ULONG result = provider_.WriteEvent("TestEvent", event_descriptor);
EXPECT_EQ(result, 0UL);
}
// Test WriteEvent with TlmMbcsStringField
TEST_F(TlmProviderTest, WriteEventWithMbcsStringField) {
provider_.Register("TestProvider", GUID(), base::DoNothing());
MockOSEventRegister();
EXPECT_TRUE(provider_.IsEnabled());
EVENT_DESCRIPTOR event_descriptor = {};
TlmMbcsStringField field("TestField", "TestValue");
ULONG result = provider_.WriteEvent("TestEvent", event_descriptor, field);
EXPECT_EQ(result, 0UL);
}
// Test WriteEvent with TlmUtf8StringField
TEST_F(TlmProviderTest, WriteEventWithUtf8StringField) {
provider_.Register("TestProvider", GUID(), base::DoNothing());
MockOSEventRegister();
EXPECT_TRUE(provider_.IsEnabled());
EVENT_DESCRIPTOR event_descriptor = {};
TlmUtf8StringField field("TestField", "TestValue");
ULONG result = provider_.WriteEvent("TestEvent", event_descriptor, field);
EXPECT_EQ(result, 0UL);
}
// Test WriteEvent with TlmInt64Field
TEST_F(TlmProviderTest, WriteEventWithInt64Field) {
provider_.Register("TestProvider", GUID(), base::DoNothing());
MockOSEventRegister();
EXPECT_TRUE(provider_.IsEnabled());
EVENT_DESCRIPTOR event_descriptor = {};
TlmInt64Field field("TestField", 1234567890);
ULONG result = provider_.WriteEvent("TestEvent", event_descriptor, field);
EXPECT_EQ(result, 0UL);
}
// Test WriteEvent with TlmUInt64Field
TEST_F(TlmProviderTest, WriteEventWithUInt64Field) {
provider_.Register("TestProvider", GUID(), base::DoNothing());
MockOSEventRegister();
EXPECT_TRUE(provider_.IsEnabled());
EVENT_DESCRIPTOR event_descriptor = {};
TlmUInt64Field field("TestField", 1234567890);
ULONG result = provider_.WriteEvent("TestEvent", event_descriptor, field);
EXPECT_EQ(result, 0UL);
}
// Test fixture for TlmInt64Field
class TlmStringView final : public TlmFieldBase {
public:
TlmStringView(std::string_view name) : TlmFieldBase(name) {}
};
class TlmChar final : public TlmFieldBase {
public:
TlmChar(const char* name) : TlmFieldBase(name) {}
};
class TlmFieldBaseTest : public ::testing::Test {};
// Test the constructor and Value() method
TEST_F(TlmFieldBaseTest, CharConstructorAndValue) {
char name[] = {'T', 'e', 's', 't', 'F', 'i', 'e', 'l', 'd', 0};
unsigned long len = strlen(name);
TlmChar field(name);
// Mock doing stuff in the mem around the null terminated string
name[9] = 0xAB;
// We should be able to use the string view to initialize
// Name().data(), this shouldn't cause an error.
TlmStringView field2(field.Name());
EXPECT_EQ(field.Name().data(), name);
EXPECT_EQ(field.Name().size(), len);
EXPECT_EQ(field2.Name().data(), name);
EXPECT_EQ(field2.Name().size(), len);
}