| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/write_blocked_list.h" | 5 #include "net/spdy/write_blocked_list.h" |
| 6 | 6 |
| 7 #include <deque> | 7 #include <deque> |
| 8 | 8 |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 | 10 |
| 11 namespace net { | 11 namespace net { |
| 12 namespace test { | 12 namespace test { |
| 13 | 13 |
| 14 class WriteBlockedListPeer { | 14 class WriteBlockedListPeer { |
| 15 public: | 15 public: |
| 16 static std::deque<int>* GetWriteBlockedList(int i, | 16 static std::deque<int>* GetWriteBlockedList(int i, |
| 17 WriteBlockedList<int>* list) { | 17 WriteBlockedList<int>* list) { |
| 18 return &list->write_blocked_lists_[i]; | 18 return &list->write_blocked_lists_[i]; |
| 19 } | 19 } |
| 20 }; | 20 }; |
| 21 | 21 |
| 22 namespace { | 22 namespace { |
| 23 | 23 |
| 24 typedef WriteBlockedList<int> IntWriteBlockedList; | 24 typedef WriteBlockedList<int> IntWriteBlockedList; |
| 25 | 25 |
| 26 class WriteBlockedListTest : public ::testing::TestWithParam<bool> { | 26 class WriteBlockedListTest : public ::testing::Test { |
| 27 public: | 27 public: |
| 28 WriteBlockedListTest() : list(GetParam()) {} | |
| 29 | |
| 30 IntWriteBlockedList list; | 28 IntWriteBlockedList list; |
| 31 }; | 29 }; |
| 32 | 30 |
| 33 TEST_P(WriteBlockedListTest, GetHighestPriority) { | 31 TEST_F(WriteBlockedListTest, GetHighestPriority) { |
| 34 EXPECT_FALSE(list.HasWriteBlockedStreams()); | 32 EXPECT_FALSE(list.HasWriteBlockedStreams()); |
| 35 list.PushBack(1, 1); | 33 list.PushBack(1, 1); |
| 36 EXPECT_TRUE(list.HasWriteBlockedStreams()); | 34 EXPECT_TRUE(list.HasWriteBlockedStreams()); |
| 37 EXPECT_EQ(1, list.GetHighestPriorityWriteBlockedList()); | 35 EXPECT_EQ(1, list.GetHighestPriorityWriteBlockedList()); |
| 38 list.PushBack(1, 0); | 36 list.PushBack(1, 0); |
| 39 EXPECT_TRUE(list.HasWriteBlockedStreams()); | 37 EXPECT_TRUE(list.HasWriteBlockedStreams()); |
| 40 EXPECT_EQ(0, list.GetHighestPriorityWriteBlockedList()); | 38 EXPECT_EQ(0, list.GetHighestPriorityWriteBlockedList()); |
| 41 } | 39 } |
| 42 | 40 |
| 43 TEST_P(WriteBlockedListTest, HasWriteBlockedStreamsOfGreaterThanPriority) { | 41 TEST_F(WriteBlockedListTest, HasWriteBlockedStreamsOfGreaterThanPriority) { |
| 44 list.PushBack(1, 4); | 42 list.PushBack(1, 4); |
| 45 EXPECT_TRUE(list.HasWriteBlockedStreamsGreaterThanPriority(5)); | 43 EXPECT_TRUE(list.HasWriteBlockedStreamsGreaterThanPriority(5)); |
| 46 EXPECT_FALSE(list.HasWriteBlockedStreamsGreaterThanPriority(4)); | 44 EXPECT_FALSE(list.HasWriteBlockedStreamsGreaterThanPriority(4)); |
| 47 list.PushBack(2, 2); | 45 list.PushBack(2, 2); |
| 48 EXPECT_TRUE(list.HasWriteBlockedStreamsGreaterThanPriority(3)); | 46 EXPECT_TRUE(list.HasWriteBlockedStreamsGreaterThanPriority(3)); |
| 49 EXPECT_FALSE(list.HasWriteBlockedStreamsGreaterThanPriority(2)); | 47 EXPECT_FALSE(list.HasWriteBlockedStreamsGreaterThanPriority(2)); |
| 50 } | 48 } |
| 51 | 49 |
| 52 TEST_P(WriteBlockedListTest, RemoveStreamFromWriteBlockedList) { | 50 TEST_F(WriteBlockedListTest, RemoveStreamFromWriteBlockedList) { |
| 53 list.PushBack(1, 4); | 51 list.PushBack(1, 4); |
| 54 EXPECT_TRUE(list.HasWriteBlockedStreams()); | 52 EXPECT_TRUE(list.HasWriteBlockedStreams()); |
| 55 | 53 |
| 56 list.RemoveStreamFromWriteBlockedList(1, 5); | 54 list.RemoveStreamFromWriteBlockedList(1, 5); |
| 57 EXPECT_TRUE(list.HasWriteBlockedStreams()); | 55 EXPECT_TRUE(list.HasWriteBlockedStreams()); |
| 58 | 56 |
| 59 list.PushBack(2, 4); | 57 list.PushBack(2, 4); |
| 60 list.PushBack(1, 4); | 58 list.PushBack(1, 4); |
| 61 list.RemoveStreamFromWriteBlockedList(1, 4); | 59 list.RemoveStreamFromWriteBlockedList(1, 4); |
| 62 list.RemoveStreamFromWriteBlockedList(2, 4); | 60 list.RemoveStreamFromWriteBlockedList(2, 4); |
| 63 EXPECT_FALSE(list.HasWriteBlockedStreams()); | 61 EXPECT_FALSE(list.HasWriteBlockedStreams()); |
| 64 | 62 |
| 65 list.PushBack(1, 7); | 63 list.PushBack(1, 7); |
| 66 EXPECT_TRUE(list.HasWriteBlockedStreams()); | 64 EXPECT_TRUE(list.HasWriteBlockedStreams()); |
| 67 } | 65 } |
| 68 | 66 |
| 69 TEST_P(WriteBlockedListTest, PopFront) { | 67 TEST_F(WriteBlockedListTest, PopFront) { |
| 70 list.PushBack(1, 4); | 68 list.PushBack(1, 4); |
| 71 EXPECT_EQ(1u, list.NumBlockedStreams()); | 69 EXPECT_EQ(1u, list.NumBlockedStreams()); |
| 72 list.PushBack(2, 4); | 70 list.PushBack(2, 4); |
| 73 list.PushBack(1, 4); | 71 list.PushBack(1, 4); |
| 74 list.PushBack(3, 4); | 72 list.PushBack(3, 4); |
| 75 if (GetParam()) { | 73 EXPECT_EQ(3u, list.NumBlockedStreams()); |
| 76 EXPECT_EQ(3u, list.NumBlockedStreams()); | |
| 77 } else { | |
| 78 EXPECT_EQ(4u, list.NumBlockedStreams()); | |
| 79 } | |
| 80 | 74 |
| 81 EXPECT_EQ(1, list.PopFront(4)); | 75 EXPECT_EQ(1, list.PopFront(4)); |
| 82 EXPECT_EQ(2, list.PopFront(4)); | 76 EXPECT_EQ(2, list.PopFront(4)); |
| 83 EXPECT_EQ(1, list.PopFront(4)); | |
| 84 if (!GetParam()) { | |
| 85 EXPECT_EQ(1, list.PopFront(4)); | |
| 86 } | |
| 87 EXPECT_EQ(1u, list.NumBlockedStreams()); | 77 EXPECT_EQ(1u, list.NumBlockedStreams()); |
| 88 EXPECT_EQ(3, list.PopFront(4)); | 78 EXPECT_EQ(3, list.PopFront(4)); |
| 89 } | 79 } |
| 90 | 80 |
| 91 TEST_P(WriteBlockedListTest, UpdateStreamPriorityInWriteBlockedList) { | 81 TEST_F(WriteBlockedListTest, UpdateStreamPriorityInWriteBlockedList) { |
| 92 if (GetParam()) { | 82 list.PushBack(1, 1); |
| 93 list.PushBack(1, 1); | 83 list.PushBack(2, 2); |
| 94 list.PushBack(2, 2); | 84 list.PushBack(3, 3); |
| 95 list.PushBack(3, 3); | 85 list.PushBack(1, 3); // Re-prioritizes stream 1 at priority 3. |
| 96 list.PushBack(1, 3); // Re-prioritizes stream 1 at priority 3. | 86 list.PushBack(1, 3); // No effect. |
| 97 list.PushBack(1, 3); // No effect. | 87 EXPECT_EQ(3u, list.NumBlockedStreams()); |
| 98 EXPECT_EQ(3u, list.NumBlockedStreams()); | 88 EXPECT_EQ(0u, WriteBlockedListPeer::GetWriteBlockedList(1, &list)->size()); |
| 99 EXPECT_EQ(0u, WriteBlockedListPeer::GetWriteBlockedList(1, &list)->size()); | 89 EXPECT_EQ(1u, WriteBlockedListPeer::GetWriteBlockedList(2, &list)->size()); |
| 100 EXPECT_EQ(1u, WriteBlockedListPeer::GetWriteBlockedList(2, &list)->size()); | 90 EXPECT_EQ(2u, WriteBlockedListPeer::GetWriteBlockedList(3, &list)->size()); |
| 101 EXPECT_EQ(2u, WriteBlockedListPeer::GetWriteBlockedList(3, &list)->size()); | |
| 102 | 91 |
| 103 list.UpdateStreamPriorityInWriteBlockedList(1, 3, 2); | 92 list.UpdateStreamPriorityInWriteBlockedList(1, 3, 2); |
| 104 EXPECT_EQ(0u, WriteBlockedListPeer::GetWriteBlockedList(1, &list)->size()); | 93 EXPECT_EQ(0u, WriteBlockedListPeer::GetWriteBlockedList(1, &list)->size()); |
| 105 EXPECT_EQ(2u, WriteBlockedListPeer::GetWriteBlockedList(2, &list)->size()); | 94 EXPECT_EQ(2u, WriteBlockedListPeer::GetWriteBlockedList(2, &list)->size()); |
| 106 list.UpdateStreamPriorityInWriteBlockedList(3, 3, 1); | 95 list.UpdateStreamPriorityInWriteBlockedList(3, 3, 1); |
| 107 EXPECT_EQ(1u, WriteBlockedListPeer::GetWriteBlockedList(1, &list)->size()); | 96 EXPECT_EQ(1u, WriteBlockedListPeer::GetWriteBlockedList(1, &list)->size()); |
| 108 EXPECT_EQ(0u, WriteBlockedListPeer::GetWriteBlockedList(3, &list)->size()); | 97 EXPECT_EQ(0u, WriteBlockedListPeer::GetWriteBlockedList(3, &list)->size()); |
| 109 | 98 |
| 110 // Redundant update. | 99 // Redundant update. |
| 111 list.UpdateStreamPriorityInWriteBlockedList(1, 2, 2); | 100 list.UpdateStreamPriorityInWriteBlockedList(1, 2, 2); |
| 112 EXPECT_EQ(2u, WriteBlockedListPeer::GetWriteBlockedList(2, &list)->size()); | 101 EXPECT_EQ(2u, WriteBlockedListPeer::GetWriteBlockedList(2, &list)->size()); |
| 113 | 102 |
| 114 // No entries for given stream_id / old_priority pair. | 103 // No entries for given stream_id / old_priority pair. |
| 115 list.UpdateStreamPriorityInWriteBlockedList(4, 4, 1); | 104 list.UpdateStreamPriorityInWriteBlockedList(4, 4, 1); |
| 116 EXPECT_EQ(1u, WriteBlockedListPeer::GetWriteBlockedList(1, &list)->size()); | 105 EXPECT_EQ(1u, WriteBlockedListPeer::GetWriteBlockedList(1, &list)->size()); |
| 117 EXPECT_EQ(2u, WriteBlockedListPeer::GetWriteBlockedList(2, &list)->size()); | 106 EXPECT_EQ(2u, WriteBlockedListPeer::GetWriteBlockedList(2, &list)->size()); |
| 118 EXPECT_EQ(0u, WriteBlockedListPeer::GetWriteBlockedList(4, &list)->size()); | 107 EXPECT_EQ(0u, WriteBlockedListPeer::GetWriteBlockedList(4, &list)->size()); |
| 119 | 108 |
| 120 EXPECT_EQ(3, list.PopFront(1)); | 109 EXPECT_EQ(3, list.PopFront(1)); |
| 121 EXPECT_EQ(2, list.PopFront(2)); | 110 EXPECT_EQ(2, list.PopFront(2)); |
| 122 EXPECT_EQ(1, list.PopFront(2)); | 111 EXPECT_EQ(1, list.PopFront(2)); |
| 123 EXPECT_EQ(0u, list.NumBlockedStreams()); | 112 EXPECT_EQ(0u, list.NumBlockedStreams()); |
| 124 } else { | |
| 125 list.PushBack(1, 1); | |
| 126 list.PushBack(2, 2); | |
| 127 list.PushBack(3, 3); | |
| 128 list.PushBack(1, 3); | |
| 129 list.PushBack(1, 3); | |
| 130 EXPECT_EQ(5u, list.NumBlockedStreams()); | |
| 131 EXPECT_EQ(1u, WriteBlockedListPeer::GetWriteBlockedList(1, &list)->size()); | |
| 132 EXPECT_EQ(1u, WriteBlockedListPeer::GetWriteBlockedList(2, &list)->size()); | |
| 133 EXPECT_EQ(3u, WriteBlockedListPeer::GetWriteBlockedList(3, &list)->size()); | |
| 134 | |
| 135 list.UpdateStreamPriorityInWriteBlockedList(1, 1, 2); | |
| 136 EXPECT_EQ(0u, WriteBlockedListPeer::GetWriteBlockedList(1, &list)->size()); | |
| 137 EXPECT_EQ(2u, WriteBlockedListPeer::GetWriteBlockedList(2, &list)->size()); | |
| 138 list.UpdateStreamPriorityInWriteBlockedList(3, 3, 1); | |
| 139 EXPECT_EQ(1u, WriteBlockedListPeer::GetWriteBlockedList(1, &list)->size()); | |
| 140 EXPECT_EQ(2u, WriteBlockedListPeer::GetWriteBlockedList(3, &list)->size()); | |
| 141 | |
| 142 // Redundant update. | |
| 143 list.UpdateStreamPriorityInWriteBlockedList(1, 3, 3); | |
| 144 EXPECT_EQ(2u, WriteBlockedListPeer::GetWriteBlockedList(3, &list)->size()); | |
| 145 | |
| 146 // No entries for given stream_id / old_priority pair. | |
| 147 list.UpdateStreamPriorityInWriteBlockedList(4, 4, 1); | |
| 148 EXPECT_EQ(1u, WriteBlockedListPeer::GetWriteBlockedList(1, &list)->size()); | |
| 149 EXPECT_EQ(2u, WriteBlockedListPeer::GetWriteBlockedList(2, &list)->size()); | |
| 150 EXPECT_EQ(0u, WriteBlockedListPeer::GetWriteBlockedList(4, &list)->size()); | |
| 151 | |
| 152 // Update multiple entries. | |
| 153 list.UpdateStreamPriorityInWriteBlockedList(1, 3, 4); | |
| 154 EXPECT_EQ(0u, WriteBlockedListPeer::GetWriteBlockedList(3, &list)->size()); | |
| 155 EXPECT_EQ(1u, WriteBlockedListPeer::GetWriteBlockedList(4, &list)->size()); | |
| 156 | |
| 157 EXPECT_EQ(3, list.PopFront(1)); | |
| 158 EXPECT_EQ(2, list.PopFront(2)); | |
| 159 EXPECT_EQ(1, list.PopFront(2)); | |
| 160 EXPECT_EQ(1, list.PopFront(4)); | |
| 161 EXPECT_EQ(0u, list.NumBlockedStreams()); | |
| 162 } | |
| 163 } | 113 } |
| 164 | 114 |
| 165 } // namespace | 115 } // namespace |
| 166 | 116 |
| 167 } // namespace test | 117 } // namespace test |
| 168 } // namespace net | 118 } // namespace net |
| OLD | NEW |