blob: da6650b8ab32108495527eb8e200aa2df49593b6 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/signin/pattern_account_restriction.h"
#import "base/values.h"
#import "testing/gtest_mac.h"
#import "testing/platform_test.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace {
const std::string email1 = "foo@gmail.com";
const std::string email2 = "foo2@google.com";
const std::string email3 = "foo3@chromium.com";
} // namespace
class PatternAccountRestrictionTest : public PlatformTest {};
// Tests that the PatternAccountRestriction filters email correctly when
// restrictions are set.
TEST_F(PatternAccountRestrictionTest, FilterEmailsWithRestrictions) {
base::Value::List list;
list.Append("*gmail.com");
list.Append("*google.com");
auto restriction = PatternAccountRestrictionFromValue(list);
EXPECT_EQ(restriction->IsAccountRestricted(email1), false);
EXPECT_EQ(restriction->IsAccountRestricted(email2), false);
EXPECT_EQ(restriction->IsAccountRestricted(email3), true);
}
// Tests that the PatternAccountRestriction does not filter emails when
// restrictions are not set.
TEST_F(PatternAccountRestrictionTest, FilterEmailsWithoutRestriction) {
base::Value::List list;
auto restriction = PatternAccountRestrictionFromValue(list);
EXPECT_EQ(restriction->IsAccountRestricted(email1), false);
EXPECT_EQ(restriction->IsAccountRestricted(email2), false);
EXPECT_EQ(restriction->IsAccountRestricted(email3), false);
}
// Tests that the PatternAccountRestriction does not filter emails when the
// restriction is not correctly formatted.
TEST_F(PatternAccountRestrictionTest, FilterEmailsWithBadPattern) {
base::Value::List list;
list.Append("*gmail.com\\");
list.Append("*google.com");
auto restriction = PatternAccountRestrictionFromValue(list);
EXPECT_EQ(restriction->IsAccountRestricted(email1), true);
EXPECT_EQ(restriction->IsAccountRestricted(email2), false);
EXPECT_EQ(restriction->IsAccountRestricted(email3), true);
}
// Tests that the pattern created by PatternFromString(chunk) correctlty matches
// the given email. The wildcard character '*' matches zero or more arbitrary
// characters.The escape character is '\', so to match actual '*' or '\'
// characters, put a '\' in front of them.
TEST_F(PatternAccountRestrictionTest, PatternMatchChunck) {
auto pattern = PatternFromString("*gmail.com");
EXPECT_EQ(pattern->Match(email1), true);
EXPECT_EQ(pattern->Match(email2), false);
EXPECT_EQ(pattern->Match(email3), false);
pattern = PatternFromString("gmail.com");
EXPECT_EQ(pattern->Match(email1), false);
EXPECT_EQ(pattern->Match(email2), false);
EXPECT_EQ(pattern->Match(email3), false);
pattern = PatternFromString("foo*");
EXPECT_EQ(pattern->Match(email1), true);
EXPECT_EQ(pattern->Match(email2), true);
EXPECT_EQ(pattern->Match(email3), true);
// "foo\\*@gmail.com" is actually "foo\*@gmail.com". The escape character '\'
// is doubled here because it's also an escape character for std::string.
pattern = PatternFromString("foo\\*@gmail.com");
EXPECT_EQ(pattern->Match(email1), false);
EXPECT_EQ(pattern->Match("foo*@gmail.com"), true);
// "foo\\\\*" is "actually foo\\*".
pattern = PatternFromString("foo\\\\*");
EXPECT_EQ(pattern->Match(email1), false);
// "foo\\@gmail.com" is actually "foo\@gmail.com".
EXPECT_EQ(pattern->Match("foo\\@gmail.com"), true);
}
// Tests that valid patterns are correctly identified.
TEST_F(PatternAccountRestrictionTest, ValidPattern) {
base::Value value{base::Value::Type::LIST};
value.GetList().Append("*gmail.com");
value.GetList().Append("myemail@gmail.com");
value.GetList().Append("myemail\\*@gmail.com");
value.GetList().Append("\\\\google.com");
EXPECT_TRUE(ArePatternsValid(&value));
}
// Tests that invalid patterns are correctly identified.
TEST_F(PatternAccountRestrictionTest, InvalidPattern) {
base::Value value{base::Value::Type::LIST};
value.GetList().Append("*gmail.com\\");
value.GetList().Append("*google.com");
EXPECT_FALSE(ArePatternsValid(&value));
}
// Tests that empty patterns are correctly identified.
TEST_F(PatternAccountRestrictionTest, EmptyPattern) {
base::Value value{base::Value::Type::LIST};
EXPECT_TRUE(ArePatternsValid(&value));
}