| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "net/base/sdch_dictionary.h" |
| |
| #include <set> |
| #include <string> |
| |
| #include "net/base/sdch_problem_codes.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace net { |
| |
| TEST(SdchDictionaryTest, CanSet) { |
| SdchProblemCode (*CanSet)(const std::string& domain, const std::string& path, |
| const std::set<int>& ports, |
| const GURL& dictionary_url) = |
| SdchDictionary::CanSet; |
| |
| std::set<int> single_port; |
| single_port.insert(1); |
| |
| std::set<int> dual_port; |
| dual_port.insert(2); |
| dual_port.insert(3); |
| |
| // Not testing specific error codes; that's implementation, not behavior. |
| EXPECT_EQ(SDCH_OK, CanSet("www.google.com", "", std::set<int>(), |
| GURL("http://www.google.com/dictionary"))); |
| EXPECT_NE(SDCH_OK, CanSet("", "", std::set<int>(), |
| GURL("http://www.google.com/dictionary"))); |
| EXPECT_NE(SDCH_OK, |
| CanSet("com", "", std::set<int>(), GURL("http://com/dictionary"))); |
| EXPECT_NE(SDCH_OK, CanSet("www.google.com", "", std::set<int>(), |
| GURL("http://www.simple.com/dictionary"))); |
| EXPECT_EQ(SDCH_OK, CanSet(".google.com", "", std::set<int>(), |
| GURL("http://www.google.com/dictionary"))); |
| EXPECT_NE(SDCH_OK, CanSet("google.com", "", std::set<int>(), |
| GURL("http://www.google.com/dictionary"))); |
| EXPECT_EQ(SDCH_OK, CanSet("www.google.com", "", single_port, |
| GURL("http://www.google.com:1/dictionary"))); |
| EXPECT_EQ(SDCH_OK, CanSet("www.google.com", "", dual_port, |
| GURL("http://www.google.com:2/dictionary"))); |
| EXPECT_NE(SDCH_OK, CanSet("www.google.com", "", single_port, |
| GURL("http://www.google.com:10/dictionary"))); |
| EXPECT_NE(SDCH_OK, CanSet("www.google.com", "", dual_port, |
| GURL("http://www.google.com:10/dictionary"))); |
| } |
| |
| TEST(SdchDictionaryTest, CanUse) { |
| std::set<int> dual_port; |
| dual_port.insert(2); |
| dual_port.insert(3); |
| |
| SdchDictionary test_dictionary_1( |
| "xyzzy", 0u, // text, offset |
| "ch", "sh", // client hash, server hash |
| GURL("http://www.example.com"), "www.example.com", |
| "/url", // domain, path |
| base::Time::Now() + base::TimeDelta::FromSeconds(1), // expiration |
| dual_port); // ports |
| |
| // Not testing specific error codes; that's implementation, not behavior. |
| EXPECT_EQ(SDCH_OK, |
| test_dictionary_1.CanUse(GURL("http://www.example.com:2/url"))); |
| EXPECT_NE(SDCH_OK, |
| test_dictionary_1.CanUse(GURL("http://www.google.com:2/url"))); |
| EXPECT_NE(SDCH_OK, |
| test_dictionary_1.CanUse(GURL("http://www.example.com:4/url"))); |
| EXPECT_NE(SDCH_OK, |
| test_dictionary_1.CanUse(GURL("http://www.example.com:2/wurl"))); |
| EXPECT_NE(SDCH_OK, |
| test_dictionary_1.CanUse(GURL("https://www.example.com:2/url"))); |
| EXPECT_NE(SDCH_OK, |
| test_dictionary_1.CanUse(GURL("ws://www.example.com:2/url"))); |
| } |
| |
| TEST(SdchDictionaryTest, PathMatch) { |
| bool (*PathMatch)(const std::string& path, const std::string& restriction) = |
| SdchDictionary::PathMatch; |
| // Perfect match is supported. |
| EXPECT_TRUE(PathMatch("/search", "/search")); |
| EXPECT_TRUE(PathMatch("/search/", "/search/")); |
| |
| // Prefix only works if last character of restriction is a slash, or first |
| // character in path after a match is a slash. Validate each case separately. |
| |
| // Rely on the slash in the path (not at the end of the restriction). |
| EXPECT_TRUE(PathMatch("/search/something", "/search")); |
| EXPECT_TRUE(PathMatch("/search/s", "/search")); |
| EXPECT_TRUE(PathMatch("/search/other", "/search")); |
| EXPECT_TRUE(PathMatch("/search/something", "/search")); |
| |
| // Rely on the slash at the end of the restriction. |
| EXPECT_TRUE(PathMatch("/search/something", "/search/")); |
| EXPECT_TRUE(PathMatch("/search/s", "/search/")); |
| EXPECT_TRUE(PathMatch("/search/other", "/search/")); |
| EXPECT_TRUE(PathMatch("/search/something", "/search/")); |
| |
| // Make sure less that sufficient prefix match is false. |
| EXPECT_FALSE(PathMatch("/sear", "/search")); |
| EXPECT_FALSE(PathMatch("/", "/search")); |
| EXPECT_FALSE(PathMatch(std::string(), "/search")); |
| |
| // Add examples with several levels of direcories in the restriction. |
| EXPECT_FALSE(PathMatch("/search/something", "search/s")); |
| EXPECT_FALSE(PathMatch("/search/", "/search/s")); |
| |
| // Make sure adding characters to path will also fail. |
| EXPECT_FALSE(PathMatch("/searching", "/search/")); |
| EXPECT_FALSE(PathMatch("/searching", "/search")); |
| |
| // Make sure we're case sensitive. |
| EXPECT_FALSE(PathMatch("/ABC", "/abc")); |
| EXPECT_FALSE(PathMatch("/abc", "/ABC")); |
| } |
| |
| TEST(SdchDictionaryTest, Expired) { |
| EXPECT_TRUE( |
| SdchDictionary("xyzzy", 0u, "ch", "sh", GURL("http://www.example.com"), |
| "www.example.com", "/url", |
| base::Time::Now() - base::TimeDelta::FromSeconds(1), |
| std::set<int>()).Expired()); |
| EXPECT_FALSE( |
| SdchDictionary("xyzzy", 0u, "ch", "sh", GURL("http://www.example.com"), |
| "www.example.com", "/url", |
| base::Time::Now() + base::TimeDelta::FromSeconds(1), |
| std::set<int>()).Expired()); |
| } |
| |
| } // namespace net |