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

Side by Side Diff: net/filter/sdch_filter_unittest.cc

Issue 851503003: Update from https://crrev.com/311076 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 11 months 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 unified diff | Download patch
« no previous file with comments | « net/filter/sdch_filter.cc ('k') | net/http/http_cache.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <limits.h> 5 #include <limits.h>
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/scoped_ptr.h"
13 #include "base/test/simple_test_clock.h" 13 #include "base/test/simple_test_clock.h"
14 #include "net/base/io_buffer.h" 14 #include "net/base/io_buffer.h"
15 #include "net/base/sdch_observer.h"
15 #include "net/filter/mock_filter_context.h" 16 #include "net/filter/mock_filter_context.h"
16 #include "net/filter/sdch_filter.h" 17 #include "net/filter/sdch_filter.h"
17 #include "net/url_request/url_request_context.h" 18 #include "net/url_request/url_request_context.h"
18 #include "net/url_request/url_request_http_job.h" 19 #include "net/url_request/url_request_http_job.h"
19 #include "testing/gtest/include/gtest/gtest.h" 20 #include "testing/gtest/include/gtest/gtest.h"
20 #include "third_party/zlib/zlib.h" 21 #include "third_party/zlib/zlib.h"
21 22
22 namespace net { 23 namespace net {
23 24
24 //------------------------------------------------------------------------------ 25 //------------------------------------------------------------------------------
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 URLRequestContext* url_request_context = 62 URLRequestContext* url_request_context =
62 filter_context_->GetModifiableURLRequestContext(); 63 filter_context_->GetModifiableURLRequestContext();
63 64
64 url_request_context->set_sdch_manager(sdch_manager_.get()); 65 url_request_context->set_sdch_manager(sdch_manager_.get());
65 } 66 }
66 67
67 // Attempt to add a dictionary to the manager and probe for success or 68 // Attempt to add a dictionary to the manager and probe for success or
68 // failure. 69 // failure.
69 bool AddSdchDictionary(const std::string& dictionary_text, 70 bool AddSdchDictionary(const std::string& dictionary_text,
70 const GURL& gurl) { 71 const GURL& gurl) {
71 return sdch_manager_->AddSdchDictionary(dictionary_text, gurl) == SDCH_OK; 72 return sdch_manager_->AddSdchDictionary(dictionary_text, gurl, nullptr) ==
73 SDCH_OK;
72 } 74 }
73 75
74 MockFilterContext* filter_context() { return filter_context_.get(); } 76 MockFilterContext* filter_context() { return filter_context_.get(); }
75 77
76 // Sets both the GURL and the SDCH response for a filter context. 78 // Sets both the GURL and the SDCH response for a filter context.
77 void SetupFilterContextWithGURL(GURL url) { 79 void SetupFilterContextWithGURL(GURL url) {
78 filter_context_->SetURL(url); 80 filter_context_->SetURL(url);
79 filter_context_->SetSdchResponse( 81 filter_context_->SetSdchResponse(
80 sdch_manager_->GetDictionarySet(url).Pass()); 82 sdch_manager_->GetDictionarySet(url).Pass());
81 } 83 }
(...skipping 11 matching lines...) Expand all
93 } 95 }
94 96
95 const std::string test_vcdiff_dictionary_; 97 const std::string test_vcdiff_dictionary_;
96 const std::string vcdiff_compressed_data_; 98 const std::string vcdiff_compressed_data_;
97 const std::string expanded_; // Desired final, decompressed data. 99 const std::string expanded_; // Desired final, decompressed data.
98 100
99 scoped_ptr<SdchManager> sdch_manager_; 101 scoped_ptr<SdchManager> sdch_manager_;
100 scoped_ptr<MockFilterContext> filter_context_; 102 scoped_ptr<MockFilterContext> filter_context_;
101 }; 103 };
102 104
103 //------------------------------------------------------------------------------
104
105
106 TEST_F(SdchFilterTest, Hashing) { 105 TEST_F(SdchFilterTest, Hashing) {
107 std::string client_hash, server_hash; 106 std::string client_hash, server_hash;
108 std::string dictionary("test contents"); 107 std::string dictionary("test contents");
109 SdchManager::GenerateHash(dictionary, &client_hash, &server_hash); 108 SdchManager::GenerateHash(dictionary, &client_hash, &server_hash);
110 109
111 EXPECT_EQ(client_hash, "lMQBjS3P"); 110 EXPECT_EQ(client_hash, "lMQBjS3P");
112 EXPECT_EQ(server_hash, "MyciMVll"); 111 EXPECT_EQ(server_hash, "MyciMVll");
113 } 112 }
114 113
115
116 //------------------------------------------------------------------------------ 114 //------------------------------------------------------------------------------
117 // Provide a generic helper function for trying to filter data. 115 // Provide a generic helper function for trying to filter data.
118 // This function repeatedly calls the filter to process data, until the entire 116 // This function repeatedly calls the filter to process data, until the entire
119 // source is consumed. The return value from the filter is appended to output. 117 // source is consumed. The return value from the filter is appended to output.
120 // This allows us to vary input and output block sizes in order to test for edge 118 // This allows us to vary input and output block sizes in order to test for edge
121 // effects (boundary effects?) during the filtering process. 119 // effects (boundary effects?) during the filtering process.
122 // This function provides data to the filter in blocks of no-more-than the 120 // This function provides data to the filter in blocks of no-more-than the
123 // specified input_block_length. It allows the filter to fill no more than 121 // specified input_block_length. It allows the filter to fill no more than
124 // output_buffer_length in any one call to proccess (a.k.a., Read) data, and 122 // output_buffer_length in any one call to proccess (a.k.a., Read) data, and
125 // concatenates all these little output blocks into the singular output string. 123 // concatenates all these little output blocks into the singular output string.
(...skipping 21 matching lines...) Expand all
147 output->append(output_buffer.get(), buffer_length); 145 output->append(output_buffer.get(), buffer_length);
148 if (status == Filter::FILTER_ERROR) 146 if (status == Filter::FILTER_ERROR)
149 return false; 147 return false;
150 // Callers assume that FILTER_OK with no output buffer means FILTER_DONE. 148 // Callers assume that FILTER_OK with no output buffer means FILTER_DONE.
151 if (Filter::FILTER_OK == status && 0 == buffer_length) 149 if (Filter::FILTER_OK == status && 0 == buffer_length)
152 return true; 150 return true;
153 if (copy_amount == 0 && buffer_length == 0) 151 if (copy_amount == 0 && buffer_length == 0)
154 return true; 152 return true;
155 } while (1); 153 } while (1);
156 } 154 }
157 //------------------------------------------------------------------------------ 155
158 static std::string NewSdchDictionary(const std::string& domain) { 156 static std::string NewSdchDictionary(const std::string& domain) {
159 std::string dictionary; 157 std::string dictionary;
160 if (!domain.empty()) { 158 if (!domain.empty()) {
161 dictionary.append("Domain: "); 159 dictionary.append("Domain: ");
162 dictionary.append(domain); 160 dictionary.append(domain);
163 dictionary.append("\n"); 161 dictionary.append("\n");
164 } 162 }
165 dictionary.append("\n"); 163 dictionary.append("\n");
166 dictionary.append(kTestVcdiffDictionary, sizeof(kTestVcdiffDictionary) - 1); 164 dictionary.append(kTestVcdiffDictionary, sizeof(kTestVcdiffDictionary) - 1);
167 return dictionary; 165 return dictionary;
168 } 166 }
169 167
170 static std::string NewSdchExpiredDictionary(const std::string& domain) { 168 static std::string NewSdchExpiredDictionary(const std::string& domain) {
171 std::string dictionary; 169 std::string dictionary;
172 if (!domain.empty()) { 170 if (!domain.empty()) {
173 dictionary.append("Domain: "); 171 dictionary.append("Domain: ");
174 dictionary.append(domain); 172 dictionary.append(domain);
175 dictionary.append("\n"); 173 dictionary.append("\n");
176 } 174 }
177 dictionary.append("Max-Age: 0\n"); 175 dictionary.append("Max-Age: 0\n");
178 dictionary.append("\n"); 176 dictionary.append("\n");
179 dictionary.append(kTestVcdiffDictionary, sizeof(kTestVcdiffDictionary) - 1); 177 dictionary.append(kTestVcdiffDictionary, sizeof(kTestVcdiffDictionary) - 1);
180 return dictionary; 178 return dictionary;
181 } 179 }
182 180
183 //------------------------------------------------------------------------------
184
185 TEST_F(SdchFilterTest, EmptyInputOk) { 181 TEST_F(SdchFilterTest, EmptyInputOk) {
186 std::vector<Filter::FilterType> filter_types; 182 std::vector<Filter::FilterType> filter_types;
187 filter_types.push_back(Filter::FILTER_TYPE_SDCH); 183 filter_types.push_back(Filter::FILTER_TYPE_SDCH);
188 char output_buffer[20]; 184 char output_buffer[20];
189 std::string url_string("http://ignore.com"); 185 std::string url_string("http://ignore.com");
190 filter_context()->SetURL(GURL(url_string)); 186 filter_context()->SetURL(GURL(url_string));
191 scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context())); 187 scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
192 188
193 // With no input data, try to read output. 189 // With no input data, try to read output.
194 int output_bytes_or_buffer_size = sizeof(output_buffer); 190 int output_bytes_or_buffer_size = sizeof(output_buffer);
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 435
440 std::string url_string = "http://" + kSampleDomain; 436 std::string url_string = "http://" + kSampleDomain;
441 GURL url(url_string); 437 GURL url(url_string);
442 EXPECT_TRUE(AddSdchDictionary(dictionary, url)); 438 EXPECT_TRUE(AddSdchDictionary(dictionary, url));
443 439
444 // Check we can't add it twice. 440 // Check we can't add it twice.
445 EXPECT_FALSE(AddSdchDictionary(dictionary, url)); 441 EXPECT_FALSE(AddSdchDictionary(dictionary, url));
446 442
447 const std::string kSampleDomain2 = "sdchtest2.com"; 443 const std::string kSampleDomain2 = "sdchtest2.com";
448 444
449 // Don't test adding a second dictionary if our limits are tight. 445 // Construct a second SDCH dictionary from a VCDIFF dictionary.
450 if (SdchManager::kMaxDictionaryCount > 1) { 446 std::string dictionary2(NewSdchDictionary(kSampleDomain2));
451 // Construct a second SDCH dictionary from a VCDIFF dictionary.
452 std::string dictionary2(NewSdchDictionary(kSampleDomain2));
453 447
454 std::string url_string2 = "http://" + kSampleDomain2; 448 std::string url_string2 = "http://" + kSampleDomain2;
455 GURL url2(url_string2); 449 GURL url2(url_string2);
456 EXPECT_TRUE(AddSdchDictionary(dictionary2, url2)); 450 EXPECT_TRUE(AddSdchDictionary(dictionary2, url2));
457 }
458 } 451 }
459 452
460 TEST_F(SdchFilterTest, BasicDictionary) { 453 TEST_F(SdchFilterTest, BasicDictionary) {
461 // Construct a valid SDCH dictionary from a VCDIFF dictionary. 454 // Construct a valid SDCH dictionary from a VCDIFF dictionary.
462 const std::string kSampleDomain = "sdchtest.com"; 455 const std::string kSampleDomain = "sdchtest.com";
463 std::string dictionary(NewSdchDictionary(kSampleDomain)); 456 std::string dictionary(NewSdchDictionary(kSampleDomain));
464 457
465 std::string url_string = "http://" + kSampleDomain; 458 std::string url_string = "http://" + kSampleDomain;
466 459
467 GURL url(url_string); 460 GURL url(url_string);
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
684 EXPECT_EQ(output.size(), 0u); // No output written. 677 EXPECT_EQ(output.size(), 0u); // No output written.
685 678
686 EXPECT_EQ(SDCH_OK, sdch_manager_->IsInSupportedDomain(GURL(url_string))); 679 EXPECT_EQ(SDCH_OK, sdch_manager_->IsInSupportedDomain(GURL(url_string)));
687 EXPECT_EQ(SDCH_DOMAIN_BLACKLIST_INCLUDES_TARGET, 680 EXPECT_EQ(SDCH_DOMAIN_BLACKLIST_INCLUDES_TARGET,
688 sdch_manager_->IsInSupportedDomain(wrong_domain_url)); 681 sdch_manager_->IsInSupportedDomain(wrong_domain_url));
689 sdch_manager_->ClearBlacklistings(); 682 sdch_manager_->ClearBlacklistings();
690 EXPECT_EQ(SDCH_OK, sdch_manager_->IsInSupportedDomain(wrong_domain_url)); 683 EXPECT_EQ(SDCH_OK, sdch_manager_->IsInSupportedDomain(wrong_domain_url));
691 } 684 }
692 685
693 TEST_F(SdchFilterTest, DictionaryPathValidation) { 686 TEST_F(SdchFilterTest, DictionaryPathValidation) {
694 // Can't test path distinction between dictionaries if we aren't allowed
695 // more than one dictionary.
696 if (SdchManager::kMaxDictionaryCount <= 1)
697 return;
698
699 // Construct a valid SDCH dictionary from a VCDIFF dictionary. 687 // Construct a valid SDCH dictionary from a VCDIFF dictionary.
700 const std::string kSampleDomain = "sdchtest.com"; 688 const std::string kSampleDomain = "sdchtest.com";
701 std::string dictionary(NewSdchDictionary(kSampleDomain)); 689 std::string dictionary(NewSdchDictionary(kSampleDomain));
702 690
703 std::string url_string = "http://" + kSampleDomain; 691 std::string url_string = "http://" + kSampleDomain;
704 692
705 GURL url(url_string); 693 GURL url(url_string);
706 EXPECT_TRUE(AddSdchDictionary(dictionary, url)); 694 EXPECT_TRUE(AddSdchDictionary(dictionary, url));
707 695
708 // Create a dictionary with a path restriction, by prefixing dictionary. 696 // Create a dictionary with a path restriction, by prefixing dictionary.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
740 output_block_size, filter.get(), &output)); 728 output_block_size, filter.get(), &output));
741 EXPECT_EQ(output.size(), 0u); // No output written. 729 EXPECT_EQ(output.size(), 0u); // No output written.
742 730
743 EXPECT_EQ(SDCH_DOMAIN_BLACKLIST_INCLUDES_TARGET, 731 EXPECT_EQ(SDCH_DOMAIN_BLACKLIST_INCLUDES_TARGET,
744 sdch_manager_->IsInSupportedDomain(GURL(url_string))); 732 sdch_manager_->IsInSupportedDomain(GURL(url_string)));
745 sdch_manager_->ClearBlacklistings(); 733 sdch_manager_->ClearBlacklistings();
746 EXPECT_EQ(SDCH_OK, sdch_manager_->IsInSupportedDomain(GURL(url_string))); 734 EXPECT_EQ(SDCH_OK, sdch_manager_->IsInSupportedDomain(GURL(url_string)));
747 } 735 }
748 736
749 TEST_F(SdchFilterTest, DictionaryPortValidation) { 737 TEST_F(SdchFilterTest, DictionaryPortValidation) {
750 // Can't test port distinction between dictionaries if we aren't allowed
751 // more than one dictionary.
752 if (SdchManager::kMaxDictionaryCount <= 1)
753 return;
754
755 // Construct a valid SDCH dictionary from a VCDIFF dictionary. 738 // Construct a valid SDCH dictionary from a VCDIFF dictionary.
756 const std::string kSampleDomain = "sdchtest.com"; 739 const std::string kSampleDomain = "sdchtest.com";
757 std::string dictionary(NewSdchDictionary(kSampleDomain)); 740 std::string dictionary(NewSdchDictionary(kSampleDomain));
758 741
759 std::string url_string = "http://" + kSampleDomain; 742 std::string url_string = "http://" + kSampleDomain;
760 743
761 GURL url(url_string); 744 GURL url(url_string);
762 EXPECT_TRUE(AddSdchDictionary(dictionary, url)); 745 EXPECT_TRUE(AddSdchDictionary(dictionary, url));
763 746
764 // Create a dictionary with a port restriction, by prefixing old dictionary. 747 // Create a dictionary with a port restriction, by prefixing old dictionary.
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
806 EXPECT_FALSE(FilterTestData(compressed_for_port, feed_block_size, 789 EXPECT_FALSE(FilterTestData(compressed_for_port, feed_block_size,
807 output_block_size, filter.get(), &output)); 790 output_block_size, filter.get(), &output));
808 EXPECT_EQ(output.size(), 0u); // No output written. 791 EXPECT_EQ(output.size(), 0u); // No output written.
809 792
810 EXPECT_EQ(SDCH_DOMAIN_BLACKLIST_INCLUDES_TARGET, 793 EXPECT_EQ(SDCH_DOMAIN_BLACKLIST_INCLUDES_TARGET,
811 sdch_manager_->IsInSupportedDomain(GURL(url_string))); 794 sdch_manager_->IsInSupportedDomain(GURL(url_string)));
812 sdch_manager_->ClearBlacklistings(); 795 sdch_manager_->ClearBlacklistings();
813 EXPECT_EQ(SDCH_OK, sdch_manager_->IsInSupportedDomain(GURL(url_string))); 796 EXPECT_EQ(SDCH_OK, sdch_manager_->IsInSupportedDomain(GURL(url_string)));
814 } 797 }
815 798
816 //------------------------------------------------------------------------------
817 // Helper function to perform gzip compression of data. 799 // Helper function to perform gzip compression of data.
818
819 static std::string gzip_compress(const std::string &input) { 800 static std::string gzip_compress(const std::string &input) {
820 z_stream zlib_stream; 801 z_stream zlib_stream;
821 memset(&zlib_stream, 0, sizeof(zlib_stream)); 802 memset(&zlib_stream, 0, sizeof(zlib_stream));
822 int code; 803 int code;
823 804
824 // Initialize zlib 805 // Initialize zlib
825 code = deflateInit2(&zlib_stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 806 code = deflateInit2(&zlib_stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED,
826 -MAX_WBITS, 807 -MAX_WBITS,
827 8, // DEF_MEM_LEVEL 808 8, // DEF_MEM_LEVEL
828 Z_DEFAULT_STRATEGY); 809 Z_DEFAULT_STRATEGY);
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
985 966
986 filter_context()->SetMimeType("anything/mime"); 967 filter_context()->SetMimeType("anything/mime");
987 SetupFilterContextWithGURL(url); 968 SetupFilterContextWithGURL(url);
988 969
989 Filter::FixupEncodingTypes(*filter_context(), &filter_types); 970 Filter::FixupEncodingTypes(*filter_context(), &filter_types);
990 ASSERT_EQ(filter_types.size(), 2u); 971 ASSERT_EQ(filter_types.size(), 2u);
991 EXPECT_EQ(filter_types[0], Filter::FILTER_TYPE_SDCH); 972 EXPECT_EQ(filter_types[0], Filter::FILTER_TYPE_SDCH);
992 EXPECT_EQ(filter_types[1], Filter::FILTER_TYPE_GZIP_HELPING_SDCH); 973 EXPECT_EQ(filter_types[1], Filter::FILTER_TYPE_GZIP_HELPING_SDCH);
993 974
994 // First try with a large buffer (larger than test input, or compressed data). 975 // First try with a large buffer (larger than test input, or compressed data).
995 scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context())); 976 scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
996 977
997 // Verify that chained filter is waiting for data. 978 // Verify that chained filter is waiting for data.
998 char tiny_output_buffer[10]; 979 char tiny_output_buffer[10];
999 int tiny_output_size = sizeof(tiny_output_buffer); 980 int tiny_output_size = sizeof(tiny_output_buffer);
1000 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA, 981 EXPECT_EQ(Filter::FILTER_NEED_MORE_DATA,
1001 filter->ReadData(tiny_output_buffer, &tiny_output_size)); 982 filter->ReadData(tiny_output_buffer, &tiny_output_size));
1002 983
1003 size_t feed_block_size = 100; 984 size_t feed_block_size = 100;
1004 size_t output_block_size = 100; 985 size_t output_block_size = 100;
1005 std::string output; 986 std::string output;
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
1206 scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context())); 1187 scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
1207 1188
1208 // Setup another dictionary, expired. Don't add it to the filter context. 1189 // Setup another dictionary, expired. Don't add it to the filter context.
1209 // Delete stored dictionaries first to handle platforms which only 1190 // Delete stored dictionaries first to handle platforms which only
1210 // have room for a single dictionary. 1191 // have room for a single dictionary.
1211 sdch_manager_->ClearData(); 1192 sdch_manager_->ClearData();
1212 std::string expired_dictionary(NewSdchExpiredDictionary(kSampleDomain)); 1193 std::string expired_dictionary(NewSdchExpiredDictionary(kSampleDomain));
1213 1194
1214 // Don't use the Helper function since its insertion check is indeterminate 1195 // Don't use the Helper function since its insertion check is indeterminate
1215 // for a Max-Age: 0 dictionary. 1196 // for a Max-Age: 0 dictionary.
1216 sdch_manager_->AddSdchDictionary(expired_dictionary, url); 1197 sdch_manager_->AddSdchDictionary(expired_dictionary, url, nullptr);
1217 1198
1218 std::string client_hash; 1199 std::string client_hash;
1219 std::string server_hash; 1200 std::string server_hash;
1220 SdchManager::GenerateHash(expired_dictionary, &client_hash, &server_hash); 1201 SdchManager::GenerateHash(expired_dictionary, &client_hash, &server_hash);
1221 1202
1222 // Make sure Max-Age: 0 shows up as expired. 1203 // Make sure Max-Age: 0 shows up as expired.
1223 scoped_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock); 1204 scoped_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock);
1224 clock->SetNow(base::Time::Now()); 1205 clock->SetNow(base::Time::Now());
1225 clock->Advance(base::TimeDelta::FromMinutes(5)); 1206 clock->Advance(base::TimeDelta::FromMinutes(5));
1226 SdchProblemCode problem_code; 1207 SdchProblemCode problem_code;
1227 scoped_ptr<SdchManager::DictionarySet> hash_set( 1208 scoped_ptr<SdchManager::DictionarySet> hash_set(
1228 sdch_manager_->GetDictionarySetByHash( 1209 sdch_manager_->GetDictionarySetByHash(
1229 url, server_hash, &problem_code).Pass()); 1210 url, server_hash, &problem_code).Pass());
1230 ASSERT_TRUE(hash_set); 1211 ASSERT_TRUE(hash_set);
1231 ASSERT_EQ(SDCH_OK, problem_code); 1212 ASSERT_EQ(SDCH_OK, problem_code);
1232 1213
1233 const_cast<SdchManager::Dictionary*>( 1214 const_cast<SdchManager::Dictionary*>(
1234 hash_set->GetDictionary(server_hash))->SetClockForTesting( 1215 hash_set->GetDictionary(server_hash))->SetClockForTesting(
1235 clock.Pass()); 1216 clock.Pass());
1236 1217
1237 // Encode output with the second dictionary. 1218 // Encode output with the second dictionary.
1238 std::string sdch_compressed(NewSdchCompressedData(expired_dictionary)); 1219 std::string sdch_compressed(NewSdchCompressedData(expired_dictionary));
1239 1220
1240 // See if the filter decodes it. 1221 // See if the filter decodes it.
1241 std::string output; 1222 std::string output;
1242 EXPECT_TRUE(FilterTestData(sdch_compressed, 100, 100, filter.get(), &output)); 1223 EXPECT_TRUE(FilterTestData(sdch_compressed, 100, 100, filter.get(), &output));
1243 EXPECT_EQ(expanded_, output); 1224 EXPECT_EQ(expanded_, output);
1244 } 1225 }
1245 1226
1227 class SimpleSdchObserver : public SdchObserver {
1228 public:
1229 explicit SimpleSdchObserver(SdchManager* manager)
1230 : dictionary_used_(0), manager_(manager) {
1231 manager_->AddObserver(this);
1232 }
1233 ~SimpleSdchObserver() override { manager_->RemoveObserver(this); }
1234
1235 // SdchObserver
1236 void OnDictionaryUsed(SdchManager* manager,
1237 const std::string& server_hash) override {
1238 dictionary_used_++;
1239 last_server_hash_ = server_hash;
1240 }
1241
1242 int dictionary_used_calls() const { return dictionary_used_; }
1243 std::string last_server_hash() const { return last_server_hash_; }
1244
1245 void OnGetDictionary(SdchManager* /* manager */,
1246 const GURL& /* request_url */,
1247 const GURL& /* dictionary_url */) override {}
1248 void OnClearDictionaries(SdchManager* /* manager */) override {}
1249
1250 private:
1251 int dictionary_used_;
1252 std::string last_server_hash_;
1253 SdchManager* manager_;
1254
1255 DISALLOW_COPY_AND_ASSIGN(SimpleSdchObserver);
1256 };
1257
1258 TEST_F(SdchFilterTest, DictionaryUsedSignaled) {
1259 // Construct a valid SDCH dictionary from a VCDIFF dictionary.
1260 const std::string kSampleDomain = "sdchtest.com";
1261 std::string dictionary(NewSdchDictionary(kSampleDomain));
1262 SimpleSdchObserver observer(sdch_manager_.get());
1263
1264 std::string url_string = "http://" + kSampleDomain;
1265
1266 GURL url(url_string);
1267 EXPECT_TRUE(AddSdchDictionary(dictionary, url));
1268
1269 std::string client_hash;
1270 std::string server_hash;
1271 SdchManager::GenerateHash(dictionary, &client_hash, &server_hash);
1272
1273 std::string compressed(NewSdchCompressedData(dictionary));
1274
1275 std::vector<Filter::FilterType> filter_types;
1276 filter_types.push_back(Filter::FILTER_TYPE_SDCH);
1277
1278 SetupFilterContextWithGURL(url);
1279
1280 scoped_ptr<Filter> filter(Filter::Factory(filter_types, *filter_context()));
1281
1282 size_t feed_block_size = 100;
1283 size_t output_block_size = 100;
1284 std::string output;
1285 EXPECT_TRUE(FilterTestData(compressed, feed_block_size, output_block_size,
1286 filter.get(), &output));
1287 EXPECT_EQ(output, expanded_);
1288
1289 filter.reset(nullptr);
1290
1291 // Confirm that we got a "DictionaryUsed" signal from the SdchManager
1292 // for our dictionary.
1293 EXPECT_EQ(1, observer.dictionary_used_calls());
1294 EXPECT_EQ(server_hash, observer.last_server_hash());
1295 }
1296
1246 } // namespace net 1297 } // namespace net
OLDNEW
« no previous file with comments | « net/filter/sdch_filter.cc ('k') | net/http/http_cache.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698