Home | History | Annotate | Download | only in quic
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <string>
      6 
      7 #include "net/quic/quic_spdy_compressor.h"
      8 #include "net/quic/quic_spdy_decompressor.h"
      9 #include "net/quic/spdy_utils.h"
     10 #include "net/quic/test_tools/quic_test_utils.h"
     11 #include "testing/gtest/include/gtest/gtest.h"
     12 
     13 using std::string;
     14 
     15 namespace net {
     16 namespace test {
     17 namespace {
     18 
     19 class QuicSpdyDecompressorTest : public ::testing::Test {
     20  protected:
     21   QuicSpdyDecompressor decompressor_;
     22   QuicSpdyCompressor compressor_;
     23   TestDecompressorVisitor visitor_;
     24 };
     25 
     26 TEST_F(QuicSpdyDecompressorTest, Decompress) {
     27   SpdyHeaderBlock headers;
     28   headers[":host"] = "www.google.com";
     29   headers[":path"] = "/index.hml";
     30   headers[":scheme"] = "https";
     31 
     32   EXPECT_EQ(1u, decompressor_.current_header_id());
     33   string compressed_headers = compressor_.CompressHeaders(headers).substr(4);
     34   EXPECT_EQ(compressed_headers.length(),
     35             decompressor_.DecompressData(compressed_headers, &visitor_));
     36 
     37   EXPECT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers), visitor_.data());
     38   EXPECT_EQ(2u, decompressor_.current_header_id());
     39 }
     40 
     41 TEST_F(QuicSpdyDecompressorTest, DecompressPartial) {
     42   SpdyHeaderBlock headers;
     43   headers[":host"] = "www.google.com";
     44   headers[":path"] = "/index.hml";
     45   headers[":scheme"] = "https";
     46   string compressed_headers = compressor_.CompressHeaders(headers).substr(4);
     47 
     48   for (size_t i = 0; i < compressed_headers.length(); ++i) {
     49     QuicSpdyDecompressor decompressor;
     50     TestDecompressorVisitor visitor;
     51 
     52     EXPECT_EQ(1u, decompressor.current_header_id());
     53 
     54     string partial_compressed_headers = compressed_headers.substr(0, i);
     55     EXPECT_EQ(partial_compressed_headers.length(),
     56               decompressor.DecompressData(partial_compressed_headers,
     57                                           &visitor));
     58     EXPECT_EQ(1u, decompressor.current_header_id()) << "i: " << i;
     59 
     60     string remaining_compressed_headers =
     61         compressed_headers.substr(partial_compressed_headers.length());
     62     EXPECT_EQ(remaining_compressed_headers.length(),
     63               decompressor.DecompressData(remaining_compressed_headers,
     64                                           &visitor));
     65     EXPECT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers), visitor.data());
     66 
     67     EXPECT_EQ(2u, decompressor.current_header_id());
     68   }
     69 }
     70 
     71 TEST_F(QuicSpdyDecompressorTest, DecompressAndIgnoreTrailingData) {
     72   SpdyHeaderBlock headers;
     73   headers[":host"] = "www.google.com";
     74   headers[":path"] = "/index.hml";
     75   headers[":scheme"] = "https";
     76 
     77   string compressed_headers = compressor_.CompressHeaders(headers).substr(4);
     78   EXPECT_EQ(compressed_headers.length(),
     79             decompressor_.DecompressData(compressed_headers + "abc123",
     80                                         &visitor_));
     81 
     82   EXPECT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers), visitor_.data());
     83 }
     84 
     85 TEST_F(QuicSpdyDecompressorTest, DecompressError) {
     86   SpdyHeaderBlock headers;
     87   headers[":host"] = "www.google.com";
     88   headers[":path"] = "/index.hml";
     89   headers[":scheme"] = "https";
     90 
     91   EXPECT_EQ(1u, decompressor_.current_header_id());
     92   string compressed_headers = compressor_.CompressHeaders(headers).substr(4);
     93   compressed_headers[compressed_headers.length() - 1] ^= 0x01;
     94   EXPECT_NE(compressed_headers.length(),
     95             decompressor_.DecompressData(compressed_headers, &visitor_));
     96 
     97   EXPECT_TRUE(visitor_.error());
     98   EXPECT_EQ("", visitor_.data());
     99 }
    100 
    101 }  // namespace
    102 }  // namespace test
    103 }  // namespace net
    104