Index: net/spdy/http2_decompressor_unittest.cc |
diff --git a/net/spdy/http2_decompressor_unittest.cc b/net/spdy/http2_decompressor_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..de1c360a41d0563e4fe47590448fde3f222d00a7 |
--- /dev/null |
+++ b/net/spdy/http2_decompressor_unittest.cc |
@@ -0,0 +1,191 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "net/spdy/http2_decompressor.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace net { |
+namespace { |
+ |
+class Http2DecompressorTest : public ::testing::Test { |
+}; |
+ |
+TEST_F(Http2DecompressorTest, Simple) { |
+ Http2Decompressor decompressor; |
+ SpdyNameValueBlock expected_name_value_block; |
+ expected_name_value_block["name1"] = "value1"; |
+ expected_name_value_block["name2"] = "value2"; |
+ expected_name_value_block["name3"] = "value3"; |
+ |
+ std::string encoded; |
+ encoded.append(1, 0x60); |
+ encoded.append(1, 0x05); |
+ encoded.append("name1"); |
+ encoded.append(1, 0x06); |
+ encoded.append("value1"); |
+ encoded.append(1, 0x60); |
+ encoded.append(1, 0x05); |
+ encoded.append("name2"); |
+ encoded.append(1, 0x06); |
+ encoded.append("value2"); |
+ encoded.append(1, 0x60); |
+ encoded.append(1, 0x05); |
+ encoded.append("name3"); |
+ encoded.append(1, 0x06); |
+ encoded.append("value3"); |
+ |
+ SpdyNameValueBlock name_value_block; |
+ EXPECT_TRUE(decompressor.DecodeNameValueBlock(encoded.data(), |
+ encoded.size(), |
+ &name_value_block)); |
+ EXPECT_EQ(expected_name_value_block, name_value_block); |
+} |
+ |
+TEST_F(Http2DecompressorTest, Long) { |
+ Http2Decompressor decompressor; |
+ SpdyNameValueBlock expected_name_value_block; |
+ std::string name(1000, 'n'); |
+ std::string value(10000, 'v'); |
+ expected_name_value_block[name] = value; |
+ |
+ std::string encoded; |
+ encoded.append(1, 0x60); |
+ encoded.append(1, 0x80 | 104); |
+ encoded.append(1, 7); |
+ encoded.append(name); |
+ encoded.append(1, 0x80 | 16); |
+ encoded.append(1, 78); |
+ encoded.append(value); |
+ |
+ SpdyNameValueBlock name_value_block; |
+ EXPECT_TRUE(decompressor.DecodeNameValueBlock(encoded.data(), |
+ encoded.size(), |
+ &name_value_block)); |
+ EXPECT_EQ(expected_name_value_block, name_value_block); |
+} |
+ |
+TEST_F(Http2DecompressorTest, PreExisting) { |
+ Http2Decompressor decompressor; |
+ SpdyNameValueBlock expected_name_value_block; |
+ expected_name_value_block[":status"] = "200"; |
+ expected_name_value_block["www-authenticate"] = ""; |
+ |
+ std::string encoded; |
+ // :status |
+ encoded.append(1, 0x80 | 0); |
+ // www-authenticate |
+ encoded.append(1, 0x80 | 34); |
+ |
+ SpdyNameValueBlock name_value_block; |
+ EXPECT_TRUE(decompressor.DecodeNameValueBlock(encoded.data(), |
+ encoded.size(), |
+ &name_value_block)); |
+ EXPECT_EQ(expected_name_value_block, name_value_block); |
+} |
+ |
+TEST_F(Http2DecompressorTest, DifferentialSimple) { |
+ Http2Decompressor decompressor; |
+ SpdyNameValueBlock expected_name_value_block; |
+ expected_name_value_block["name1"] = "value1"; |
+ expected_name_value_block["name2"] = "value2"; |
+ |
+ { |
+ std::string encoded; |
+ // name1 is indexed. |
+ encoded.append(1, 0x40); |
+ encoded.append(1, 0x05); |
+ encoded.append("name1"); |
+ encoded.append(1, 0x06); |
+ encoded.append("value1"); |
+ |
+ // name2 is not indexed. |
+ encoded.append(1, 0x60); |
+ encoded.append(1, 0x05); |
+ encoded.append("name2"); |
+ encoded.append(1, 0x06); |
+ encoded.append("value2"); |
+ |
+ SpdyNameValueBlock name_value_block; |
+ EXPECT_TRUE(decompressor.DecodeNameValueBlock(encoded.data(), |
+ encoded.size(), |
+ &name_value_block)); |
+ EXPECT_EQ(expected_name_value_block, name_value_block); |
+ } |
+ |
+ { |
+ expected_name_value_block.erase("name2"); |
+ SpdyNameValueBlock name_value_block; |
+ EXPECT_TRUE(decompressor.DecodeNameValueBlock(NULL, |
+ 0, |
+ &name_value_block)); |
+ EXPECT_EQ(expected_name_value_block, name_value_block); |
+ } |
+} |
+ |
+TEST_F(Http2DecompressorTest, DifferentialPreExisting) { |
+ Http2Decompressor decompressor; |
+ SpdyNameValueBlock expected_name_value_block; |
+ expected_name_value_block[":status"] = "200"; |
+ expected_name_value_block["www-authenticate"] = ""; |
+ |
+ { |
+ std::string encoded; |
+ // :status |
+ encoded.append(1, 0x80 | 0); |
+ // www-authenticate |
+ encoded.append(1, 0x80 | 34); |
+ |
+ SpdyNameValueBlock name_value_block; |
+ EXPECT_TRUE(decompressor.DecodeNameValueBlock(encoded.data(), |
+ encoded.size(), |
+ &name_value_block)); |
+ EXPECT_EQ(expected_name_value_block, name_value_block); |
+ } |
+ |
+ { |
+ SpdyNameValueBlock name_value_block; |
+ EXPECT_TRUE(decompressor.DecodeNameValueBlock(NULL, |
+ 0, |
+ &name_value_block)); |
+ EXPECT_EQ(expected_name_value_block, name_value_block); |
+ } |
+} |
+ |
+TEST_F(Http2DecompressorTest, DifferentialToggle) { |
+ Http2Decompressor decompressor; |
+ SpdyNameValueBlock expected_name_value_block; |
+ expected_name_value_block["name1"] = "value1"; |
+ |
+ { |
+ std::string encoded; |
+ // name1 is indexed. |
+ encoded.append(1, 0x40); |
+ encoded.append(1, 0x05); |
+ encoded.append("name1"); |
+ encoded.append(1, 0x06); |
+ encoded.append("value1"); |
+ |
+ SpdyNameValueBlock name_value_block; |
+ EXPECT_TRUE(decompressor.DecodeNameValueBlock(encoded.data(), |
+ encoded.size(), |
+ &name_value_block)); |
+ EXPECT_EQ(expected_name_value_block, name_value_block); |
+ } |
+ |
+ { |
+ std::string encoded; |
+ // Toggle name1. |
+ encoded.append(1, 0x80 | 35); |
+ |
+ expected_name_value_block.erase("name1"); |
+ SpdyNameValueBlock name_value_block; |
+ EXPECT_TRUE(decompressor.DecodeNameValueBlock(encoded.data(), |
+ encoded.size(), |
+ &name_value_block)); |
+ EXPECT_EQ(expected_name_value_block, name_value_block); |
+ } |
+} |
+ |
+} // namespace |
+} // namespace net |