diff options
Diffstat (limited to 'grpc/test/core/security/matchers_test.cc')
-rw-r--r-- | grpc/test/core/security/matchers_test.cc | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/grpc/test/core/security/matchers_test.cc b/grpc/test/core/security/matchers_test.cc new file mode 100644 index 00000000..0bacd167 --- /dev/null +++ b/grpc/test/core/security/matchers_test.cc @@ -0,0 +1,218 @@ +// Copyright 2021 gRPC authors. +// +// 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/core/lib/matchers/matchers.h" + +#include <gtest/gtest.h> + +namespace grpc_core { + +TEST(StringMatcherTest, ExactMatchCaseSensitive) { + auto string_matcher = + StringMatcher::Create(StringMatcher::Type::kExact, + /*matcher=*/"exact", /*case_sensitive=*/true); + ASSERT_TRUE(string_matcher.ok()); + EXPECT_TRUE(string_matcher->Match("exact")); + EXPECT_FALSE(string_matcher->Match("Exact")); + EXPECT_FALSE(string_matcher->Match("exacz")); +} + +TEST(StringMatcherTest, ExactMatchCaseInsensitive) { + auto string_matcher = + StringMatcher::Create(StringMatcher::Type::kExact, + /*matcher=*/"exact", /*case_sensitive=*/false); + ASSERT_TRUE(string_matcher.ok()); + EXPECT_TRUE(string_matcher->Match("Exact")); + EXPECT_FALSE(string_matcher->Match("Exacz")); +} + +TEST(StringMatcherTest, PrefixMatchCaseSensitive) { + auto string_matcher = StringMatcher::Create(StringMatcher::Type::kPrefix, + /*matcher=*/"prefix", + /*case_sensitive=*/true); + ASSERT_TRUE(string_matcher.ok()); + EXPECT_TRUE(string_matcher->Match("prefix-test")); + EXPECT_FALSE(string_matcher->Match("xx-prefix-test")); + EXPECT_FALSE(string_matcher->Match("Prefix-test")); + EXPECT_FALSE(string_matcher->Match("pre-test")); +} + +TEST(StringMatcherTest, PrefixMatchCaseInsensitive) { + auto string_matcher = StringMatcher::Create(StringMatcher::Type::kPrefix, + /*matcher=*/"prefix", + /*case_sensitive=*/false); + ASSERT_TRUE(string_matcher.ok()); + EXPECT_TRUE(string_matcher->Match("PREfix-test")); + EXPECT_FALSE(string_matcher->Match("xx-PREfix-test")); + EXPECT_FALSE(string_matcher->Match("PRE-test")); +} + +TEST(StringMatcherTest, SuffixMatchCaseSensitive) { + auto string_matcher = StringMatcher::Create(StringMatcher::Type::kSuffix, + /*matcher=*/"suffix", + /*case_sensitive=*/true); + ASSERT_TRUE(string_matcher.ok()); + EXPECT_TRUE(string_matcher->Match("test-suffix")); + EXPECT_FALSE(string_matcher->Match("test-Suffix")); + EXPECT_FALSE(string_matcher->Match("test-suffix-xx")); + EXPECT_FALSE(string_matcher->Match("test-suffiz")); +} + +TEST(StringMatcherTest, SuffixMatchCaseInSensitive) { + auto string_matcher = StringMatcher::Create(StringMatcher::Type::kSuffix, + /*matcher=*/"suffix", + /*case_sensitive=*/false); + ASSERT_TRUE(string_matcher.ok()); + EXPECT_TRUE(string_matcher->Match("Test-SUFFIX")); + EXPECT_FALSE(string_matcher->Match("Test-SUFFIX-xx")); + EXPECT_FALSE(string_matcher->Match("Test-SUFFIZ")); +} + +TEST(StringMatcherTest, InvalidRegex) { + auto string_matcher = StringMatcher::Create(StringMatcher::Type::kSafeRegex, + /*matcher=*/"a[b-a]", + /*case_sensitive=*/true); + EXPECT_FALSE(string_matcher.ok()); + EXPECT_EQ(string_matcher.status().code(), absl::StatusCode::kInvalidArgument); + EXPECT_EQ(string_matcher.status().message(), + "Invalid regex string specified in matcher."); +} + +TEST(StringMatcherTest, SafeRegexMatchCaseSensitive) { + auto string_matcher = StringMatcher::Create(StringMatcher::Type::kSafeRegex, + /*matcher=*/"regex.*", + /*case_sensitive=*/true); + ASSERT_TRUE(string_matcher.ok()); + EXPECT_TRUE(string_matcher->Match("regex-test")); + EXPECT_FALSE(string_matcher->Match("xx-regex-test")); + EXPECT_FALSE(string_matcher->Match("Regex-test")); + EXPECT_FALSE(string_matcher->Match("test-regex")); +} + +TEST(StringMatcherTest, SafeRegexMatchCaseInSensitive) { + auto string_matcher = StringMatcher::Create(StringMatcher::Type::kSafeRegex, + /*matcher=*/"regex.*", + /*case_sensitive=*/false); + ASSERT_TRUE(string_matcher.ok()); + EXPECT_TRUE(string_matcher->Match("regex-test")); + EXPECT_TRUE(string_matcher->Match("Regex-test")); + EXPECT_FALSE(string_matcher->Match("xx-Regex-test")); + EXPECT_FALSE(string_matcher->Match("test-regex")); +} + +TEST(StringMatcherTest, ContainsMatchCaseSensitive) { + auto string_matcher = StringMatcher::Create(StringMatcher::Type::kContains, + /*matcher=*/"contains", + /*case_sensitive=*/true); + ASSERT_TRUE(string_matcher.ok()); + EXPECT_TRUE(string_matcher->Match("test-contains")); + EXPECT_TRUE(string_matcher->Match("test-contains-test")); + EXPECT_FALSE(string_matcher->Match("test-Contains")); + EXPECT_FALSE(string_matcher->Match("test-containz")); +} + +TEST(StringMatcherTest, ContainsMatchCaseInSensitive) { + auto string_matcher = StringMatcher::Create(StringMatcher::Type::kContains, + /*matcher=*/"contains", + /*case_sensitive=*/false); + ASSERT_TRUE(string_matcher.ok()); + EXPECT_TRUE(string_matcher->Match("Test-Contains")); + EXPECT_TRUE(string_matcher->Match("Test-Contains-Test")); + EXPECT_FALSE(string_matcher->Match("Test-Containz")); +} + +TEST(HeaderMatcherTest, StringMatcher) { + auto header_matcher = + HeaderMatcher::Create(/*name=*/"key", HeaderMatcher::Type::kExact, + /*matcher=*/"exact"); + ASSERT_TRUE(header_matcher.ok()); + EXPECT_TRUE(header_matcher->Match("exact")); + EXPECT_FALSE(header_matcher->Match("Exact")); + EXPECT_FALSE(header_matcher->Match("exacz")); +} + +TEST(HeaderMatcherTest, StringMatcherWithInvertMatch) { + auto header_matcher = + HeaderMatcher::Create(/*name=*/"key", HeaderMatcher::Type::kExact, + /*matcher=*/"exact", + /*range_start=*/0, /*range_end=*/0, + /*present_match=*/false, /*invert_match=*/true); + ASSERT_TRUE(header_matcher.ok()); + EXPECT_FALSE(header_matcher->Match("exact")); + EXPECT_TRUE(header_matcher->Match("Exact")); + EXPECT_TRUE(header_matcher->Match("exacz")); +} + +TEST(HeaderMatcherTest, InvalidRegex) { + auto header_matcher = + HeaderMatcher::Create(/*name=*/"key", HeaderMatcher::Type::kSafeRegex, + /*matcher=*/"a[b-a]", + /*range_start=*/0, /*range_end=*/0, + /*present_match=*/false, /*invert_match=*/true); + EXPECT_FALSE(header_matcher.ok()); + EXPECT_EQ(header_matcher.status().code(), absl::StatusCode::kInvalidArgument); + EXPECT_EQ(header_matcher.status().message(), + "Invalid regex string specified in matcher."); +} + +TEST(HeaderMatcherTest, RangeMatcherValidRange) { + auto header_matcher = + HeaderMatcher::Create(/*name=*/"key", HeaderMatcher::Type::kRange, + /*matcher=*/"", /*range_start=*/10, + /*range_end*/ 20); + ASSERT_TRUE(header_matcher.ok()); + EXPECT_TRUE(header_matcher->Match("16")); + EXPECT_TRUE(header_matcher->Match("10")); + EXPECT_FALSE(header_matcher->Match("3")); + EXPECT_FALSE(header_matcher->Match("20")); +} + +TEST(HeaderMatcherTest, RangeMatcherInvalidRange) { + auto header_matcher = + HeaderMatcher::Create(/*name=*/"key", HeaderMatcher::Type::kRange, + /*matcher=*/"", /*range_start=*/20, + /*range_end*/ 10); + EXPECT_FALSE(header_matcher.ok()); + EXPECT_EQ(header_matcher.status().code(), absl::StatusCode::kInvalidArgument); + EXPECT_EQ( + header_matcher.status().message(), + "Invalid range specifier specified: end cannot be smaller than start."); +} + +TEST(HeaderMatcherTest, PresentMatcherTrue) { + auto header_matcher = + HeaderMatcher::Create(/*name=*/"key", HeaderMatcher::Type::kPresent, + /*matcher=*/"", /*range_start=*/0, + /*range_end=*/0, /*present_match=*/true); + ASSERT_TRUE(header_matcher.ok()); + EXPECT_TRUE(header_matcher->Match("any_value")); + EXPECT_FALSE(header_matcher->Match(absl::nullopt)); +} + +TEST(HeaderMatcherTest, PresentMatcherFalse) { + auto header_matcher = + HeaderMatcher::Create(/*name=*/"key", HeaderMatcher::Type::kPresent, + /*matcher=*/"", /*range_start=*/0, + /*range_end=*/0, /*present_match=*/false); + ASSERT_TRUE(header_matcher.ok()); + EXPECT_FALSE(header_matcher->Match("any_value")); + EXPECT_TRUE(header_matcher->Match(absl::nullopt)); +} + +} // namespace grpc_core + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} |