Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(638)

Unified Diff: net/filter/sdch_filter_unittest.cc

Issue 711753003: Pin dictionaries from being deleted while request is outstanding. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Incorporated comments; fixed try job errors. Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698