1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker *
4*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker *
8*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker *
10*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker */
16*6dbdd20aSAndroid Build Coastguard Worker
17*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/string_view.h"
18*6dbdd20aSAndroid Build Coastguard Worker
19*6dbdd20aSAndroid Build Coastguard Worker #include <forward_list>
20*6dbdd20aSAndroid Build Coastguard Worker #include <unordered_map>
21*6dbdd20aSAndroid Build Coastguard Worker #include <unordered_set>
22*6dbdd20aSAndroid Build Coastguard Worker
23*6dbdd20aSAndroid Build Coastguard Worker #include "test/gtest_and_gmock.h"
24*6dbdd20aSAndroid Build Coastguard Worker
25*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
26*6dbdd20aSAndroid Build Coastguard Worker namespace base {
27*6dbdd20aSAndroid Build Coastguard Worker namespace {
28*6dbdd20aSAndroid Build Coastguard Worker
TEST(StringViewTest,BasicCases)29*6dbdd20aSAndroid Build Coastguard Worker TEST(StringViewTest, BasicCases) {
30*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView(), StringView(""));
31*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView(""), StringView(""));
32*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView(""), StringView("", 0));
33*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("ab"), StringView("ab", 2));
34*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("ax", 1), StringView("ay", 1));
35*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("ax", 1), StringView("a"));
36*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("ax", 1), "a");
37*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView(reinterpret_cast<const char*>(0x100), 0).ToStdString(),
38*6dbdd20aSAndroid Build Coastguard Worker std::string(""));
39*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo|", 3).ToStdString(), std::string("foo"));
40*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("x") != StringView(""));
41*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("") != StringView("y"));
42*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("a") != StringView("b"));
43*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView().size(), 0ul);
44*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView().data(), nullptr);
45*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("").size(), 0ul);
46*6dbdd20aSAndroid Build Coastguard Worker EXPECT_NE(StringView("").data(), nullptr);
47*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("").empty());
48*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView("x").empty());
49*6dbdd20aSAndroid Build Coastguard Worker
50*6dbdd20aSAndroid Build Coastguard Worker {
51*6dbdd20aSAndroid Build Coastguard Worker StringView x("abc");
52*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(x.size(), 3u);
53*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(x.data()[0], 'a');
54*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(x.data()[2], 'c');
55*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(x == "abc");
56*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(x == StringView("abc"));
57*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(x != StringView("abcd"));
58*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(x == StringView("aBc"));
59*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(x.CaseInsensitiveEq("aBc"));
60*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(x.CaseInsensitiveEq("AbC"));
61*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(x.CaseInsensitiveEq("AbCd"));
62*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(x.CaseInsensitiveEq("ab"));
63*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(x.CaseInsensitiveEq("abcd"));
64*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(x.CaseInsensitiveEq(""));
65*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(x.CaseInsensitiveOneOf({}));
66*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(x.CaseInsensitiveOneOf({"AbCd", "ab", "abcd"}));
67*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(x.CaseInsensitiveOneOf({"aBc", "AbC"}));
68*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(x.CaseInsensitiveOneOf({"AbCd", "aBc"}));
69*6dbdd20aSAndroid Build Coastguard Worker }
70*6dbdd20aSAndroid Build Coastguard Worker
71*6dbdd20aSAndroid Build Coastguard Worker // Test find(char).
72*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView().find('x'), StringView::npos);
73*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("").find('x'), StringView::npos);
74*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").find('x'), StringView::npos);
75*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").find('f'), 0u);
76*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").find('o'), 1u);
77*6dbdd20aSAndroid Build Coastguard Worker
78*6dbdd20aSAndroid Build Coastguard Worker // Test rfind(char).
79*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView().rfind('x'), StringView::npos);
80*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("").rfind('x'), StringView::npos);
81*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").rfind('x'), StringView::npos);
82*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").rfind('f'), 0u);
83*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").rfind('o'), 2u);
84*6dbdd20aSAndroid Build Coastguard Worker
85*6dbdd20aSAndroid Build Coastguard Worker // Test find(const char*).
86*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView().find("x"), StringView::npos);
87*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("").find("x"), StringView::npos);
88*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").find("x"), StringView::npos);
89*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").find("foobar"), StringView::npos);
90*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").find("f", 1), StringView::npos);
91*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").find("f"), 0u);
92*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").find("fo"), 0u);
93*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").find("oo"), 1u);
94*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").find("o"), 1u);
95*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").find("o", 2), 2u);
96*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").find("o", 3), StringView::npos);
97*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").find("o", 10), StringView::npos);
98*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foobar").find("bar", 3), 3u);
99*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foobar").find("bartender"), StringView::npos);
100*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foobar").find("bartender", 3), StringView::npos);
101*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").find(""), 0u); // std::string behaves the same.
102*6dbdd20aSAndroid Build Coastguard Worker
103*6dbdd20aSAndroid Build Coastguard Worker // Test substr().
104*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView().substr(0, 0).ToStdString(), "");
105*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView().substr(3, 1).ToStdString(), "");
106*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").substr(3, 1).ToStdString(), "");
107*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").substr(4, 0).ToStdString(), "");
108*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").substr(4, 1).ToStdString(), "");
109*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").substr(0, 1).ToStdString(), "f");
110*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").substr(0, 3).ToStdString(), "foo");
111*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").substr(0, 99).ToStdString(), "foo");
112*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").substr(1, 2).ToStdString(), "oo");
113*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").substr(1, 3).ToStdString(), "oo");
114*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("foo").substr(1, 99).ToStdString(), "oo");
115*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("xyz").substr(0).ToStdString(), "xyz");
116*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("xyz").substr(2).ToStdString(), "z");
117*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(StringView("xyz").substr(3).ToStdString(), "");
118*6dbdd20aSAndroid Build Coastguard Worker
119*6dbdd20aSAndroid Build Coastguard Worker // Test the < operator.
120*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView() < StringView());
121*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView() < StringView(""));
122*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView() < StringView("foo"));
123*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("") < StringView("foo"));
124*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView() < StringView("foo", 0));
125*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView("foo") < StringView("foo"));
126*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("foo") < StringView("fooo"));
127*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView("fooo") < StringView("foo"));
128*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("bar") < StringView("foo"));
129*6dbdd20aSAndroid Build Coastguard Worker
130*6dbdd20aSAndroid Build Coastguard Worker // Test the <= operator.
131*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView() <= StringView());
132*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView() <= StringView(""));
133*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView() <= StringView("foo"));
134*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("") <= StringView("foo"));
135*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView() <= StringView("foo", 0));
136*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("foo") <= StringView("foo"));
137*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("foo") <= StringView("fooo"));
138*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView("fooo") <= StringView("foo"));
139*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("bar") <= StringView("foo"));
140*6dbdd20aSAndroid Build Coastguard Worker
141*6dbdd20aSAndroid Build Coastguard Worker // Test the > operator.
142*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView() > StringView());
143*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView() > StringView(""));
144*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView() > StringView("foo"));
145*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView("") > StringView("foo"));
146*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView() > StringView("foo", 0));
147*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView("foo") > StringView("foo"));
148*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView("foo") > StringView("fooo"));
149*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("fooo") > StringView("foo"));
150*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView("bar") > StringView("foo"));
151*6dbdd20aSAndroid Build Coastguard Worker
152*6dbdd20aSAndroid Build Coastguard Worker // Test the >= operator.
153*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView() >= StringView());
154*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView() >= StringView(""));
155*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView() >= StringView("foo"));
156*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView("") >= StringView("foo"));
157*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView() >= StringView("foo", 0));
158*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("foo") >= StringView("foo"));
159*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView("foo") >= StringView("fooo"));
160*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("fooo") >= StringView("foo"));
161*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView("bar") >= StringView("foo"));
162*6dbdd20aSAndroid Build Coastguard Worker
163*6dbdd20aSAndroid Build Coastguard Worker // Test StartsWith.
164*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView().StartsWith(StringView()));
165*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView().StartsWith(StringView("")));
166*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("").StartsWith(StringView("")));
167*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("").StartsWith(StringView()));
168*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("foo").StartsWith(StringView()));
169*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("foo").StartsWith(StringView("")));
170*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView().StartsWith("foo"));
171*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView("").StartsWith("foo"));
172*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("foo").StartsWith("foo"));
173*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("foorbar").StartsWith("foo"));
174*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView("foorbar").StartsWith("bar"));
175*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView("foo").StartsWith("fooo"));
176*6dbdd20aSAndroid Build Coastguard Worker
177*6dbdd20aSAndroid Build Coastguard Worker // Test EndsWith.
178*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView().EndsWith(StringView()));
179*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView().EndsWith(StringView("")));
180*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("").EndsWith(StringView("")));
181*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("").EndsWith(StringView()));
182*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("foo").EndsWith(StringView()));
183*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("foo").EndsWith(StringView("")));
184*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView().EndsWith("foo"));
185*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView("").EndsWith("foo"));
186*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("foo").EndsWith("foo"));
187*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView("foorbar").EndsWith("foo"));
188*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(StringView("foorbar").EndsWith("bar"));
189*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(StringView("foo").EndsWith("fooo"));
190*6dbdd20aSAndroid Build Coastguard Worker }
191*6dbdd20aSAndroid Build Coastguard Worker
TEST(StringViewTest,HashCollisions)192*6dbdd20aSAndroid Build Coastguard Worker TEST(StringViewTest, HashCollisions) {
193*6dbdd20aSAndroid Build Coastguard Worker std::unordered_map<uint64_t, StringView> hashes;
194*6dbdd20aSAndroid Build Coastguard Worker std::unordered_set<StringView> sv_set;
195*6dbdd20aSAndroid Build Coastguard Worker auto insert_sv = [&hashes, &sv_set](StringView sv) {
196*6dbdd20aSAndroid Build Coastguard Worker hashes.emplace(sv.Hash(), sv);
197*6dbdd20aSAndroid Build Coastguard Worker size_t prev_set_size = sv_set.size();
198*6dbdd20aSAndroid Build Coastguard Worker sv_set.insert(sv);
199*6dbdd20aSAndroid Build Coastguard Worker ASSERT_EQ(sv_set.size(), prev_set_size + 1);
200*6dbdd20aSAndroid Build Coastguard Worker };
201*6dbdd20aSAndroid Build Coastguard Worker
202*6dbdd20aSAndroid Build Coastguard Worker insert_sv("");
203*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(hashes.size(), 1u);
204*6dbdd20aSAndroid Build Coastguard Worker size_t last_size = 1;
205*6dbdd20aSAndroid Build Coastguard Worker std::forward_list<std::string> strings;
206*6dbdd20aSAndroid Build Coastguard Worker for (uint8_t c = 0; c < 0x80; c++) {
207*6dbdd20aSAndroid Build Coastguard Worker char buf[500];
208*6dbdd20aSAndroid Build Coastguard Worker memset(buf, static_cast<char>(c), sizeof(buf));
209*6dbdd20aSAndroid Build Coastguard Worker for (size_t i = 1; i <= sizeof(buf); i++) {
210*6dbdd20aSAndroid Build Coastguard Worker strings.emplace_front(buf, i);
211*6dbdd20aSAndroid Build Coastguard Worker StringView sv(strings.front());
212*6dbdd20aSAndroid Build Coastguard Worker auto other = hashes.find(sv.Hash());
213*6dbdd20aSAndroid Build Coastguard Worker if (other == hashes.end()) {
214*6dbdd20aSAndroid Build Coastguard Worker insert_sv(sv);
215*6dbdd20aSAndroid Build Coastguard Worker ++last_size;
216*6dbdd20aSAndroid Build Coastguard Worker ASSERT_EQ(hashes.size(), last_size);
217*6dbdd20aSAndroid Build Coastguard Worker continue;
218*6dbdd20aSAndroid Build Coastguard Worker }
219*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(false) << "H(" << sv.ToStdString() << ") = "
220*6dbdd20aSAndroid Build Coastguard Worker << "H(" << other->second.ToStdString() << ")";
221*6dbdd20aSAndroid Build Coastguard Worker }
222*6dbdd20aSAndroid Build Coastguard Worker }
223*6dbdd20aSAndroid Build Coastguard Worker }
224*6dbdd20aSAndroid Build Coastguard Worker
225*6dbdd20aSAndroid Build Coastguard Worker } // namespace
226*6dbdd20aSAndroid Build Coastguard Worker } // namespace base
227*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto
228