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::trace_processor::util {
22 namespace {
23
TEST(GlobUnittest,EmptyPattern)24 TEST(GlobUnittest, EmptyPattern) {
25 GlobMatcher matcher = GlobMatcher::FromPattern("");
26
27 // Matching patterns.
28 ASSERT_TRUE(matcher.Matches(""));
29
30 // Non-matching patterns.
31 ASSERT_FALSE(matcher.Matches("A"));
32 ASSERT_FALSE(matcher.Matches("AXBC"));
33 ASSERT_FALSE(matcher.Matches("ABXC"));
34 }
35
TEST(GlobUnittest,JustStar)36 TEST(GlobUnittest, JustStar) {
37 GlobMatcher matcher = GlobMatcher::FromPattern("*");
38
39 // Matching patterns.
40 ASSERT_TRUE(matcher.Matches(""));
41 ASSERT_TRUE(matcher.Matches("A"));
42 ASSERT_TRUE(matcher.Matches("ABCD"));
43 }
44
TEST(GlobUnittest,NoStars)45 TEST(GlobUnittest, NoStars) {
46 GlobMatcher matcher = GlobMatcher::FromPattern("ABC");
47
48 // Matching patterns.
49 ASSERT_TRUE(matcher.Matches("ABC"));
50
51 // Non-matching patterns.
52 ASSERT_FALSE(matcher.Matches("AXBC"));
53 ASSERT_FALSE(matcher.Matches("ABXC"));
54 ASSERT_FALSE(matcher.Matches("ABABABBC"));
55 ASSERT_FALSE(matcher.Matches("AAAAAAABABABBC"));
56 ASSERT_FALSE(matcher.Matches("ABCD"));
57 ASSERT_FALSE(matcher.Matches("ABBBBBB"));
58 ASSERT_FALSE(matcher.Matches("BCA"));
59 }
60
TEST(GlobUnittest,InteriorOnly)61 TEST(GlobUnittest, InteriorOnly) {
62 GlobMatcher matcher = GlobMatcher::FromPattern("A*B*C");
63
64 // Matching patterns.
65 ASSERT_TRUE(matcher.Matches("ABC"));
66 ASSERT_TRUE(matcher.Matches("AXBC"));
67 ASSERT_TRUE(matcher.Matches("ABXC"));
68 ASSERT_TRUE(matcher.Matches("ABABABBC"));
69 ASSERT_TRUE(matcher.Matches("AAAAAAABABABBC"));
70
71 // Non-matching patterns.
72 ASSERT_FALSE(matcher.Matches("ABCD"));
73 ASSERT_FALSE(matcher.Matches("ABBBBBB"));
74 ASSERT_FALSE(matcher.Matches("BCA"));
75 }
76
TEST(GlobUnittest,ComplexInterior)77 TEST(GlobUnittest, ComplexInterior) {
78 GlobMatcher matcher = GlobMatcher::FromPattern("AB*CAB");
79
80 // Matching patterns.
81 ASSERT_TRUE(matcher.Matches("ABCAB"));
82 ASSERT_TRUE(matcher.Matches("ABCCAB"));
83 ASSERT_TRUE(matcher.Matches("ABCABCAB"));
84 ASSERT_TRUE(matcher.Matches("ABCABCABCABABABCAB"));
85 ASSERT_TRUE(matcher.Matches("ABXCAB"));
86
87 // Non-matching patterns.
88 ASSERT_FALSE(matcher.Matches("ABXCABCABCA"));
89 ASSERT_FALSE(matcher.Matches("ABXCABCABAB"));
90 ASSERT_FALSE(matcher.Matches("ABXCABCABCB"));
91 }
92
TEST(GlobUnittest,LeadingAndTrailing)93 TEST(GlobUnittest, LeadingAndTrailing) {
94 GlobMatcher matcher = GlobMatcher::FromPattern("*BC*");
95
96 // Matching patterns.
97 ASSERT_TRUE(matcher.Matches("ABC"));
98 ASSERT_TRUE(matcher.Matches("ABABABBC"));
99 ASSERT_TRUE(matcher.Matches("AAAAAAABABABBC"));
100 ASSERT_TRUE(matcher.Matches("ABCD"));
101 ASSERT_TRUE(matcher.Matches("BCA"));
102 ASSERT_TRUE(matcher.Matches("AXBC"));
103
104 // Non-matching patterns.
105 ASSERT_FALSE(matcher.Matches("ABXC"));
106 ASSERT_FALSE(matcher.Matches("ABBBBBB"));
107 }
108
TEST(GlobUnittest,Leading)109 TEST(GlobUnittest, Leading) {
110 GlobMatcher matcher = GlobMatcher::FromPattern("*BC");
111
112 // Matching patterns.
113 ASSERT_TRUE(matcher.Matches("ABC"));
114 ASSERT_TRUE(matcher.Matches("AAAAAAABABABBC"));
115 ASSERT_TRUE(matcher.Matches("ABABABBC"));
116 ASSERT_TRUE(matcher.Matches("AXBC"));
117
118 // Non-matching patterns.
119 ASSERT_FALSE(matcher.Matches("ABXC"));
120 ASSERT_FALSE(matcher.Matches("ABCD"));
121 ASSERT_FALSE(matcher.Matches("ABBBBBB"));
122 ASSERT_FALSE(matcher.Matches("BCA"));
123 }
124
TEST(GlobUnittest,Trailing)125 TEST(GlobUnittest, Trailing) {
126 GlobMatcher matcher = GlobMatcher::FromPattern("AB*");
127
128 // Matching patterns.
129 ASSERT_TRUE(matcher.Matches("ABC"));
130 ASSERT_TRUE(matcher.Matches("ABXC"));
131 ASSERT_TRUE(matcher.Matches("ABABABBC"));
132 ASSERT_TRUE(matcher.Matches("ABCD"));
133 ASSERT_TRUE(matcher.Matches("ABBBBBB"));
134
135 // Non-matching patterns.
136 ASSERT_FALSE(matcher.Matches("AAAAAAABABABBC"));
137 ASSERT_FALSE(matcher.Matches("AXBC"));
138 ASSERT_FALSE(matcher.Matches("BCA"));
139 }
140
TEST(GlobUnittest,QuestionMarks)141 TEST(GlobUnittest, QuestionMarks) {
142 GlobMatcher matcher = GlobMatcher::FromPattern("AB?*CAB");
143
144 // Matching patterns.
145 ASSERT_TRUE(matcher.Matches("ABCCAB"));
146 ASSERT_TRUE(matcher.Matches("ABDCAB"));
147 ASSERT_TRUE(matcher.Matches("ABCABDDDDDCAB"));
148 ASSERT_TRUE(matcher.Matches("ABXCABCAB"));
149 ASSERT_TRUE(matcher.Matches("ABXCABCABCABABABCAB"));
150 ASSERT_TRUE(matcher.Matches("ABCAB"));
151
152 // Non-matching patterns.
153 ASSERT_FALSE(matcher.Matches("ABXCA"));
154 ASSERT_FALSE(matcher.Matches("ABXCABCABCA"));
155 }
156
TEST(GlobUnittest,CharacterClassRange)157 TEST(GlobUnittest, CharacterClassRange) {
158 GlobMatcher matcher = GlobMatcher::FromPattern("AB[a-zA-Z]CAB");
159
160 // Matching patterns.
161 ASSERT_TRUE(matcher.Matches("ABaCAB"));
162 ASSERT_TRUE(matcher.Matches("ABcCAB"));
163 ASSERT_TRUE(matcher.Matches("ABzCAB"));
164 ASSERT_TRUE(matcher.Matches("ABACAB"));
165 ASSERT_TRUE(matcher.Matches("ABDCAB"));
166 ASSERT_TRUE(matcher.Matches("ABZCAB"));
167
168 // Non-matching patterns.
169 ASSERT_FALSE(matcher.Matches("AB1CAB"));
170 ASSERT_FALSE(matcher.Matches("ABaaCAB"));
171 ASSERT_FALSE(matcher.Matches("ABaACAB"));
172 ASSERT_FALSE(matcher.Matches("AB-CAB"));
173 }
174
TEST(GlobUnittest,CharacterClassNormal)175 TEST(GlobUnittest, CharacterClassNormal) {
176 GlobMatcher matcher = GlobMatcher::FromPattern("AB[abcAZe]CAB");
177
178 // Matching patterns.
179 ASSERT_TRUE(matcher.Matches("ABaCAB"));
180 ASSERT_TRUE(matcher.Matches("ABcCAB"));
181 ASSERT_TRUE(matcher.Matches("ABACAB"));
182 ASSERT_TRUE(matcher.Matches("ABZCAB"));
183 ASSERT_TRUE(matcher.Matches("ABeCAB"));
184
185 // Non-matching patterns.
186 ASSERT_FALSE(matcher.Matches("ABBCAB"));
187 ASSERT_FALSE(matcher.Matches("ABCCAB"));
188 ASSERT_FALSE(matcher.Matches("ABCABaCAB"));
189 }
190
TEST(GlobUnittest,CharacterClassMultiple)191 TEST(GlobUnittest, CharacterClassMultiple) {
192 GlobMatcher matcher = GlobMatcher::FromPattern("*[rR][eE][nN]*");
193
194 // Matching patterns.
195 ASSERT_TRUE(matcher.Matches("renderScreenImplLock"));
196
197 // Non-matching patterns.
198 ASSERT_FALSE(matcher.Matches("updateVrFlinger"));
199 ASSERT_FALSE(matcher.Matches("waitForever"));
200 }
201
TEST(GlobUnittest,CharacterClassMixed)202 TEST(GlobUnittest, CharacterClassMixed) {
203 GlobMatcher matcher = GlobMatcher::FromPattern("AB[abcf-zA-DEFG-Z]CAB");
204
205 // Matching patterns.
206 ASSERT_TRUE(matcher.Matches("ABaCAB"));
207 ASSERT_TRUE(matcher.Matches("ABbCAB"));
208 ASSERT_TRUE(matcher.Matches("ABhCAB"));
209 ASSERT_TRUE(matcher.Matches("ABACAB"));
210 ASSERT_TRUE(matcher.Matches("ABHCAB"));
211 ASSERT_TRUE(matcher.Matches("ABZCAB"));
212
213 // Non-matching patterns.
214 ASSERT_FALSE(matcher.Matches("ABeCAB"));
215 }
216
TEST(GlobUnittest,CharacterClassInvert)217 TEST(GlobUnittest, CharacterClassInvert) {
218 GlobMatcher matcher = GlobMatcher::FromPattern("AB[^a-zA]CAB");
219
220 // Matching patterns.
221 ASSERT_TRUE(matcher.Matches("ABHCAB"));
222 ASSERT_TRUE(matcher.Matches("ABZCAB"));
223
224 // Non-matching patterns.
225 ASSERT_FALSE(matcher.Matches("ABhCAB"));
226 ASSERT_FALSE(matcher.Matches("ABaCAB"));
227 ASSERT_FALSE(matcher.Matches("ABbCAB"));
228 ASSERT_FALSE(matcher.Matches("ABACAB"));
229 }
230
TEST(GlobUnittest,CharacterClassNestedDash)231 TEST(GlobUnittest, CharacterClassNestedDash) {
232 GlobMatcher matcher = GlobMatcher::FromPattern("AB[-]CAB");
233
234 // Matching patterns.
235 ASSERT_TRUE(matcher.Matches("AB-CAB"));
236
237 // Non-matching patterns.
238 ASSERT_FALSE(matcher.Matches("AB]CAB"));
239 }
240
TEST(GlobUnittest,CharacterClassNestedOpenSquare)241 TEST(GlobUnittest, CharacterClassNestedOpenSquare) {
242 GlobMatcher matcher = GlobMatcher::FromPattern("AB[[]CAB");
243
244 // Matching patterns.
245 ASSERT_TRUE(matcher.Matches("AB[CAB"));
246
247 // Non-matching patterns.
248 ASSERT_FALSE(matcher.Matches("AB]CAB"));
249 }
250
TEST(GlobUnittest,CharacterClassNestedClosedSquare)251 TEST(GlobUnittest, CharacterClassNestedClosedSquare) {
252 GlobMatcher matcher = GlobMatcher::FromPattern("AB[]]CAB");
253
254 // Matching patterns.
255 ASSERT_TRUE(matcher.Matches("AB]CAB"));
256
257 // Non-matching patterns.
258 ASSERT_FALSE(matcher.Matches("AB[CAB"));
259 }
260
TEST(GlobUnittest,Complex)261 TEST(GlobUnittest, Complex) {
262 GlobMatcher matcher = GlobMatcher::FromPattern("AB*[C-D]?*F*CAB");
263
264 // Matching patterns.
265 ASSERT_TRUE(matcher.Matches("ABDDDDDDCIFJKNFCAB"));
266
267 // Non-matching patterns.
268 ASSERT_FALSE(matcher.Matches("ABDDDDDDCIFJKNFAB"));
269 }
270
271 } // namespace
272 } // namespace perfetto::trace_processor::util
273