| OLD | NEW |
| 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 "net/base/io_buffer.h" | 5 #include "net/base/io_buffer.h" |
| 6 #include "net/filter/filter.h" | 6 #include "net/filter/filter.h" |
| 7 #include "net/filter/mock_filter_context.h" | 7 #include "net/filter/mock_filter_context.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 9 |
| 10 namespace net { | 10 namespace net { |
| 11 | 11 |
| 12 namespace { | 12 namespace { |
| 13 | 13 |
| 14 class PassThroughFilter : public Filter { | 14 class PassThroughFilter : public Filter { |
| 15 public: | 15 public: |
| 16 PassThroughFilter() : Filter(FILTER_TYPE_UNSUPPORTED) {} | 16 PassThroughFilter() : Filter(FILTER_TYPE_UNSUPPORTED) {} |
| 17 | 17 |
| 18 FilterStatus ReadFilteredData(char* dest_buffer, int* dest_len) override { | 18 FilterStatus ReadFilteredData(char* dest_buffer, int* dest_len) override { |
| 19 return CopyOut(dest_buffer, dest_len); | 19 return CopyOut(dest_buffer, dest_len); |
| 20 } | 20 } |
| 21 | 21 |
| 22 DISALLOW_COPY_AND_ASSIGN(PassThroughFilter); | 22 DISALLOW_COPY_AND_ASSIGN(PassThroughFilter); |
| 23 }; | 23 }; |
| 24 | 24 |
| 25 } // namespace | 25 } // namespace |
| 26 | 26 |
| 27 class FilterTest : public testing::Test { | |
| 28 }; | |
| 29 | |
| 30 TEST(FilterTest, ContentTypeId) { | 27 TEST(FilterTest, ContentTypeId) { |
| 31 // Check for basic translation of Content-Encoding, including case variations. | 28 // Check for basic translation of Content-Encoding, including case variations. |
| 32 EXPECT_EQ(Filter::FILTER_TYPE_DEFLATE, | 29 EXPECT_EQ(Filter::FILTER_TYPE_DEFLATE, |
| 33 Filter::ConvertEncodingToType("deflate")); | 30 Filter::ConvertEncodingToType("deflate")); |
| 34 EXPECT_EQ(Filter::FILTER_TYPE_DEFLATE, | 31 EXPECT_EQ(Filter::FILTER_TYPE_DEFLATE, |
| 35 Filter::ConvertEncodingToType("deflAte")); | 32 Filter::ConvertEncodingToType("deflAte")); |
| 36 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, | 33 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, |
| 37 Filter::ConvertEncodingToType("gzip")); | 34 Filter::ConvertEncodingToType("gzip")); |
| 38 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, | 35 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, |
| 39 Filter::ConvertEncodingToType("GzIp")); | 36 Filter::ConvertEncodingToType("GzIp")); |
| 40 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, | 37 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, |
| 41 Filter::ConvertEncodingToType("x-gzip")); | 38 Filter::ConvertEncodingToType("x-gzip")); |
| 42 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, | 39 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, |
| 43 Filter::ConvertEncodingToType("X-GzIp")); | 40 Filter::ConvertEncodingToType("X-GzIp")); |
| 44 EXPECT_EQ(Filter::FILTER_TYPE_SDCH, | 41 EXPECT_EQ(Filter::FILTER_TYPE_SDCH, |
| 45 Filter::ConvertEncodingToType("sdch")); | 42 Filter::ConvertEncodingToType("sdch")); |
| 46 EXPECT_EQ(Filter::FILTER_TYPE_SDCH, | 43 EXPECT_EQ(Filter::FILTER_TYPE_SDCH, |
| 47 Filter::ConvertEncodingToType("sDcH")); | 44 Filter::ConvertEncodingToType("sDcH")); |
| 48 EXPECT_EQ(Filter::FILTER_TYPE_UNSUPPORTED, | 45 EXPECT_EQ(Filter::FILTER_TYPE_UNSUPPORTED, |
| 49 Filter::ConvertEncodingToType("weird")); | 46 Filter::ConvertEncodingToType("weird")); |
| 50 EXPECT_EQ(Filter::FILTER_TYPE_UNSUPPORTED, | 47 EXPECT_EQ(Filter::FILTER_TYPE_UNSUPPORTED, |
| 51 Filter::ConvertEncodingToType("strange")); | 48 Filter::ConvertEncodingToType("strange")); |
| 52 } | 49 } |
| 53 | 50 |
| 54 // Check various fixups that modify content encoding lists. | 51 // Check various fixups that modify content encoding lists. |
| 55 TEST(FilterTest, ApacheGzip) { | 52 TEST(FilterTest, ApacheGzip) { |
| 56 MockFilterContext filter_context; | 53 MockFilterContext filter_context; |
| 57 filter_context.SetSdchResponse(false); | 54 filter_context.SetSdchResponse(NULL); |
| 58 | 55 |
| 59 // Check that redundant gzip mime type removes only solo gzip encoding. | 56 // Check that redundant gzip mime type removes only solo gzip encoding. |
| 60 const std::string kGzipMime1("application/x-gzip"); | 57 const std::string kGzipMime1("application/x-gzip"); |
| 61 const std::string kGzipMime2("application/gzip"); | 58 const std::string kGzipMime2("application/gzip"); |
| 62 const std::string kGzipMime3("application/x-gunzip"); | 59 const std::string kGzipMime3("application/x-gunzip"); |
| 63 std::vector<Filter::FilterType> encoding_types; | 60 std::vector<Filter::FilterType> encoding_types; |
| 64 | 61 |
| 65 // First show it removes the gzip, given any gzip style mime type. | 62 // First show it removes the gzip, given any gzip style mime type. |
| 66 encoding_types.clear(); | 63 encoding_types.clear(); |
| 67 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | 64 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 93 encoding_types.clear(); | 90 encoding_types.clear(); |
| 94 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | 91 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); |
| 95 filter_context.SetMimeType("other/mime"); | 92 filter_context.SetMimeType("other/mime"); |
| 96 Filter::FixupEncodingTypes(filter_context, &encoding_types); | 93 Filter::FixupEncodingTypes(filter_context, &encoding_types); |
| 97 ASSERT_EQ(1U, encoding_types.size()); | 94 ASSERT_EQ(1U, encoding_types.size()); |
| 98 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, encoding_types.front()); | 95 EXPECT_EQ(Filter::FILTER_TYPE_GZIP, encoding_types.front()); |
| 99 } | 96 } |
| 100 | 97 |
| 101 TEST(FilterTest, GzipContentDispositionFilename) { | 98 TEST(FilterTest, GzipContentDispositionFilename) { |
| 102 MockFilterContext filter_context; | 99 MockFilterContext filter_context; |
| 103 filter_context.SetSdchResponse(false); | 100 filter_context.SetSdchResponse(NULL); |
| 104 | 101 |
| 105 const std::string kGzipMime("application/x-tar"); | 102 const std::string kGzipMime("application/x-tar"); |
| 106 const std::string kContentDisposition("attachment; filename=\"foo.tgz\""); | 103 const std::string kContentDisposition("attachment; filename=\"foo.tgz\""); |
| 107 const std::string kURL("http://foo.com/getfoo.php"); | 104 const std::string kURL("http://foo.com/getfoo.php"); |
| 108 std::vector<Filter::FilterType> encoding_types; | 105 std::vector<Filter::FilterType> encoding_types; |
| 109 | 106 |
| 110 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | 107 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); |
| 111 filter_context.SetMimeType(kGzipMime); | 108 filter_context.SetMimeType(kGzipMime); |
| 112 filter_context.SetURL(GURL(kURL)); | 109 filter_context.SetURL(GURL(kURL)); |
| 113 filter_context.SetContentDisposition(kContentDisposition); | 110 filter_context.SetContentDisposition(kContentDisposition); |
| 114 Filter::FixupEncodingTypes(filter_context, &encoding_types); | 111 Filter::FixupEncodingTypes(filter_context, &encoding_types); |
| 115 ASSERT_EQ(0U, encoding_types.size()); | 112 ASSERT_EQ(0U, encoding_types.size()); |
| 116 } | 113 } |
| 117 | 114 |
| 118 TEST(FilterTest, SdchEncoding) { | 115 TEST(FilterTest, SdchEncoding) { |
| 119 // Handle content encodings including SDCH. | 116 // Handle content encodings including SDCH. |
| 120 const std::string kTextHtmlMime("text/html"); | 117 const std::string kTextHtmlMime("text/html"); |
| 121 MockFilterContext filter_context; | 118 MockFilterContext filter_context; |
| 122 filter_context.SetSdchResponse(true); | 119 // Empty handle indicates to filter that SDCH is active. |
| 120 filter_context.SetSdchResponse( |
| 121 SdchManager::CreateEmptyDictionarySetForTesting().Pass()); |
| 123 | 122 |
| 124 std::vector<Filter::FilterType> encoding_types; | 123 std::vector<Filter::FilterType> encoding_types; |
| 125 | 124 |
| 126 // Check for most common encoding, and verify it survives unchanged. | 125 // Check for most common encoding, and verify it survives unchanged. |
| 127 encoding_types.clear(); | 126 encoding_types.clear(); |
| 128 encoding_types.push_back(Filter::FILTER_TYPE_SDCH); | 127 encoding_types.push_back(Filter::FILTER_TYPE_SDCH); |
| 129 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); | 128 encoding_types.push_back(Filter::FILTER_TYPE_GZIP); |
| 130 filter_context.SetMimeType(kTextHtmlMime); | 129 filter_context.SetMimeType(kTextHtmlMime); |
| 131 Filter::FixupEncodingTypes(filter_context, &encoding_types); | 130 Filter::FixupEncodingTypes(filter_context, &encoding_types); |
| 132 ASSERT_EQ(2U, encoding_types.size()); | 131 ASSERT_EQ(2U, encoding_types.size()); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 149 Filter::FixupEncodingTypes(filter_context, &encoding_types); | 148 Filter::FixupEncodingTypes(filter_context, &encoding_types); |
| 150 ASSERT_EQ(2U, encoding_types.size()); | 149 ASSERT_EQ(2U, encoding_types.size()); |
| 151 EXPECT_EQ(Filter::FILTER_TYPE_SDCH, encoding_types[0]); | 150 EXPECT_EQ(Filter::FILTER_TYPE_SDCH, encoding_types[0]); |
| 152 EXPECT_EQ(Filter::FILTER_TYPE_GZIP_HELPING_SDCH, encoding_types[1]); | 151 EXPECT_EQ(Filter::FILTER_TYPE_GZIP_HELPING_SDCH, encoding_types[1]); |
| 153 } | 152 } |
| 154 | 153 |
| 155 TEST(FilterTest, MissingSdchEncoding) { | 154 TEST(FilterTest, MissingSdchEncoding) { |
| 156 // Handle interesting case where entire SDCH encoding assertion "got lost." | 155 // Handle interesting case where entire SDCH encoding assertion "got lost." |
| 157 const std::string kTextHtmlMime("text/html"); | 156 const std::string kTextHtmlMime("text/html"); |
| 158 MockFilterContext filter_context; | 157 MockFilterContext filter_context; |
| 159 filter_context.SetSdchResponse(true); | 158 filter_context.SetSdchResponse( |
| 159 SdchManager::CreateEmptyDictionarySetForTesting().Pass()); |
| 160 | 160 |
| 161 std::vector<Filter::FilterType> encoding_types; | 161 std::vector<Filter::FilterType> encoding_types; |
| 162 | 162 |
| 163 // Loss of encoding, but it was an SDCH response with html type. | 163 // Loss of encoding, but it was an SDCH response with html type. |
| 164 encoding_types.clear(); | 164 encoding_types.clear(); |
| 165 filter_context.SetMimeType(kTextHtmlMime); | 165 filter_context.SetMimeType(kTextHtmlMime); |
| 166 Filter::FixupEncodingTypes(filter_context, &encoding_types); | 166 Filter::FixupEncodingTypes(filter_context, &encoding_types); |
| 167 ASSERT_EQ(2U, encoding_types.size()); | 167 ASSERT_EQ(2U, encoding_types.size()); |
| 168 EXPECT_EQ(Filter::FILTER_TYPE_SDCH_POSSIBLE, encoding_types[0]); | 168 EXPECT_EQ(Filter::FILTER_TYPE_SDCH_POSSIBLE, encoding_types[0]); |
| 169 EXPECT_EQ(Filter::FILTER_TYPE_GZIP_HELPING_SDCH, encoding_types[1]); | 169 EXPECT_EQ(Filter::FILTER_TYPE_GZIP_HELPING_SDCH, encoding_types[1]); |
| 170 | 170 |
| 171 // Loss of encoding, but it was an SDCH response with a prefix that says it | 171 // Loss of encoding, but it was an SDCH response with a prefix that says it |
| 172 // was an html type. Note that it *should* be the case that a precise match | 172 // was an html type. Note that it *should* be the case that a precise match |
| 173 // with "text/html" we be collected by GetMimeType() and passed in, but we | 173 // with "text/html" we be collected by GetMimeType() and passed in, but we |
| 174 // coded the fixup defensively (scanning for a prefix of "text/html", so this | 174 // coded the fixup defensively (scanning for a prefix of "text/html", so this |
| 175 // is an example which could survive such confusion in the caller). | 175 // is an example which could survive such confusion in the caller). |
| 176 encoding_types.clear(); | 176 encoding_types.clear(); |
| 177 filter_context.SetMimeType("text/html; charset=UTF-8"); | 177 filter_context.SetMimeType("text/html; charset=UTF-8"); |
| 178 Filter::FixupEncodingTypes(filter_context, &encoding_types); | 178 Filter::FixupEncodingTypes(filter_context, &encoding_types); |
| 179 ASSERT_EQ(2U, encoding_types.size()); | 179 ASSERT_EQ(2U, encoding_types.size()); |
| 180 EXPECT_EQ(Filter::FILTER_TYPE_SDCH_POSSIBLE, encoding_types[0]); | 180 EXPECT_EQ(Filter::FILTER_TYPE_SDCH_POSSIBLE, encoding_types[0]); |
| 181 EXPECT_EQ(Filter::FILTER_TYPE_GZIP_HELPING_SDCH, encoding_types[1]); | 181 EXPECT_EQ(Filter::FILTER_TYPE_GZIP_HELPING_SDCH, encoding_types[1]); |
| 182 | 182 |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 amount_to_copy); | 438 amount_to_copy); |
| 439 filter1->FlushStreamBuffer(amount_to_copy); | 439 filter1->FlushStreamBuffer(amount_to_copy); |
| 440 read_array_index += amount_to_copy; | 440 read_array_index += amount_to_copy; |
| 441 } while (true); | 441 } while (true); |
| 442 | 442 |
| 443 EXPECT_EQ(read_array_index, input_array_size); | 443 EXPECT_EQ(read_array_index, input_array_size); |
| 444 EXPECT_EQ(compare_array_index, input_array_size); | 444 EXPECT_EQ(compare_array_index, input_array_size); |
| 445 } | 445 } |
| 446 | 446 |
| 447 } // Namespace net | 447 } // Namespace net |
| OLD | NEW |