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..b7aa0e0df5f2314d0c30a3a9e978c8f6d89f1945 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,39 @@ 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. |
+ // Delete stored dictionaries first to handle platforms which only |
+ // have room for a single dictionary. |
+ sdch_manager_->ClearData(); |
+ 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 |