• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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