xref: /aosp_15_r20/external/perfetto/src/trace_processor/util/glob_unittest.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "src/trace_processor/util/glob.h"
18 
19 #include "test/gtest_and_gmock.h"
20 
21 namespace perfetto {
22 namespace trace_processor {
23 namespace util {
24 namespace {
25 
TEST(GlobUnittest,EmptyPattern)26 TEST(GlobUnittest, EmptyPattern) {
27   GlobMatcher matcher = GlobMatcher::FromPattern("");
28 
29   // Matching patterns.
30   ASSERT_TRUE(matcher.Matches(""));
31 
32   // Non-matching patterns.
33   ASSERT_FALSE(matcher.Matches("A"));
34   ASSERT_FALSE(matcher.Matches("AXBC"));
35   ASSERT_FALSE(matcher.Matches("ABXC"));
36 }
37 
TEST(GlobUnittest,JustStar)38 TEST(GlobUnittest, JustStar) {
39   GlobMatcher matcher = GlobMatcher::FromPattern("*");
40 
41   // Matching patterns.
42   ASSERT_TRUE(matcher.Matches(""));
43   ASSERT_TRUE(matcher.Matches("A"));
44   ASSERT_TRUE(matcher.Matches("ABCD"));
45 }
46 
TEST(GlobUnittest,NoStars)47 TEST(GlobUnittest, NoStars) {
48   GlobMatcher matcher = GlobMatcher::FromPattern("ABC");
49 
50   // Matching patterns.
51   ASSERT_TRUE(matcher.Matches("ABC"));
52 
53   // Non-matching patterns.
54   ASSERT_FALSE(matcher.Matches("AXBC"));
55   ASSERT_FALSE(matcher.Matches("ABXC"));
56   ASSERT_FALSE(matcher.Matches("ABABABBC"));
57   ASSERT_FALSE(matcher.Matches("AAAAAAABABABBC"));
58   ASSERT_FALSE(matcher.Matches("ABCD"));
59   ASSERT_FALSE(matcher.Matches("ABBBBBB"));
60   ASSERT_FALSE(matcher.Matches("BCA"));
61 }
62 
TEST(GlobUnittest,InteriorOnly)63 TEST(GlobUnittest, InteriorOnly) {
64   GlobMatcher matcher = GlobMatcher::FromPattern("A*B*C");
65 
66   // Matching patterns.
67   ASSERT_TRUE(matcher.Matches("ABC"));
68   ASSERT_TRUE(matcher.Matches("AXBC"));
69   ASSERT_TRUE(matcher.Matches("ABXC"));
70   ASSERT_TRUE(matcher.Matches("ABABABBC"));
71   ASSERT_TRUE(matcher.Matches("AAAAAAABABABBC"));
72 
73   // Non-matching patterns.
74   ASSERT_FALSE(matcher.Matches("ABCD"));
75   ASSERT_FALSE(matcher.Matches("ABBBBBB"));
76   ASSERT_FALSE(matcher.Matches("BCA"));
77 }
78 
TEST(GlobUnittest,ComplexInterior)79 TEST(GlobUnittest, ComplexInterior) {
80   GlobMatcher matcher = GlobMatcher::FromPattern("AB*CAB");
81 
82   // Matching patterns.
83   ASSERT_TRUE(matcher.Matches("ABCAB"));
84   ASSERT_TRUE(matcher.Matches("ABCCAB"));
85   ASSERT_TRUE(matcher.Matches("ABCABCAB"));
86   ASSERT_TRUE(matcher.Matches("ABCABCABCABABABCAB"));
87   ASSERT_TRUE(matcher.Matches("ABXCAB"));
88 
89   // Non-matching patterns.
90   ASSERT_FALSE(matcher.Matches("ABXCABCABCA"));
91   ASSERT_FALSE(matcher.Matches("ABXCABCABAB"));
92   ASSERT_FALSE(matcher.Matches("ABXCABCABCB"));
93 }
94 
TEST(GlobUnittest,LeadingAndTrailing)95 TEST(GlobUnittest, LeadingAndTrailing) {
96   GlobMatcher matcher = GlobMatcher::FromPattern("*BC*");
97 
98   // Matching patterns.
99   ASSERT_TRUE(matcher.Matches("ABC"));
100   ASSERT_TRUE(matcher.Matches("ABABABBC"));
101   ASSERT_TRUE(matcher.Matches("AAAAAAABABABBC"));
102   ASSERT_TRUE(matcher.Matches("ABCD"));
103   ASSERT_TRUE(matcher.Matches("BCA"));
104   ASSERT_TRUE(matcher.Matches("AXBC"));
105 
106   // Non-matching patterns.
107   ASSERT_FALSE(matcher.Matches("ABXC"));
108   ASSERT_FALSE(matcher.Matches("ABBBBBB"));
109 }
110 
TEST(GlobUnittest,Leading)111 TEST(GlobUnittest, Leading) {
112   GlobMatcher matcher = GlobMatcher::FromPattern("*BC");
113 
114   // Matching patterns.
115   ASSERT_TRUE(matcher.Matches("ABC"));
116   ASSERT_TRUE(matcher.Matches("AAAAAAABABABBC"));
117   ASSERT_TRUE(matcher.Matches("ABABABBC"));
118   ASSERT_TRUE(matcher.Matches("AXBC"));
119 
120   // Non-matching patterns.
121   ASSERT_FALSE(matcher.Matches("ABXC"));
122   ASSERT_FALSE(matcher.Matches("ABCD"));
123   ASSERT_FALSE(matcher.Matches("ABBBBBB"));
124   ASSERT_FALSE(matcher.Matches("BCA"));
125 }
126 
TEST(GlobUnittest,Trailing)127 TEST(GlobUnittest, Trailing) {
128   GlobMatcher matcher = GlobMatcher::FromPattern("AB*");
129 
130   // Matching patterns.
131   ASSERT_TRUE(matcher.Matches("ABC"));
132   ASSERT_TRUE(matcher.Matches("ABXC"));
133   ASSERT_TRUE(matcher.Matches("ABABABBC"));
134   ASSERT_TRUE(matcher.Matches("ABCD"));
135   ASSERT_TRUE(matcher.Matches("ABBBBBB"));
136 
137   // Non-matching patterns.
138   ASSERT_FALSE(matcher.Matches("AAAAAAABABABBC"));
139   ASSERT_FALSE(matcher.Matches("AXBC"));
140   ASSERT_FALSE(matcher.Matches("BCA"));
141 }
142 
TEST(GlobUnittest,QuestionMarks)143 TEST(GlobUnittest, QuestionMarks) {
144   GlobMatcher matcher = GlobMatcher::FromPattern("AB?*CAB");
145 
146   // Matching patterns.
147   ASSERT_TRUE(matcher.Matches("ABCCAB"));
148   ASSERT_TRUE(matcher.Matches("ABDCAB"));
149   ASSERT_TRUE(matcher.Matches("ABCABDDDDDCAB"));
150   ASSERT_TRUE(matcher.Matches("ABXCABCAB"));
151   ASSERT_TRUE(matcher.Matches("ABXCABCABCABABABCAB"));
152   ASSERT_TRUE(matcher.Matches("ABCAB"));
153 
154   // Non-matching patterns.
155   ASSERT_FALSE(matcher.Matches("ABXCA"));
156   ASSERT_FALSE(matcher.Matches("ABXCABCABCA"));
157 }
158 
TEST(GlobUnittest,CharacterClassRange)159 TEST(GlobUnittest, CharacterClassRange) {
160   GlobMatcher matcher = GlobMatcher::FromPattern("AB[a-zA-Z]CAB");
161 
162   // Matching patterns.
163   ASSERT_TRUE(matcher.Matches("ABaCAB"));
164   ASSERT_TRUE(matcher.Matches("ABcCAB"));
165   ASSERT_TRUE(matcher.Matches("ABzCAB"));
166   ASSERT_TRUE(matcher.Matches("ABACAB"));
167   ASSERT_TRUE(matcher.Matches("ABDCAB"));
168   ASSERT_TRUE(matcher.Matches("ABZCAB"));
169 
170   // Non-matching patterns.
171   ASSERT_FALSE(matcher.Matches("AB1CAB"));
172   ASSERT_FALSE(matcher.Matches("ABaaCAB"));
173   ASSERT_FALSE(matcher.Matches("ABaACAB"));
174   ASSERT_FALSE(matcher.Matches("AB-CAB"));
175 }
176 
TEST(GlobUnittest,CharacterClassNormal)177 TEST(GlobUnittest, CharacterClassNormal) {
178   GlobMatcher matcher = GlobMatcher::FromPattern("AB[abcAZe]CAB");
179 
180   // Matching patterns.
181   ASSERT_TRUE(matcher.Matches("ABaCAB"));
182   ASSERT_TRUE(matcher.Matches("ABcCAB"));
183   ASSERT_TRUE(matcher.Matches("ABACAB"));
184   ASSERT_TRUE(matcher.Matches("ABZCAB"));
185   ASSERT_TRUE(matcher.Matches("ABeCAB"));
186 
187   // Non-matching patterns.
188   ASSERT_FALSE(matcher.Matches("ABBCAB"));
189   ASSERT_FALSE(matcher.Matches("ABCCAB"));
190   ASSERT_FALSE(matcher.Matches("ABCABaCAB"));
191 }
192 
TEST(GlobUnittest,CharacterClassMultiple)193 TEST(GlobUnittest, CharacterClassMultiple) {
194   GlobMatcher matcher = GlobMatcher::FromPattern("*[rR][eE][nN]*");
195 
196   // Matching patterns.
197   ASSERT_TRUE(matcher.Matches("renderScreenImplLock"));
198 
199   // Non-matching patterns.
200   ASSERT_FALSE(matcher.Matches("updateVrFlinger"));
201   ASSERT_FALSE(matcher.Matches("waitForever"));
202 }
203 
TEST(GlobUnittest,CharacterClassMixed)204 TEST(GlobUnittest, CharacterClassMixed) {
205   GlobMatcher matcher = GlobMatcher::FromPattern("AB[abcf-zA-DEFG-Z]CAB");
206 
207   // Matching patterns.
208   ASSERT_TRUE(matcher.Matches("ABaCAB"));
209   ASSERT_TRUE(matcher.Matches("ABbCAB"));
210   ASSERT_TRUE(matcher.Matches("ABhCAB"));
211   ASSERT_TRUE(matcher.Matches("ABACAB"));
212   ASSERT_TRUE(matcher.Matches("ABHCAB"));
213   ASSERT_TRUE(matcher.Matches("ABZCAB"));
214 
215   // Non-matching patterns.
216   ASSERT_FALSE(matcher.Matches("ABeCAB"));
217 }
218 
TEST(GlobUnittest,CharacterClassInvert)219 TEST(GlobUnittest, CharacterClassInvert) {
220   GlobMatcher matcher = GlobMatcher::FromPattern("AB[^a-zA]CAB");
221 
222   // Matching patterns.
223   ASSERT_TRUE(matcher.Matches("ABHCAB"));
224   ASSERT_TRUE(matcher.Matches("ABZCAB"));
225 
226   // Non-matching patterns.
227   ASSERT_FALSE(matcher.Matches("ABhCAB"));
228   ASSERT_FALSE(matcher.Matches("ABaCAB"));
229   ASSERT_FALSE(matcher.Matches("ABbCAB"));
230   ASSERT_FALSE(matcher.Matches("ABACAB"));
231 }
232 
TEST(GlobUnittest,CharacterClassNestedDash)233 TEST(GlobUnittest, CharacterClassNestedDash) {
234   GlobMatcher matcher = GlobMatcher::FromPattern("AB[-]CAB");
235 
236   // Matching patterns.
237   ASSERT_TRUE(matcher.Matches("AB-CAB"));
238 
239   // Non-matching patterns.
240   ASSERT_FALSE(matcher.Matches("AB]CAB"));
241 }
242 
TEST(GlobUnittest,CharacterClassNestedOpenSquare)243 TEST(GlobUnittest, CharacterClassNestedOpenSquare) {
244   GlobMatcher matcher = GlobMatcher::FromPattern("AB[[]CAB");
245 
246   // Matching patterns.
247   ASSERT_TRUE(matcher.Matches("AB[CAB"));
248 
249   // Non-matching patterns.
250   ASSERT_FALSE(matcher.Matches("AB]CAB"));
251 }
252 
TEST(GlobUnittest,CharacterClassNestedClosedSquare)253 TEST(GlobUnittest, CharacterClassNestedClosedSquare) {
254   GlobMatcher matcher = GlobMatcher::FromPattern("AB[]]CAB");
255 
256   // Matching patterns.
257   ASSERT_TRUE(matcher.Matches("AB]CAB"));
258 
259   // Non-matching patterns.
260   ASSERT_FALSE(matcher.Matches("AB[CAB"));
261 }
262 
TEST(GlobUnittest,Complex)263 TEST(GlobUnittest, Complex) {
264   GlobMatcher matcher = GlobMatcher::FromPattern("AB*[C-D]?*F*CAB");
265 
266   // Matching patterns.
267   ASSERT_TRUE(matcher.Matches("ABDDDDDDCIFJKNFCAB"));
268 
269   // Non-matching patterns.
270   ASSERT_FALSE(matcher.Matches("ABDDDDDDCIFJKNFAB"));
271 }
272 
273 }  // namespace
274 }  // namespace util
275 }  // namespace trace_processor
276 }  // namespace perfetto
277