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 |