| // 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/quic/quic_sent_entropy_manager.h" |
| |
| #include <algorithm> |
| |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| using std::make_pair; |
| using std::pair; |
| |
| namespace net { |
| namespace test { |
| namespace { |
| |
| class QuicSentEntropyManagerTest : public ::testing::Test { |
| protected: |
| QuicSentEntropyManager entropy_manager_; |
| }; |
| |
| TEST_F(QuicSentEntropyManagerTest, SentEntropyHash) { |
| EXPECT_EQ(0, entropy_manager_.GetCumulativeEntropy(0)); |
| |
| QuicPacketEntropyHash entropies[4] = {12, 1, 33, 3}; |
| for (size_t i = 0; i < arraysize(entropies); ++i) { |
| entropy_manager_.RecordPacketEntropyHash(i + 1, entropies[i]); |
| } |
| |
| QuicPacketEntropyHash hash = 0; |
| for (size_t i = 0; i < arraysize(entropies); ++i) { |
| hash ^= entropies[i]; |
| EXPECT_EQ(hash, entropy_manager_.GetCumulativeEntropy(i + 1)); |
| } |
| } |
| |
| TEST_F(QuicSentEntropyManagerTest, IsValidEntropy) { |
| QuicPacketEntropyHash entropies[10] = |
| {12, 1, 33, 3, 32, 100, 28, 42, 22, 255}; |
| for (size_t i = 0; i < arraysize(entropies); ++i) { |
| entropy_manager_.RecordPacketEntropyHash(i + 1, entropies[i]); |
| } |
| |
| SequenceNumberSet missing_packets; |
| missing_packets.insert(1); |
| missing_packets.insert(4); |
| missing_packets.insert(7); |
| missing_packets.insert(8); |
| |
| QuicPacketEntropyHash entropy_hash = 0; |
| for (size_t i = 0; i < arraysize(entropies); ++i) { |
| if (missing_packets.find(i + 1) == missing_packets.end()) { |
| entropy_hash ^= entropies[i]; |
| } |
| } |
| |
| EXPECT_TRUE(entropy_manager_.IsValidEntropy(10, missing_packets, |
| entropy_hash)); |
| } |
| |
| TEST_F(QuicSentEntropyManagerTest, ClearEntropiesBefore) { |
| QuicPacketEntropyHash entropies[10] = |
| {12, 1, 33, 3, 32, 100, 28, 42, 22, 255}; |
| |
| for (size_t i = 0; i < arraysize(entropies); ++i) { |
| entropy_manager_.RecordPacketEntropyHash(i + 1, entropies[i]); |
| } |
| |
| // Discard the first 5 entropies and ensure IsValidEntropy and EntropyHash |
| // still return correct results. |
| entropy_manager_.ClearEntropyBefore(5); |
| |
| SequenceNumberSet missing_packets; |
| missing_packets.insert(7); |
| missing_packets.insert(8); |
| |
| QuicPacketEntropyHash entropy_hash = 0; |
| for (size_t i = 0; i < arraysize(entropies); ++i) { |
| if (missing_packets.find(i + 1) == missing_packets.end()) { |
| entropy_hash ^= entropies[i]; |
| } |
| } |
| EXPECT_TRUE(entropy_manager_.IsValidEntropy(10, missing_packets, |
| entropy_hash)); |
| |
| entropy_hash = 0; |
| for (size_t i = 0; i < arraysize(entropies); ++i) { |
| entropy_hash ^= entropies[i]; |
| } |
| EXPECT_EQ(entropy_hash, entropy_manager_.GetCumulativeEntropy(10)); |
| } |
| |
| } // namespace |
| } // namespace test |
| } // namespace net |