| Index: net/filter/sdch_filter_unittest.cc
|
| diff --git a/net/filter/sdch_filter_unittest.cc b/net/filter/sdch_filter_unittest.cc
|
| index 2263001a77a579f09bbb15d417d93da7ddadb8d0..df18ad37078e8d4168fb3cb94995de8d8acd9f87 100644
|
| --- a/net/filter/sdch_filter_unittest.cc
|
| +++ b/net/filter/sdch_filter_unittest.cc
|
| @@ -63,22 +63,36 @@ class SdchFilterTest : public testing::Test {
|
| url_request_context->set_sdch_manager(sdch_manager_.get());
|
| }
|
|
|
| - // Attempt to add a dictionary to the manager; returns whether or not
|
| - // the attempt succeeded.
|
| + // Attempt to add a dictionary to the manager and probe for success or
|
| + // failure.
|
| bool AddSdchDictionary(const std::string& dictionary_text,
|
| const GURL& gurl) {
|
| - std::string list;
|
| - sdch_manager_->GetAvailDictionaryList(gurl, &list);
|
| + scoped_ptr<SdchManager::DictionarySet> set1(
|
| + sdch_manager_->GetDictionarySet(gurl));
|
| + std::string set1_hashes;
|
| + if (set1)
|
| + set1->GetDictionaryClientHashList(&set1_hashes);
|
| +
|
| sdch_manager_->AddSdchDictionary(dictionary_text, gurl);
|
| - std::string list2;
|
| - sdch_manager_->GetAvailDictionaryList(gurl, &list2);
|
| + scoped_ptr<SdchManager::DictionarySet> set2(
|
| + sdch_manager_->GetDictionarySet(gurl));
|
| + std::string set2_hashes;
|
| + if (set2)
|
| + set2->GetDictionaryClientHashList(&set2_hashes);
|
|
|
| // The list of hashes should change iff the addition succeeds.
|
| - return (list != list2);
|
| + return (set1_hashes != set2_hashes);
|
| }
|
|
|
| MockFilterContext* filter_context() { return filter_context_.get(); }
|
|
|
| + // Sets both the GURL and the SDCH response for a filter context.
|
| + void SetupFilterContextWithGURL(GURL url) {
|
| + filter_context_->SetURL(url);
|
| + filter_context_->SetSdchResponse(
|
| + sdch_manager_->GetDictionarySet(url).Pass());
|
| + }
|
| +
|
| std::string NewSdchCompressedData(const std::string dictionary) {
|
| std::string client_hash;
|
| std::string server_hash;
|
| @@ -166,6 +180,19 @@ static std::string NewSdchDictionary(const std::string& domain) {
|
| return dictionary;
|
| }
|
|
|
| +static std::string NewSdchExpiredDictionary(const std::string& domain) {
|
| + std::string dictionary;
|
| + if (!domain.empty()) {
|
| + dictionary.append("Domain: ");
|
| + dictionary.append(domain);
|
| + dictionary.append("\n");
|
| + }
|
| + dictionary.append("Max-Age: 0\n");
|
| + dictionary.append("\n");
|
| + dictionary.append(kTestVcdiffDictionary, sizeof(kTestVcdiffDictionary) - 1);
|
| + return dictionary;
|
| +}
|
| +
|
| //------------------------------------------------------------------------------
|
|
|
| TEST_F(SdchFilterTest, EmptyInputOk) {
|
| @@ -457,7 +484,7 @@ TEST_F(SdchFilterTest, BasicDictionary) {
|
| std::vector<Filter::FilterType> filter_types;
|
| filter_types.push_back(Filter::FILTER_TYPE_SDCH);
|
|
|
| - filter_context()->SetURL(url);
|
| + SetupFilterContextWithGURL(url);
|
|
|
| scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
|
|
|
| @@ -494,7 +521,8 @@ TEST_F(SdchFilterTest, NoDecodeHttps) {
|
| std::vector<Filter::FilterType> filter_types;
|
| filter_types.push_back(Filter::FILTER_TYPE_SDCH);
|
|
|
| - filter_context()->SetURL(GURL("https://" + kSampleDomain));
|
| + GURL filter_context_gurl("https://" + kSampleDomain);
|
| + SetupFilterContextWithGURL(GURL("https://" + kSampleDomain));
|
| scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
|
|
|
| const size_t feed_block_size(100);
|
| @@ -524,7 +552,7 @@ TEST_F(SdchFilterTest, NoDecodeFtp) {
|
| std::vector<Filter::FilterType> filter_types;
|
| filter_types.push_back(Filter::FILTER_TYPE_SDCH);
|
|
|
| - filter_context()->SetURL(GURL("ftp://" + kSampleDomain));
|
| + SetupFilterContextWithGURL(GURL("ftp://" + kSampleDomain));
|
| scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
|
|
|
| const size_t feed_block_size(100);
|
| @@ -550,7 +578,7 @@ TEST_F(SdchFilterTest, NoDecodeFileColon) {
|
| std::vector<Filter::FilterType> filter_types;
|
| filter_types.push_back(Filter::FILTER_TYPE_SDCH);
|
|
|
| - filter_context()->SetURL(GURL("file://" + kSampleDomain));
|
| + SetupFilterContextWithGURL(GURL("file://" + kSampleDomain));
|
| scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
|
|
|
| const size_t feed_block_size(100);
|
| @@ -576,7 +604,7 @@ TEST_F(SdchFilterTest, NoDecodeAboutColon) {
|
| std::vector<Filter::FilterType> filter_types;
|
| filter_types.push_back(Filter::FILTER_TYPE_SDCH);
|
|
|
| - filter_context()->SetURL(GURL("about://" + kSampleDomain));
|
| + SetupFilterContextWithGURL(GURL("about://" + kSampleDomain));
|
| scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
|
|
|
| const size_t feed_block_size(100);
|
| @@ -602,7 +630,7 @@ TEST_F(SdchFilterTest, NoDecodeJavaScript) {
|
| std::vector<Filter::FilterType> filter_types;
|
| filter_types.push_back(Filter::FILTER_TYPE_SDCH);
|
|
|
| - filter_context()->SetURL(GURL("javascript://" + kSampleDomain));
|
| + SetupFilterContextWithGURL(GURL("javascript://" + kSampleDomain));
|
| scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
|
|
|
| const size_t feed_block_size(100);
|
| @@ -628,7 +656,7 @@ TEST_F(SdchFilterTest, CanStillDecodeHttp) {
|
| std::vector<Filter::FilterType> filter_types;
|
| filter_types.push_back(Filter::FILTER_TYPE_SDCH);
|
|
|
| - filter_context()->SetURL(GURL("http://" + kSampleDomain));
|
| + SetupFilterContextWithGURL(GURL("http://" + kSampleDomain));
|
| scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
|
|
|
| const size_t feed_block_size(100);
|
| @@ -657,7 +685,7 @@ TEST_F(SdchFilterTest, CrossDomainDictionaryUse) {
|
| // Decode with content arriving from the "wrong" domain.
|
| // This tests SdchManager::CanSet().
|
| GURL wrong_domain_url("http://www.wrongdomain.com");
|
| - filter_context()->SetURL(wrong_domain_url);
|
| + SetupFilterContextWithGURL(wrong_domain_url);
|
| scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
|
|
|
| size_t feed_block_size = 100;
|
| @@ -701,7 +729,7 @@ TEST_F(SdchFilterTest, DictionaryPathValidation) {
|
| filter_types.push_back(Filter::FILTER_TYPE_SDCH);
|
|
|
| // Test decode the path data, arriving from a valid path.
|
| - filter_context()->SetURL(GURL(url_string + path));
|
| + SetupFilterContextWithGURL(GURL(url_string + path));
|
| scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
|
|
|
| size_t feed_block_size = 100;
|
| @@ -713,7 +741,7 @@ TEST_F(SdchFilterTest, DictionaryPathValidation) {
|
| EXPECT_EQ(output, expanded_);
|
|
|
| // Test decode the path data, arriving from a invalid path.
|
| - filter_context()->SetURL(GURL(url_string));
|
| + SetupFilterContextWithGURL(GURL(url_string));
|
| filter.reset(Filter::Factory(filter_types, *filter_context()));
|
|
|
| feed_block_size = 100;
|
| @@ -757,7 +785,7 @@ TEST_F(SdchFilterTest, DictionaryPortValidation) {
|
| filter_types.push_back(Filter::FILTER_TYPE_SDCH);
|
|
|
| // Test decode the port data, arriving from a valid port.
|
| - filter_context()->SetURL(GURL(url_string + ":" + port));
|
| + SetupFilterContextWithGURL(GURL(url_string + ":" + port));
|
| scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
|
|
|
| size_t feed_block_size = 100;
|
| @@ -768,7 +796,7 @@ TEST_F(SdchFilterTest, DictionaryPortValidation) {
|
| EXPECT_EQ(output, expanded_);
|
|
|
| // Test decode the port data, arriving from a valid (default) port.
|
| - filter_context()->SetURL(GURL(url_string)); // Default port.
|
| + SetupFilterContextWithGURL(GURL(url_string)); // Default port.
|
| filter.reset(Filter::Factory(filter_types, *filter_context()));
|
|
|
| feed_block_size = 100;
|
| @@ -779,7 +807,7 @@ TEST_F(SdchFilterTest, DictionaryPortValidation) {
|
| EXPECT_EQ(output, expanded_);
|
|
|
| // Test decode the port data, arriving from a invalid port.
|
| - filter_context()->SetURL(GURL(url_string + ":" + port + "1"));
|
| + SetupFilterContextWithGURL(GURL(url_string + ":" + port + "1"));
|
| filter.reset(Filter::Factory(filter_types, *filter_context()));
|
|
|
| feed_block_size = 100;
|
| @@ -887,7 +915,7 @@ TEST_F(SdchFilterTest, FilterChaining) {
|
| CHECK_GT(kLargeInputBufferSize, gzip_compressed_sdch.size());
|
| CHECK_GT(kLargeInputBufferSize, sdch_compressed.size());
|
| CHECK_GT(kLargeInputBufferSize, expanded_.size());
|
| - filter_context()->SetURL(url);
|
| + SetupFilterContextWithGURL(url);
|
| scoped_ptr<Filter> filter(
|
| SdchFilterChainingTest::Factory(filter_types, *filter_context(),
|
| kLargeInputBufferSize));
|
| @@ -965,16 +993,15 @@ TEST_F(SdchFilterTest, DefaultGzipIfSdch) {
|
| filter_types.push_back(Filter::FILTER_TYPE_SDCH);
|
|
|
| filter_context()->SetMimeType("anything/mime");
|
| - filter_context()->SetSdchResponse(true);
|
| + SetupFilterContextWithGURL(url);
|
| +
|
| Filter::FixupEncodingTypes(*filter_context(), &filter_types);
|
| ASSERT_EQ(filter_types.size(), 2u);
|
| EXPECT_EQ(filter_types[0], Filter::FILTER_TYPE_SDCH);
|
| EXPECT_EQ(filter_types[1], Filter::FILTER_TYPE_GZIP_HELPING_SDCH);
|
|
|
| // First try with a large buffer (larger than test input, or compressed data).
|
| - filter_context()->SetURL(url);
|
| - scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
|
| -
|
| + scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
|
|
|
| // Verify that chained filter is waiting for data.
|
| char tiny_output_buffer[10];
|
| @@ -1023,7 +1050,7 @@ TEST_F(SdchFilterTest, AcceptGzipSdchIfGzip) {
|
| filter_types.push_back(Filter::FILTER_TYPE_GZIP);
|
|
|
| filter_context()->SetMimeType("anything/mime");
|
| - filter_context()->SetSdchResponse(true);
|
| + SetupFilterContextWithGURL(url);
|
| Filter::FixupEncodingTypes(*filter_context(), &filter_types);
|
| ASSERT_EQ(filter_types.size(), 3u);
|
| EXPECT_EQ(filter_types[0], Filter::FILTER_TYPE_SDCH_POSSIBLE);
|
| @@ -1031,10 +1058,8 @@ TEST_F(SdchFilterTest, AcceptGzipSdchIfGzip) {
|
| EXPECT_EQ(filter_types[2], Filter::FILTER_TYPE_GZIP);
|
|
|
| // First try with a large buffer (larger than test input, or compressed data).
|
| - filter_context()->SetURL(url);
|
| scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
|
|
|
| -
|
| // Verify that chained filter is waiting for data.
|
| char tiny_output_buffer[10];
|
| int tiny_output_size = sizeof(tiny_output_buffer);
|
| @@ -1080,17 +1105,15 @@ TEST_F(SdchFilterTest, DefaultSdchGzipIfEmpty) {
|
| std::vector<Filter::FilterType> filter_types;
|
|
|
| filter_context()->SetMimeType("anything/mime");
|
| - filter_context()->SetSdchResponse(true);
|
| + SetupFilterContextWithGURL(url);
|
| Filter::FixupEncodingTypes(*filter_context(), &filter_types);
|
| ASSERT_EQ(filter_types.size(), 2u);
|
| EXPECT_EQ(filter_types[0], Filter::FILTER_TYPE_SDCH_POSSIBLE);
|
| EXPECT_EQ(filter_types[1], Filter::FILTER_TYPE_GZIP_HELPING_SDCH);
|
|
|
| // First try with a large buffer (larger than test input, or compressed data).
|
| - filter_context()->SetURL(url);
|
| scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
|
|
|
| -
|
| // Verify that chained filter is waiting for data.
|
| char tiny_output_buffer[10];
|
| int tiny_output_size = sizeof(tiny_output_buffer);
|
| @@ -1141,7 +1164,7 @@ TEST_F(SdchFilterTest, AcceptGzipGzipSdchIfGzip) {
|
| filter_types.push_back(Filter::FILTER_TYPE_GZIP);
|
|
|
| filter_context()->SetMimeType("anything/mime");
|
| - filter_context()->SetSdchResponse(true);
|
| + SetupFilterContextWithGURL(url);
|
| Filter::FixupEncodingTypes(*filter_context(), &filter_types);
|
| ASSERT_EQ(filter_types.size(), 3u);
|
| EXPECT_EQ(filter_types[0], Filter::FILTER_TYPE_SDCH_POSSIBLE);
|
| @@ -1149,7 +1172,6 @@ TEST_F(SdchFilterTest, AcceptGzipGzipSdchIfGzip) {
|
| EXPECT_EQ(filter_types[2], Filter::FILTER_TYPE_GZIP);
|
|
|
| // First try with a large buffer (larger than test input, or compressed data).
|
| - filter_context()->SetURL(url);
|
| scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
|
|
|
| // Verify that chained filter is waiting for data.
|
| @@ -1176,4 +1198,36 @@ TEST_F(SdchFilterTest, AcceptGzipGzipSdchIfGzip) {
|
| EXPECT_EQ(output, expanded_);
|
| }
|
|
|
| +// Test to make sure we decode properly with an unexpected dictionary.
|
| +TEST_F(SdchFilterTest, UnexpectedDictionary) {
|
| + // Setup a dictionary, add it to the filter context, and create a filter
|
| + // based on that dictionary.
|
| + const std::string kSampleDomain = "sdchtest.com";
|
| + std::string dictionary(NewSdchDictionary(kSampleDomain));
|
| + std::string url_string = "http://" + kSampleDomain;
|
| + GURL url(url_string);
|
| + EXPECT_TRUE(AddSdchDictionary(dictionary, url));
|
| +
|
| + SetupFilterContextWithGURL(url);
|
| +
|
| + std::vector<Filter::FilterType> filter_types;
|
| + filter_types.push_back(Filter::FILTER_TYPE_SDCH);
|
| + scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
|
| +
|
| + // Setup another dictionary, expired. Don't add it to the filter context.
|
| + std::string expired_dictionary(NewSdchExpiredDictionary(kSampleDomain));
|
| +
|
| + // This is "EXPECT_FALSE" because the returned hash list won't change
|
| + // because that list doesn't include expired directionaries.
|
| + EXPECT_FALSE(AddSdchDictionary(expired_dictionary, url));
|
| +
|
| + // Encode output with the second dictionary.
|
| + std::string sdch_compressed(NewSdchCompressedData(expired_dictionary));
|
| +
|
| + // See if the filter decodes it.
|
| + std::string output;
|
| + EXPECT_TRUE(FilterTestData(sdch_compressed, 100, 100, filter.get(), &output));
|
| + EXPECT_EQ(expanded_, output);
|
| +}
|
| +
|
| } // namespace net
|
|
|