blob: 7682c248146026caafd32f807a1580b000a9a467 [file] [log] [blame]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "src/trace_processor/util/glob.h"
#include "test/gtest_and_gmock.h"
namespace perfetto {
namespace trace_processor {
namespace util {
namespace {
TEST(GlobUnittest, EmptyPattern) {
GlobMatcher matcher = GlobMatcher::FromPattern("");
// Matching patterns.
ASSERT_TRUE(matcher.Matches(""));
// Non-matching patterns.
ASSERT_FALSE(matcher.Matches("A"));
ASSERT_FALSE(matcher.Matches("AXBC"));
ASSERT_FALSE(matcher.Matches("ABXC"));
}
TEST(GlobUnittest, JustStar) {
GlobMatcher matcher = GlobMatcher::FromPattern("*");
// Matching patterns.
ASSERT_TRUE(matcher.Matches(""));
ASSERT_TRUE(matcher.Matches("A"));
ASSERT_TRUE(matcher.Matches("ABCD"));
}
TEST(GlobUnittest, NoStars) {
GlobMatcher matcher = GlobMatcher::FromPattern("ABC");
// Matching patterns.
ASSERT_TRUE(matcher.Matches("ABC"));
// Non-matching patterns.
ASSERT_FALSE(matcher.Matches("AXBC"));
ASSERT_FALSE(matcher.Matches("ABXC"));
ASSERT_FALSE(matcher.Matches("ABABABBC"));
ASSERT_FALSE(matcher.Matches("AAAAAAABABABBC"));
ASSERT_FALSE(matcher.Matches("ABCD"));
ASSERT_FALSE(matcher.Matches("ABBBBBB"));
ASSERT_FALSE(matcher.Matches("BCA"));
}
TEST(GlobUnittest, InteriorOnly) {
GlobMatcher matcher = GlobMatcher::FromPattern("A*B*C");
// Matching patterns.
ASSERT_TRUE(matcher.Matches("ABC"));
ASSERT_TRUE(matcher.Matches("AXBC"));
ASSERT_TRUE(matcher.Matches("ABXC"));
ASSERT_TRUE(matcher.Matches("ABABABBC"));
ASSERT_TRUE(matcher.Matches("AAAAAAABABABBC"));
// Non-matching patterns.
ASSERT_FALSE(matcher.Matches("ABCD"));
ASSERT_FALSE(matcher.Matches("ABBBBBB"));
ASSERT_FALSE(matcher.Matches("BCA"));
}
TEST(GlobUnittest, ComplexInterior) {
GlobMatcher matcher = GlobMatcher::FromPattern("AB*CAB");
// Matching patterns.
ASSERT_TRUE(matcher.Matches("ABCAB"));
ASSERT_TRUE(matcher.Matches("ABCCAB"));
ASSERT_TRUE(matcher.Matches("ABCABCAB"));
ASSERT_TRUE(matcher.Matches("ABCABCABCABABABCAB"));
ASSERT_TRUE(matcher.Matches("ABXCAB"));
// Non-matching patterns.
ASSERT_FALSE(matcher.Matches("ABXCABCABCA"));
ASSERT_FALSE(matcher.Matches("ABXCABCABAB"));
ASSERT_FALSE(matcher.Matches("ABXCABCABCB"));
}
TEST(GlobUnittest, LeadingAndTrailing) {
GlobMatcher matcher = GlobMatcher::FromPattern("*BC*");
// Matching patterns.
ASSERT_TRUE(matcher.Matches("ABC"));
ASSERT_TRUE(matcher.Matches("ABABABBC"));
ASSERT_TRUE(matcher.Matches("AAAAAAABABABBC"));
ASSERT_TRUE(matcher.Matches("ABCD"));
ASSERT_TRUE(matcher.Matches("BCA"));
ASSERT_TRUE(matcher.Matches("AXBC"));
// Non-matching patterns.
ASSERT_FALSE(matcher.Matches("ABXC"));
ASSERT_FALSE(matcher.Matches("ABBBBBB"));
}
TEST(GlobUnittest, Leading) {
GlobMatcher matcher = GlobMatcher::FromPattern("*BC");
// Matching patterns.
ASSERT_TRUE(matcher.Matches("ABC"));
ASSERT_TRUE(matcher.Matches("AAAAAAABABABBC"));
ASSERT_TRUE(matcher.Matches("ABABABBC"));
ASSERT_TRUE(matcher.Matches("AXBC"));
// Non-matching patterns.
ASSERT_FALSE(matcher.Matches("ABXC"));
ASSERT_FALSE(matcher.Matches("ABCD"));
ASSERT_FALSE(matcher.Matches("ABBBBBB"));
ASSERT_FALSE(matcher.Matches("BCA"));
}
TEST(GlobUnittest, Trailing) {
GlobMatcher matcher = GlobMatcher::FromPattern("AB*");
// Matching patterns.
ASSERT_TRUE(matcher.Matches("ABC"));
ASSERT_TRUE(matcher.Matches("ABXC"));
ASSERT_TRUE(matcher.Matches("ABABABBC"));
ASSERT_TRUE(matcher.Matches("ABCD"));
ASSERT_TRUE(matcher.Matches("ABBBBBB"));
// Non-matching patterns.
ASSERT_FALSE(matcher.Matches("AAAAAAABABABBC"));
ASSERT_FALSE(matcher.Matches("AXBC"));
ASSERT_FALSE(matcher.Matches("BCA"));
}
TEST(GlobUnittest, QuestionMarks) {
GlobMatcher matcher = GlobMatcher::FromPattern("AB?*CAB");
// Matching patterns.
ASSERT_TRUE(matcher.Matches("ABCCAB"));
ASSERT_TRUE(matcher.Matches("ABDCAB"));
ASSERT_TRUE(matcher.Matches("ABCABDDDDDCAB"));
ASSERT_TRUE(matcher.Matches("ABXCABCAB"));
ASSERT_TRUE(matcher.Matches("ABXCABCABCABABABCAB"));
ASSERT_TRUE(matcher.Matches("ABCAB"));
// Non-matching patterns.
ASSERT_FALSE(matcher.Matches("ABXCA"));
ASSERT_FALSE(matcher.Matches("ABXCABCABCA"));
}
TEST(GlobUnittest, CharacterClassRange) {
GlobMatcher matcher = GlobMatcher::FromPattern("AB[a-zA-Z]CAB");
// Matching patterns.
ASSERT_TRUE(matcher.Matches("ABaCAB"));
ASSERT_TRUE(matcher.Matches("ABcCAB"));
ASSERT_TRUE(matcher.Matches("ABzCAB"));
ASSERT_TRUE(matcher.Matches("ABACAB"));
ASSERT_TRUE(matcher.Matches("ABDCAB"));
ASSERT_TRUE(matcher.Matches("ABZCAB"));
// Non-matching patterns.
ASSERT_FALSE(matcher.Matches("AB1CAB"));
ASSERT_FALSE(matcher.Matches("ABaaCAB"));
ASSERT_FALSE(matcher.Matches("ABaACAB"));
ASSERT_FALSE(matcher.Matches("AB-CAB"));
}
TEST(GlobUnittest, CharacterClassNormal) {
GlobMatcher matcher = GlobMatcher::FromPattern("AB[abcAZe]CAB");
// Matching patterns.
ASSERT_TRUE(matcher.Matches("ABaCAB"));
ASSERT_TRUE(matcher.Matches("ABcCAB"));
ASSERT_TRUE(matcher.Matches("ABACAB"));
ASSERT_TRUE(matcher.Matches("ABZCAB"));
ASSERT_TRUE(matcher.Matches("ABeCAB"));
// Non-matching patterns.
ASSERT_FALSE(matcher.Matches("ABBCAB"));
ASSERT_FALSE(matcher.Matches("ABCCAB"));
ASSERT_FALSE(matcher.Matches("ABCABaCAB"));
}
TEST(GlobUnittest, CharacterClassMultiple) {
GlobMatcher matcher = GlobMatcher::FromPattern("*[rR][eE][nN]*");
// Matching patterns.
ASSERT_TRUE(matcher.Matches("renderScreenImplLock"));
// Non-matching patterns.
ASSERT_FALSE(matcher.Matches("updateVrFlinger"));
ASSERT_FALSE(matcher.Matches("waitForever"));
}
TEST(GlobUnittest, CharacterClassMixed) {
GlobMatcher matcher = GlobMatcher::FromPattern("AB[abcf-zA-DEFG-Z]CAB");
// Matching patterns.
ASSERT_TRUE(matcher.Matches("ABaCAB"));
ASSERT_TRUE(matcher.Matches("ABbCAB"));
ASSERT_TRUE(matcher.Matches("ABhCAB"));
ASSERT_TRUE(matcher.Matches("ABACAB"));
ASSERT_TRUE(matcher.Matches("ABHCAB"));
ASSERT_TRUE(matcher.Matches("ABZCAB"));
// Non-matching patterns.
ASSERT_FALSE(matcher.Matches("ABeCAB"));
}
TEST(GlobUnittest, CharacterClassInvert) {
GlobMatcher matcher = GlobMatcher::FromPattern("AB[^a-zA]CAB");
// Matching patterns.
ASSERT_TRUE(matcher.Matches("ABHCAB"));
ASSERT_TRUE(matcher.Matches("ABZCAB"));
// Non-matching patterns.
ASSERT_FALSE(matcher.Matches("ABhCAB"));
ASSERT_FALSE(matcher.Matches("ABaCAB"));
ASSERT_FALSE(matcher.Matches("ABbCAB"));
ASSERT_FALSE(matcher.Matches("ABACAB"));
}
TEST(GlobUnittest, CharacterClassNestedDash) {
GlobMatcher matcher = GlobMatcher::FromPattern("AB[-]CAB");
// Matching patterns.
ASSERT_TRUE(matcher.Matches("AB-CAB"));
// Non-matching patterns.
ASSERT_FALSE(matcher.Matches("AB]CAB"));
}
TEST(GlobUnittest, CharacterClassNestedOpenSquare) {
GlobMatcher matcher = GlobMatcher::FromPattern("AB[[]CAB");
// Matching patterns.
ASSERT_TRUE(matcher.Matches("AB[CAB"));
// Non-matching patterns.
ASSERT_FALSE(matcher.Matches("AB]CAB"));
}
TEST(GlobUnittest, CharacterClassNestedClosedSquare) {
GlobMatcher matcher = GlobMatcher::FromPattern("AB[]]CAB");
// Matching patterns.
ASSERT_TRUE(matcher.Matches("AB]CAB"));
// Non-matching patterns.
ASSERT_FALSE(matcher.Matches("AB[CAB"));
}
TEST(GlobUnittest, Complex) {
GlobMatcher matcher = GlobMatcher::FromPattern("AB*[C-D]?*F*CAB");
// Matching patterns.
ASSERT_TRUE(matcher.Matches("ABDDDDDDCIFJKNFCAB"));
// Non-matching patterns.
ASSERT_FALSE(matcher.Matches("ABDDDDDDCIFJKNFAB"));
}
} // namespace
} // namespace util
} // namespace trace_processor
} // namespace perfetto