xref: /aosp_15_r20/external/perfetto/src/base/string_splitter_unittest.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
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_splitter.h"
18*6dbdd20aSAndroid Build Coastguard Worker 
19*6dbdd20aSAndroid Build Coastguard Worker #include <vector>
20*6dbdd20aSAndroid Build Coastguard Worker 
21*6dbdd20aSAndroid Build Coastguard Worker #include "test/gtest_and_gmock.h"
22*6dbdd20aSAndroid Build Coastguard Worker 
23*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
24*6dbdd20aSAndroid Build Coastguard Worker namespace base {
25*6dbdd20aSAndroid Build Coastguard Worker namespace {
26*6dbdd20aSAndroid Build Coastguard Worker 
27*6dbdd20aSAndroid Build Coastguard Worker using testing::ElementsAreArray;
28*6dbdd20aSAndroid Build Coastguard Worker 
TEST(StringSplitterTest,StdString)29*6dbdd20aSAndroid Build Coastguard Worker TEST(StringSplitterTest, StdString) {
30*6dbdd20aSAndroid Build Coastguard Worker   {
31*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss("", 'x');
32*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, ss.cur_token());
33*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, ss.cur_token_size());
34*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_FALSE(ss.Next());
35*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, ss.cur_token());
36*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, ss.cur_token_size());
37*6dbdd20aSAndroid Build Coastguard Worker   }
38*6dbdd20aSAndroid Build Coastguard Worker   {
39*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(std::string(), 'x');
40*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, ss.cur_token());
41*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, ss.cur_token_size());
42*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_FALSE(ss.Next());
43*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, ss.cur_token());
44*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, ss.cur_token_size());
45*6dbdd20aSAndroid Build Coastguard Worker   }
46*6dbdd20aSAndroid Build Coastguard Worker   {
47*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss("a", 'x');
48*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, ss.cur_token());
49*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, ss.cur_token_size());
50*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
51*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("a", ss.cur_token());
52*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, ss.cur_token_size());
53*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_FALSE(ss.Next());
54*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, ss.cur_token_size());
55*6dbdd20aSAndroid Build Coastguard Worker   }
56*6dbdd20aSAndroid Build Coastguard Worker   {
57*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss("abc", 'x');
58*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
59*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("abc", ss.cur_token());
60*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, ss.cur_token_size());
61*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_FALSE(ss.Next());
62*6dbdd20aSAndroid Build Coastguard Worker   }
63*6dbdd20aSAndroid Build Coastguard Worker   {
64*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss("ab,", ',');
65*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
66*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("ab", ss.cur_token());
67*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(2u, ss.cur_token_size());
68*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_FALSE(ss.Next());
69*6dbdd20aSAndroid Build Coastguard Worker   }
70*6dbdd20aSAndroid Build Coastguard Worker   {
71*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(",ab,", ',');
72*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
73*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("ab", ss.cur_token());
74*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(2u, ss.cur_token_size());
75*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_FALSE(ss.Next());
76*6dbdd20aSAndroid Build Coastguard Worker   }
77*6dbdd20aSAndroid Build Coastguard Worker   {
78*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss("a,b,c", ',');
79*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
80*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, ss.cur_token_size());
81*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("a", ss.cur_token());
82*6dbdd20aSAndroid Build Coastguard Worker 
83*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
84*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("b", ss.cur_token());
85*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, ss.cur_token_size());
86*6dbdd20aSAndroid Build Coastguard Worker 
87*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
88*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("c", ss.cur_token());
89*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, ss.cur_token_size());
90*6dbdd20aSAndroid Build Coastguard Worker 
91*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_FALSE(ss.Next());
92*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, ss.cur_token());
93*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, ss.cur_token_size());
94*6dbdd20aSAndroid Build Coastguard Worker   }
95*6dbdd20aSAndroid Build Coastguard Worker   {
96*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss("a,b,c,", ',');
97*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
98*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("a", ss.cur_token());
99*6dbdd20aSAndroid Build Coastguard Worker 
100*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
101*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("b", ss.cur_token());
102*6dbdd20aSAndroid Build Coastguard Worker 
103*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
104*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("c", ss.cur_token());
105*6dbdd20aSAndroid Build Coastguard Worker 
106*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_FALSE(ss.Next());
107*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, ss.cur_token());
108*6dbdd20aSAndroid Build Coastguard Worker   }
109*6dbdd20aSAndroid Build Coastguard Worker   {
110*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(",,a,,b,,,,c,,,", ',');
111*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
112*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("a", ss.cur_token());
113*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, ss.cur_token_size());
114*6dbdd20aSAndroid Build Coastguard Worker 
115*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
116*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("b", ss.cur_token());
117*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, ss.cur_token_size());
118*6dbdd20aSAndroid Build Coastguard Worker 
119*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
120*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("c", ss.cur_token());
121*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, ss.cur_token_size());
122*6dbdd20aSAndroid Build Coastguard Worker 
123*6dbdd20aSAndroid Build Coastguard Worker     for (int i = 0; i < 3; i++) {
124*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_FALSE(ss.Next());
125*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(0u, ss.cur_token_size());
126*6dbdd20aSAndroid Build Coastguard Worker     }
127*6dbdd20aSAndroid Build Coastguard Worker   }
128*6dbdd20aSAndroid Build Coastguard Worker   {
129*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(",,", ',');
130*6dbdd20aSAndroid Build Coastguard Worker     for (int i = 0; i < 3; i++) {
131*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_FALSE(ss.Next());
132*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(nullptr, ss.cur_token());
133*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(0u, ss.cur_token_size());
134*6dbdd20aSAndroid Build Coastguard Worker     }
135*6dbdd20aSAndroid Build Coastguard Worker   }
136*6dbdd20aSAndroid Build Coastguard Worker   {
137*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(",,foo", ',');
138*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
139*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("foo", ss.cur_token());
140*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, ss.cur_token_size());
141*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_FALSE(ss.Next());
142*6dbdd20aSAndroid Build Coastguard Worker   }
143*6dbdd20aSAndroid Build Coastguard Worker }
144*6dbdd20aSAndroid Build Coastguard Worker 
TEST(StringSplitterTest,CString)145*6dbdd20aSAndroid Build Coastguard Worker TEST(StringSplitterTest, CString) {
146*6dbdd20aSAndroid Build Coastguard Worker   {
147*6dbdd20aSAndroid Build Coastguard Worker     char buf[] = "\0x\0";
148*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(buf, sizeof(buf), ',');
149*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_FALSE(ss.Next());
150*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, ss.cur_token());
151*6dbdd20aSAndroid Build Coastguard Worker   }
152*6dbdd20aSAndroid Build Coastguard Worker   {
153*6dbdd20aSAndroid Build Coastguard Worker     char buf[] = "foo\nbar\n\nbaz\n";
154*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(buf, sizeof(buf), '\n');
155*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
156*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, ss.cur_token_size());
157*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("foo", ss.cur_token());
158*6dbdd20aSAndroid Build Coastguard Worker 
159*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
160*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, ss.cur_token_size());
161*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("bar", ss.cur_token());
162*6dbdd20aSAndroid Build Coastguard Worker 
163*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
164*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, ss.cur_token_size());
165*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("baz", ss.cur_token());
166*6dbdd20aSAndroid Build Coastguard Worker 
167*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_FALSE(ss.Next());
168*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, ss.cur_token_size());
169*6dbdd20aSAndroid Build Coastguard Worker   }
170*6dbdd20aSAndroid Build Coastguard Worker   {
171*6dbdd20aSAndroid Build Coastguard Worker     char buf[] = "";
172*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(buf, 0, ',');
173*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_FALSE(ss.Next());
174*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, ss.cur_token());
175*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, ss.cur_token_size());
176*6dbdd20aSAndroid Build Coastguard Worker   }
177*6dbdd20aSAndroid Build Coastguard Worker   {
178*6dbdd20aSAndroid Build Coastguard Worker     char buf[] = "\0";
179*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(buf, 1, ',');
180*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_FALSE(ss.Next());
181*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, ss.cur_token());
182*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(0u, ss.cur_token_size());
183*6dbdd20aSAndroid Build Coastguard Worker   }
184*6dbdd20aSAndroid Build Coastguard Worker   {
185*6dbdd20aSAndroid Build Coastguard Worker     char buf[] = ",,foo,bar\0,baz";
186*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(buf, sizeof(buf), ',');
187*6dbdd20aSAndroid Build Coastguard Worker 
188*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
189*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("foo", ss.cur_token());
190*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, ss.cur_token_size());
191*6dbdd20aSAndroid Build Coastguard Worker 
192*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
193*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("bar", ss.cur_token());
194*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, ss.cur_token_size());
195*6dbdd20aSAndroid Build Coastguard Worker 
196*6dbdd20aSAndroid Build Coastguard Worker     for (int i = 0; i < 3; i++) {
197*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_FALSE(ss.Next());
198*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(0u, ss.cur_token_size());
199*6dbdd20aSAndroid Build Coastguard Worker     }
200*6dbdd20aSAndroid Build Coastguard Worker   }
201*6dbdd20aSAndroid Build Coastguard Worker   {
202*6dbdd20aSAndroid Build Coastguard Worker     char buf[] = ",,a\0,b,";
203*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(buf, sizeof(buf), ',');
204*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
205*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("a", ss.cur_token());
206*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, ss.cur_token_size());
207*6dbdd20aSAndroid Build Coastguard Worker     for (int i = 0; i < 3; i++) {
208*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_FALSE(ss.Next());
209*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(nullptr, ss.cur_token());
210*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(0u, ss.cur_token_size());
211*6dbdd20aSAndroid Build Coastguard Worker     }
212*6dbdd20aSAndroid Build Coastguard Worker   }
213*6dbdd20aSAndroid Build Coastguard Worker   {
214*6dbdd20aSAndroid Build Coastguard Worker     char buf[] = ",a,\0b";
215*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(buf, sizeof(buf), ',');
216*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
217*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("a", ss.cur_token());
218*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, ss.cur_token_size());
219*6dbdd20aSAndroid Build Coastguard Worker     for (int i = 0; i < 3; i++) {
220*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_FALSE(ss.Next());
221*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(0u, ss.cur_token_size());
222*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(nullptr, ss.cur_token());
223*6dbdd20aSAndroid Build Coastguard Worker     }
224*6dbdd20aSAndroid Build Coastguard Worker   }
225*6dbdd20aSAndroid Build Coastguard Worker   {
226*6dbdd20aSAndroid Build Coastguard Worker     char buf[] = ",a\0\0,x\0\0b";
227*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(buf, sizeof(buf), ',');
228*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
229*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("a", ss.cur_token());
230*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(1u, ss.cur_token_size());
231*6dbdd20aSAndroid Build Coastguard Worker     for (int i = 0; i < 3; i++) {
232*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_FALSE(ss.Next());
233*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(0u, ss.cur_token_size());
234*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(nullptr, ss.cur_token());
235*6dbdd20aSAndroid Build Coastguard Worker     }
236*6dbdd20aSAndroid Build Coastguard Worker   }
237*6dbdd20aSAndroid Build Coastguard Worker }
238*6dbdd20aSAndroid Build Coastguard Worker 
TEST(StringSplitterTest,SplitOnNUL)239*6dbdd20aSAndroid Build Coastguard Worker TEST(StringSplitterTest, SplitOnNUL) {
240*6dbdd20aSAndroid Build Coastguard Worker   {
241*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(std::string(""), '\0');
242*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_FALSE(ss.Next());
243*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(nullptr, ss.cur_token());
244*6dbdd20aSAndroid Build Coastguard Worker   }
245*6dbdd20aSAndroid Build Coastguard Worker   {
246*6dbdd20aSAndroid Build Coastguard Worker     std::string str;
247*6dbdd20aSAndroid Build Coastguard Worker     str.resize(48);
248*6dbdd20aSAndroid Build Coastguard Worker     memcpy(&str[0], "foo\0", 4);
249*6dbdd20aSAndroid Build Coastguard Worker     memcpy(&str[4], "bar\0", 4);
250*6dbdd20aSAndroid Build Coastguard Worker     memcpy(&str[20], "baz", 3);
251*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(std::move(str), '\0');
252*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
253*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("foo", ss.cur_token());
254*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, ss.cur_token_size());
255*6dbdd20aSAndroid Build Coastguard Worker 
256*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
257*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("bar", ss.cur_token());
258*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, ss.cur_token_size());
259*6dbdd20aSAndroid Build Coastguard Worker 
260*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
261*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("baz", ss.cur_token());
262*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, ss.cur_token_size());
263*6dbdd20aSAndroid Build Coastguard Worker 
264*6dbdd20aSAndroid Build Coastguard Worker     for (int i = 0; i < 3; i++) {
265*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_FALSE(ss.Next());
266*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(0u, ss.cur_token_size());
267*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(nullptr, ss.cur_token());
268*6dbdd20aSAndroid Build Coastguard Worker     }
269*6dbdd20aSAndroid Build Coastguard Worker   }
270*6dbdd20aSAndroid Build Coastguard Worker   {
271*6dbdd20aSAndroid Build Coastguard Worker     char buf[] = "foo\0bar\0baz\0";
272*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(buf, sizeof(buf), '\0');
273*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
274*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, ss.cur_token_size());
275*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("foo", ss.cur_token());
276*6dbdd20aSAndroid Build Coastguard Worker 
277*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
278*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, ss.cur_token_size());
279*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("bar", ss.cur_token());
280*6dbdd20aSAndroid Build Coastguard Worker 
281*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
282*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, ss.cur_token_size());
283*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("baz", ss.cur_token());
284*6dbdd20aSAndroid Build Coastguard Worker 
285*6dbdd20aSAndroid Build Coastguard Worker     for (int i = 0; i < 3; i++) {
286*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_FALSE(ss.Next());
287*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(0u, ss.cur_token_size());
288*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(nullptr, ss.cur_token());
289*6dbdd20aSAndroid Build Coastguard Worker     }
290*6dbdd20aSAndroid Build Coastguard Worker   }
291*6dbdd20aSAndroid Build Coastguard Worker   {
292*6dbdd20aSAndroid Build Coastguard Worker     char buf[] = "\0\0foo\0\0\0\0bar\0baz\0\0";
293*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(buf, sizeof(buf), '\0');
294*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
295*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, ss.cur_token_size());
296*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("foo", ss.cur_token());
297*6dbdd20aSAndroid Build Coastguard Worker 
298*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
299*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, ss.cur_token_size());
300*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("bar", ss.cur_token());
301*6dbdd20aSAndroid Build Coastguard Worker 
302*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(ss.Next());
303*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_EQ(3u, ss.cur_token_size());
304*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_STREQ("baz", ss.cur_token());
305*6dbdd20aSAndroid Build Coastguard Worker 
306*6dbdd20aSAndroid Build Coastguard Worker     for (int i = 0; i < 3; i++) {
307*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_FALSE(ss.Next());
308*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(0u, ss.cur_token_size());
309*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(nullptr, ss.cur_token());
310*6dbdd20aSAndroid Build Coastguard Worker     }
311*6dbdd20aSAndroid Build Coastguard Worker   }
312*6dbdd20aSAndroid Build Coastguard Worker   {
313*6dbdd20aSAndroid Build Coastguard Worker     char buf[] = "";
314*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(buf, 0, '\0');
315*6dbdd20aSAndroid Build Coastguard Worker     for (int i = 0; i < 3; i++) {
316*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_FALSE(ss.Next());
317*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(0u, ss.cur_token_size());
318*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(nullptr, ss.cur_token());
319*6dbdd20aSAndroid Build Coastguard Worker     }
320*6dbdd20aSAndroid Build Coastguard Worker   }
321*6dbdd20aSAndroid Build Coastguard Worker   {
322*6dbdd20aSAndroid Build Coastguard Worker     char buf[] = "\0";
323*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(buf, 1, '\0');
324*6dbdd20aSAndroid Build Coastguard Worker     for (int i = 0; i < 3; i++) {
325*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_FALSE(ss.Next());
326*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(0u, ss.cur_token_size());
327*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(nullptr, ss.cur_token());
328*6dbdd20aSAndroid Build Coastguard Worker     }
329*6dbdd20aSAndroid Build Coastguard Worker   }
330*6dbdd20aSAndroid Build Coastguard Worker   {
331*6dbdd20aSAndroid Build Coastguard Worker     char buf[] = "\0\0";
332*6dbdd20aSAndroid Build Coastguard Worker     StringSplitter ss(buf, 2, '\0');
333*6dbdd20aSAndroid Build Coastguard Worker     for (int i = 0; i < 3; i++) {
334*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_FALSE(ss.Next());
335*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(0u, ss.cur_token_size());
336*6dbdd20aSAndroid Build Coastguard Worker       EXPECT_EQ(nullptr, ss.cur_token());
337*6dbdd20aSAndroid Build Coastguard Worker     }
338*6dbdd20aSAndroid Build Coastguard Worker   }
339*6dbdd20aSAndroid Build Coastguard Worker }
340*6dbdd20aSAndroid Build Coastguard Worker 
TEST(StringSplitterTest,NestedUsage)341*6dbdd20aSAndroid Build Coastguard Worker TEST(StringSplitterTest, NestedUsage) {
342*6dbdd20aSAndroid Build Coastguard Worker   char text[] = R"(
343*6dbdd20aSAndroid Build Coastguard Worker l1w1 l1w2 l1w3
344*6dbdd20aSAndroid Build Coastguard Worker 
345*6dbdd20aSAndroid Build Coastguard Worker ,l,2,w,1   l,2,,w,,2,,
346*6dbdd20aSAndroid Build Coastguard Worker )";
347*6dbdd20aSAndroid Build Coastguard Worker   std::vector<std::string> all_lines;
348*6dbdd20aSAndroid Build Coastguard Worker   std::vector<std::string> all_words;
349*6dbdd20aSAndroid Build Coastguard Worker   std::vector<std::string> all_tokens;
350*6dbdd20aSAndroid Build Coastguard Worker   for (StringSplitter lines(text, sizeof(text), '\n'); lines.Next();) {
351*6dbdd20aSAndroid Build Coastguard Worker     all_lines.push_back(lines.cur_token());
352*6dbdd20aSAndroid Build Coastguard Worker     for (StringSplitter words(&lines, ' '); words.Next();) {
353*6dbdd20aSAndroid Build Coastguard Worker       all_words.push_back(words.cur_token());
354*6dbdd20aSAndroid Build Coastguard Worker       for (StringSplitter tokens(&words, ','); tokens.Next();) {
355*6dbdd20aSAndroid Build Coastguard Worker         all_tokens.push_back(tokens.cur_token());
356*6dbdd20aSAndroid Build Coastguard Worker       }
357*6dbdd20aSAndroid Build Coastguard Worker     }
358*6dbdd20aSAndroid Build Coastguard Worker   }
359*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_THAT(all_lines,
360*6dbdd20aSAndroid Build Coastguard Worker               ElementsAreArray({"l1w1 l1w2 l1w3", ",l,2,w,1   l,2,,w,,2,,"}));
361*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_THAT(all_words, ElementsAreArray({"l1w1", "l1w2", "l1w3", ",l,2,w,1",
362*6dbdd20aSAndroid Build Coastguard Worker                                            "l,2,,w,,2,,"}));
363*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_THAT(all_tokens, ElementsAreArray({"l1w1", "l1w2", "l1w3", "l", "2",
364*6dbdd20aSAndroid Build Coastguard Worker                                             "w", "1", "l", "2", "w", "2"}));
365*6dbdd20aSAndroid Build Coastguard Worker }  // namespace
366*6dbdd20aSAndroid Build Coastguard Worker 
TEST(StringSplitterTest,EmptyTokens)367*6dbdd20aSAndroid Build Coastguard Worker TEST(StringSplitterTest, EmptyTokens) {
368*6dbdd20aSAndroid Build Coastguard Worker   char text[] = "a,,b";
369*6dbdd20aSAndroid Build Coastguard Worker   std::vector<std::string> tokens;
370*6dbdd20aSAndroid Build Coastguard Worker   for (StringSplitter lines(text, sizeof(text), ',',
371*6dbdd20aSAndroid Build Coastguard Worker                             StringSplitter::EmptyTokenMode::ALLOW_EMPTY_TOKENS);
372*6dbdd20aSAndroid Build Coastguard Worker        lines.Next();) {
373*6dbdd20aSAndroid Build Coastguard Worker     tokens.push_back(lines.cur_token());
374*6dbdd20aSAndroid Build Coastguard Worker   }
375*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_THAT(tokens, testing::ElementsAre("a", "", "b"));
376*6dbdd20aSAndroid Build Coastguard Worker }  // namespace
377*6dbdd20aSAndroid Build Coastguard Worker 
378*6dbdd20aSAndroid Build Coastguard Worker }  // namespace
379*6dbdd20aSAndroid Build Coastguard Worker }  // namespace base
380*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
381