xref: /aosp_15_r20/external/cronet/base/trace_event/traced_value_support_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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