• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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