1 // Copyright 2021 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/traced_value_support.h"
6
7 #include <optional>
8 #include <string_view>
9
10 #include "base/memory/ref_counted.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 #include "third_party/perfetto/include/perfetto/test/traced_value_test_support.h"
13
14 namespace base {
15 namespace trace_event {
16
17 namespace {
18
19 struct RefCountedData : RefCounted<RefCountedData> {
20 public:
RefCountedDatabase::trace_event::__anon38baad080111::RefCountedData21 explicit RefCountedData(std::string data) : data_(data) {}
22
WriteIntoTracebase::trace_event::__anon38baad080111::RefCountedData23 void WriteIntoTrace(perfetto::TracedValue context) const {
24 std::move(context).WriteString(data_);
25 }
26
27 private:
28 ~RefCountedData() = default;
29 friend class RefCounted<RefCountedData>;
30
31 std::string data_;
32 };
33
34 struct WeakData {
35 public:
WeakDatabase::trace_event::__anon38baad080111::WeakData36 explicit WeakData(std::string data) : data_(data) {}
37
WriteIntoTracebase::trace_event::__anon38baad080111::WeakData38 void WriteIntoTrace(perfetto::TracedValue context) const {
39 std::move(context).WriteString(data_);
40 }
41
GetWeakPtrbase::trace_event::__anon38baad080111::WeakData42 base::WeakPtr<const WeakData> GetWeakPtr() const {
43 return weak_ptr_factory_.GetWeakPtr();
44 }
45
46 private:
47 std::string data_;
48
49 base::WeakPtrFactory<WeakData> weak_ptr_factory_{this};
50 };
51
52 } // namespace
53
TEST(TracedValueSupportTest,ScopedRefPtr)54 TEST(TracedValueSupportTest, ScopedRefPtr) {
55 EXPECT_EQ(
56 perfetto::TracedValueToString(scoped_refptr<RefCountedData>(nullptr)),
57 "0x0");
58 scoped_refptr<RefCountedData> data =
59 base::MakeRefCounted<RefCountedData>("refcounted");
60 EXPECT_EQ(perfetto::TracedValueToString(data), "refcounted");
61 }
62
TEST(TracedValueSupportTest,Optional)63 TEST(TracedValueSupportTest, Optional) {
64 EXPECT_EQ(perfetto::TracedValueToString(std::optional<int>()), "0x0");
65 EXPECT_EQ(perfetto::TracedValueToString(std::optional<const int>(42)), "42");
66 }
67
TEST(TracedValueSupportTest,WeakPtr)68 TEST(TracedValueSupportTest, WeakPtr) {
69 std::unique_ptr<WeakData> data = std::make_unique<WeakData>("weak");
70 base::WeakPtr<const WeakData> weak_ptr = data->GetWeakPtr();
71 EXPECT_EQ(perfetto::TracedValueToString(weak_ptr), "weak");
72 data.reset();
73 EXPECT_EQ(perfetto::TracedValueToString(weak_ptr), "0x0");
74 }
75
TEST(TracedValueSupportTest,Time)76 TEST(TracedValueSupportTest, Time) {
77 EXPECT_EQ(perfetto::TracedValueToString(base::Microseconds(42)), "42");
78 EXPECT_EQ(
79 perfetto::TracedValueToString(base::Time() + base::Microseconds(42)),
80 "42");
81 EXPECT_EQ(
82 perfetto::TracedValueToString(base::TimeTicks() + base::Microseconds(42)),
83 "42");
84 }
85
TEST(TracedValueSupportTest,UnguessableToken)86 TEST(TracedValueSupportTest, UnguessableToken) {
87 auto token = UnguessableToken::Create();
88 EXPECT_EQ(perfetto::TracedValueToString(token), token.ToString());
89 }
90
TEST(TracedValueSupportTest,UTF16String)91 TEST(TracedValueSupportTest, UTF16String) {
92 EXPECT_EQ(perfetto::TracedValueToString(u"utf-16"), "utf-16");
93 EXPECT_EQ(
94 perfetto::TracedValueToString(static_cast<const char16_t*>(u"utf-16")),
95 "utf-16");
96 EXPECT_EQ(perfetto::TracedValueToString(std::u16string(u"utf-16")), "utf-16");
97 }
98
TEST(TracedValueSupportTest,WideString)99 TEST(TracedValueSupportTest, WideString) {
100 EXPECT_EQ(perfetto::TracedValueToString(L"wide"), "wide");
101 EXPECT_EQ(perfetto::TracedValueToString(static_cast<const wchar_t*>(L"wide")),
102 "wide");
103 EXPECT_EQ(perfetto::TracedValueToString(std::wstring(L"wide")), "wide");
104 }
105
TEST(TracedValueSupportTest,StringPiece)106 TEST(TracedValueSupportTest, StringPiece) {
107 EXPECT_EQ(perfetto::TracedValueToString(std::string_view("string")),
108 "string");
109 EXPECT_EQ(perfetto::TracedValueToString(std::u16string_view(u"utf-16")),
110 "utf-16");
111 EXPECT_EQ(perfetto::TracedValueToString(std::wstring_view(L"wide")), "wide");
112 }
113
TEST(TracedValueSupportTest,RawPtr)114 TEST(TracedValueSupportTest, RawPtr) {
115 // Serialise nullptr.
116 EXPECT_EQ(perfetto::TracedValueToString(raw_ptr<int>()), "0x0");
117
118 {
119 // If the pointer is non-null, its dereferenced value will be serialised.
120 int value = 42;
121 raw_ptr<int> value_simple(&value);
122 raw_ptr<int, AllowPtrArithmetic> value_with_traits(&value);
123
124 EXPECT_EQ(perfetto::TracedValueToString(value), "42");
125 EXPECT_EQ(perfetto::TracedValueToString(value_with_traits), "42");
126 }
127
128 struct WithTraceSupport {
129 void WriteIntoTrace(perfetto::TracedValue ctx) const {
130 std::move(ctx).WriteString("result");
131 }
132 };
133
134 {
135 WithTraceSupport value;
136 raw_ptr<WithTraceSupport> value_simple(&value);
137 raw_ptr<WithTraceSupport, AllowPtrArithmetic> value_with_traits(&value);
138
139 EXPECT_EQ(perfetto::TracedValueToString(value_simple), "result");
140 EXPECT_EQ(perfetto::TracedValueToString(value_with_traits), "result");
141 }
142 }
143
TEST(TracedValueSupportTest,RawRef)144 TEST(TracedValueSupportTest, RawRef) {
145 {
146 int value = 42;
147 raw_ref<int> value_simple(value);
148 raw_ref<int, AllowPtrArithmetic> value_with_traits(value);
149
150 EXPECT_EQ(perfetto::TracedValueToString(value), "42");
151 EXPECT_EQ(perfetto::TracedValueToString(value_with_traits), "42");
152 }
153
154 struct WithTraceSupport {
155 void WriteIntoTrace(perfetto::TracedValue ctx) const {
156 std::move(ctx).WriteString("result");
157 }
158 };
159
160 {
161 WithTraceSupport value;
162 raw_ref<WithTraceSupport> value_simple(value);
163 raw_ref<WithTraceSupport, AllowPtrArithmetic> value_with_traits(value);
164
165 EXPECT_EQ(perfetto::TracedValueToString(value_simple), "result");
166 EXPECT_EQ(perfetto::TracedValueToString(value_with_traits), "result");
167 }
168 }
169
170 } // namespace trace_event
171 } // namespace base
172