|  | // 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 |