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 "base/memory/ref_counted.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 #include "third_party/abseil-cpp/absl/types/optional.h"
10 #include "third_party/perfetto/include/perfetto/test/traced_value_test_support.h"
11
12 namespace base {
13 namespace trace_event {
14
15 namespace {
16
17 struct RefCountedData : RefCounted<RefCountedData> {
18 public:
RefCountedDatabase::trace_event::__anon460006370111::RefCountedData19 explicit RefCountedData(std::string data) : data_(data) {}
20
WriteIntoTracebase::trace_event::__anon460006370111::RefCountedData21 void WriteIntoTrace(perfetto::TracedValue context) const {
22 std::move(context).WriteString(data_);
23 }
24
25 private:
26 ~RefCountedData() = default;
27 friend class RefCounted<RefCountedData>;
28
29 std::string data_;
30 };
31
32 struct WeakData {
33 public:
WeakDatabase::trace_event::__anon460006370111::WeakData34 explicit WeakData(std::string data) : data_(data) {}
35
WriteIntoTracebase::trace_event::__anon460006370111::WeakData36 void WriteIntoTrace(perfetto::TracedValue context) const {
37 std::move(context).WriteString(data_);
38 }
39
GetWeakPtrbase::trace_event::__anon460006370111::WeakData40 base::WeakPtr<const WeakData> GetWeakPtr() const {
41 return weak_ptr_factory_.GetWeakPtr();
42 }
43
44 private:
45 std::string data_;
46
47 base::WeakPtrFactory<WeakData> weak_ptr_factory_{this};
48 };
49
50 } // namespace
51
TEST(TracedValueSupportTest,ScopedRefPtr)52 TEST(TracedValueSupportTest, ScopedRefPtr) {
53 EXPECT_EQ(
54 perfetto::TracedValueToString(scoped_refptr<RefCountedData>(nullptr)),
55 "0x0");
56 scoped_refptr<RefCountedData> data =
57 base::MakeRefCounted<RefCountedData>("refcounted");
58 EXPECT_EQ(perfetto::TracedValueToString(data), "refcounted");
59 }
60
TEST(TracedValueSupportTest,Optional)61 TEST(TracedValueSupportTest, Optional) {
62 EXPECT_EQ(perfetto::TracedValueToString(absl::optional<int>()), "0x0");
63 EXPECT_EQ(perfetto::TracedValueToString(absl::optional<const int>(42)), "42");
64 }
65
TEST(TracedValueSupportTest,WeakPtr)66 TEST(TracedValueSupportTest, WeakPtr) {
67 std::unique_ptr<WeakData> data = std::make_unique<WeakData>("weak");
68 base::WeakPtr<const WeakData> weak_ptr = data->GetWeakPtr();
69 EXPECT_EQ(perfetto::TracedValueToString(weak_ptr), "weak");
70 data.reset();
71 EXPECT_EQ(perfetto::TracedValueToString(weak_ptr), "0x0");
72 }
73
TEST(TracedValueSupportTest,Time)74 TEST(TracedValueSupportTest, Time) {
75 EXPECT_EQ(perfetto::TracedValueToString(base::Microseconds(42)), "42");
76 EXPECT_EQ(
77 perfetto::TracedValueToString(base::Time() + base::Microseconds(42)),
78 "42");
79 EXPECT_EQ(
80 perfetto::TracedValueToString(base::TimeTicks() + base::Microseconds(42)),
81 "42");
82 }
83
TEST(TracedValueSupportTest,UnguessableToken)84 TEST(TracedValueSupportTest, UnguessableToken) {
85 auto token = UnguessableToken::Create();
86 EXPECT_EQ(perfetto::TracedValueToString(token), token.ToString());
87 }
88
TEST(TracedValueSupportTest,UTF16String)89 TEST(TracedValueSupportTest, UTF16String) {
90 EXPECT_EQ(perfetto::TracedValueToString(u"utf-16"), "utf-16");
91 EXPECT_EQ(
92 perfetto::TracedValueToString(static_cast<const char16_t*>(u"utf-16")),
93 "utf-16");
94 EXPECT_EQ(perfetto::TracedValueToString(std::u16string(u"utf-16")), "utf-16");
95 }
96
TEST(TracedValueSupportTest,WideString)97 TEST(TracedValueSupportTest, WideString) {
98 EXPECT_EQ(perfetto::TracedValueToString(L"wide"), "wide");
99 EXPECT_EQ(perfetto::TracedValueToString(static_cast<const wchar_t*>(L"wide")),
100 "wide");
101 EXPECT_EQ(perfetto::TracedValueToString(std::wstring(L"wide")), "wide");
102 }
103
TEST(TracedValueSupportTest,StringPiece)104 TEST(TracedValueSupportTest, StringPiece) {
105 EXPECT_EQ(perfetto::TracedValueToString(base::StringPiece("string")),
106 "string");
107 EXPECT_EQ(perfetto::TracedValueToString(base::StringPiece16(u"utf-16")),
108 "utf-16");
109 EXPECT_EQ(perfetto::TracedValueToString(base::WStringPiece(L"wide")), "wide");
110 }
111
TEST(TracedValueSupportTest,RawPtr)112 TEST(TracedValueSupportTest, RawPtr) {
113 // Serialise nullptr.
114 EXPECT_EQ(perfetto::TracedValueToString(raw_ptr<int>()), "0x0");
115
116 {
117 // If the pointer is non-null, its dereferenced value will be serialised.
118 int value = 42;
119 EXPECT_EQ(perfetto::TracedValueToString(raw_ptr<int>(&value)), "42");
120 }
121
122 struct WithTraceSupport {
123 void WriteIntoTrace(perfetto::TracedValue ctx) const {
124 std::move(ctx).WriteString("result");
125 }
126 };
127
128 {
129 WithTraceSupport value;
130 EXPECT_EQ(perfetto::TracedValueToString(raw_ptr<WithTraceSupport>(&value)),
131 "result");
132 }
133 }
134
135 } // namespace trace_event
136 } // namespace base
137