| 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/spdy/hpack_huffman_table.h" | 5 #include "net/spdy/hpack_huffman_table.h" |
| 6 | 6 |
| 7 #include <bitset> | 7 #include <bitset> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "net/spdy/hpack_constants.h" | 11 #include "net/spdy/hpack_constants.h" |
| 12 #include "net/spdy/hpack_input_stream.h" | 12 #include "net/spdy/hpack_input_stream.h" |
| 13 #include "net/spdy/hpack_output_stream.h" | 13 #include "net/spdy/hpack_output_stream.h" |
| 14 #include "net/spdy/spdy_test_utils.h" | 14 #include "net/spdy/spdy_test_utils.h" |
| 15 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 | 17 |
| 18 using base::StringPiece; | 18 using base::StringPiece; |
| 19 using net::test::a2b_hex; | 19 using net::test::a2b_hex; |
| 20 using std::string; | 20 using std::string; |
| 21 using testing::ElementsAre; | |
| 22 using testing::ElementsAreArray; | 21 using testing::ElementsAreArray; |
| 23 using testing::Pointwise; | 22 using testing::Pointwise; |
| 24 | 23 |
| 25 namespace net { | 24 namespace net { |
| 26 | 25 |
| 27 namespace test { | 26 namespace test { |
| 28 | 27 |
| 29 typedef HpackHuffmanTable::DecodeEntry DecodeEntry; | 28 typedef HpackHuffmanTable::DecodeEntry DecodeEntry; |
| 30 typedef HpackHuffmanTable::DecodeTable DecodeTable; | 29 typedef HpackHuffmanTable::DecodeTable DecodeTable; |
| 31 | 30 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 48 return static_cast<char>(table_.pad_bits_); | 47 return static_cast<char>(table_.pad_bits_); |
| 49 } | 48 } |
| 50 uint16 failed_symbol_id() const { | 49 uint16 failed_symbol_id() const { |
| 51 return table_.failed_symbol_id_; | 50 return table_.failed_symbol_id_; |
| 52 } | 51 } |
| 53 std::vector<DecodeEntry> decode_entries(const DecodeTable& decode_table) { | 52 std::vector<DecodeEntry> decode_entries(const DecodeTable& decode_table) { |
| 54 std::vector<DecodeEntry>::const_iterator begin = | 53 std::vector<DecodeEntry>::const_iterator begin = |
| 55 table_.decode_entries_.begin() + decode_table.entries_offset; | 54 table_.decode_entries_.begin() + decode_table.entries_offset; |
| 56 return std::vector<DecodeEntry>(begin, begin + decode_table.size()); | 55 return std::vector<DecodeEntry>(begin, begin + decode_table.size()); |
| 57 } | 56 } |
| 58 void DumpDecodeTable(const DecodeTable& table) { | |
| 59 std::vector<DecodeEntry> entries = decode_entries(table); | |
| 60 LOG(INFO) << "Table size " << (1 << table.indexed_length) | |
| 61 << " prefix " << unsigned(table.prefix_length) | |
| 62 << " indexed " << unsigned(table.indexed_length); | |
| 63 size_t i = 0; | |
| 64 while (i != table.size()) { | |
| 65 const DecodeEntry& entry = entries[i]; | |
| 66 LOG(INFO) << i << ":" | |
| 67 << " next_table " << unsigned(entry.next_table_index) | |
| 68 << " length " << unsigned(entry.length) | |
| 69 << " symbol " << unsigned(entry.symbol_id); | |
| 70 size_t j = 1; | |
| 71 for (; (i + j) != table.size(); j++) { | |
| 72 const DecodeEntry& next = entries[i + j]; | |
| 73 if (next.next_table_index != entry.next_table_index || | |
| 74 next.length != entry.length || | |
| 75 next.symbol_id != entry.symbol_id) | |
| 76 break; | |
| 77 } | |
| 78 if (j > 1) { | |
| 79 LOG(INFO) << " (repeats " << j << " times)"; | |
| 80 } | |
| 81 i += j; | |
| 82 } | |
| 83 } | |
| 84 | 57 |
| 85 private: | 58 private: |
| 86 const HpackHuffmanTable& table_; | 59 const HpackHuffmanTable& table_; |
| 87 }; | 60 }; |
| 88 | 61 |
| 89 namespace { | 62 namespace { |
| 90 | 63 |
| 91 class HpackHuffmanTableTest : public ::testing::Test { | 64 class HpackHuffmanTableTest : public ::testing::Test { |
| 92 protected: | 65 protected: |
| 93 HpackHuffmanTableTest() | 66 HpackHuffmanTableTest() |
| (...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 output_stream.TakeString(&encoding); | 479 output_stream.TakeString(&encoding); |
| 507 EXPECT_EQ(encoding.size(), table_.EncodedSize(test_table[i])); | 480 EXPECT_EQ(encoding.size(), table_.EncodedSize(test_table[i])); |
| 508 } | 481 } |
| 509 } | 482 } |
| 510 | 483 |
| 511 } // namespace | 484 } // namespace |
| 512 | 485 |
| 513 } // namespace test | 486 } // namespace test |
| 514 | 487 |
| 515 } // namespace net | 488 } // namespace net |
| OLD | NEW |