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