Use case-sensitive regular expressions in --no-compress-regex
On some windows versions (plus wine) std::regex has issues with the
icase flag (making regex case insensitive). Put the responsibility of
the case sensitivity on the caller.
Fixes: 127793905
Test: wine aapt2_tests.exe -> Util_test
Change-Id: I6775514d3ef43c2c47465bf39ceaf2c195909724
diff --git a/tools/aapt2/cmd/Link.h b/tools/aapt2/cmd/Link.h
index 56bff8f..aea2432 100644
--- a/tools/aapt2/cmd/Link.h
+++ b/tools/aapt2/cmd/Link.h
@@ -264,8 +264,8 @@
&options_.keep_raw_values);
AddOptionalFlag("--no-compress-regex",
"Do not compress extensions matching the regular expression. Remember to\n"
- " use the '$' symbol for end of line. Uses a non case-sensitive\n"
- " ECMAScript regular expression grammar.",
+ "use the '$' symbol for end of line. Uses a case-sensitive ECMAScript"
+ "regular expression grammar.",
&no_compress_regex);
AddOptionalSwitch("--warn-manifest-validation",
"Treat manifest validation errors as warnings.",
diff --git a/tools/aapt2/cmd/Util.cpp b/tools/aapt2/cmd/Util.cpp
index e2c65ba7..7214f1a 100644
--- a/tools/aapt2/cmd/Util.cpp
+++ b/tools/aapt2/cmd/Util.cpp
@@ -436,9 +436,9 @@
}
std::regex GetRegularExpression(const std::string &input) {
- // Standard ECMAScript grammar plus case insensitive.
+ // Standard ECMAScript grammar.
std::regex case_insensitive(
- input, std::regex_constants::icase | std::regex_constants::ECMAScript);
+ input, std::regex_constants::ECMAScript);
return case_insensitive;
}
diff --git a/tools/aapt2/cmd/Util_test.cpp b/tools/aapt2/cmd/Util_test.cpp
index 2f090bb..ac1f981 100644
--- a/tools/aapt2/cmd/Util_test.cpp
+++ b/tools/aapt2/cmd/Util_test.cpp
@@ -383,13 +383,32 @@
EXPECT_NE(*adjusted_contraints[1].configs.begin(), ConfigDescription::DefaultConfig());
}
-// TODO(127793905): Enable test
-/*TEST(UtilTest, RegularExperssions) {
+TEST (UtilTest, RegularExperssionsSimple) {
std::string valid(".bc$");
std::regex expression = GetRegularExpression(valid);
EXPECT_TRUE(std::regex_search("file.abc", expression));
EXPECT_TRUE(std::regex_search("file.123bc", expression));
EXPECT_FALSE(std::regex_search("abc.zip", expression));
-}*/
+}
+
+TEST (UtilTest, RegularExpressionComplex) {
+ std::string valid("\\.(d|D)(e|E)(x|X)$");
+ std::regex expression = GetRegularExpression(valid);
+ EXPECT_TRUE(std::regex_search("file.dex", expression));
+ EXPECT_TRUE(std::regex_search("file.DEX", expression));
+ EXPECT_TRUE(std::regex_search("file.dEx", expression));
+ EXPECT_FALSE(std::regex_search("file.dexx", expression));
+ EXPECT_FALSE(std::regex_search("dex.file", expression));
+ EXPECT_FALSE(std::regex_search("file.adex", expression));
+}
+
+TEST (UtilTest, RegularExpressionNonEnglish) {
+ std::string valid("\\.(k|K)(o|O)(ń|Ń)(c|C)(ó|Ó)(w|W)(k|K)(a|A)$");
+ std::regex expression = GetRegularExpression(valid);
+ EXPECT_TRUE(std::regex_search("file.końcówka", expression));
+ EXPECT_TRUE(std::regex_search("file.KOŃCÓWKA", expression));
+ EXPECT_TRUE(std::regex_search("file.kOńcÓwkA", expression));
+ EXPECT_FALSE(std::regex_search("file.koncowka", expression));
+}
} // namespace aapt