OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 // | |
5 #include "net/quic/quic_write_blocked_list.h" | |
6 | |
7 #include "net/quic/test_tools/quic_test_utils.h" | |
8 #include "testing/gtest/include/gtest/gtest.h" | |
9 | |
10 namespace net { | |
11 namespace test { | |
12 namespace { | |
13 | |
14 TEST(QuicWriteBlockedListTest, PriorityOrder) { | |
15 QuicWriteBlockedList write_blocked_list; | |
16 | |
17 // Mark streams blocked in roughly reverse priority order, and | |
18 // verify that streams are sorted. | |
19 write_blocked_list.PushBack(40, | |
20 QuicWriteBlockedList::kLowestPriority); | |
21 write_blocked_list.PushBack(23, | |
22 QuicWriteBlockedList::kHighestPriority); | |
23 write_blocked_list.PushBack(17, | |
24 QuicWriteBlockedList::kHighestPriority); | |
25 write_blocked_list.PushBack(kHeadersStreamId, | |
26 QuicWriteBlockedList::kHighestPriority); | |
27 write_blocked_list.PushBack(kCryptoStreamId, | |
28 QuicWriteBlockedList::kHighestPriority); | |
29 | |
30 EXPECT_EQ(5u, write_blocked_list.NumBlockedStreams()); | |
31 EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); | |
32 EXPECT_TRUE(write_blocked_list.HasWriteBlockedDataStreams()); | |
33 // The Crypto stream is highest priority. | |
34 EXPECT_EQ(kCryptoStreamId, write_blocked_list.PopFront()); | |
35 // Followed by the Headers stream. | |
36 EXPECT_EQ(kHeadersStreamId, write_blocked_list.PopFront()); | |
37 // Streams with same priority are popped in the order they were inserted. | |
38 EXPECT_EQ(23u, write_blocked_list.PopFront()); | |
39 EXPECT_EQ(17u, write_blocked_list.PopFront()); | |
40 // Low priority stream appears last. | |
41 EXPECT_EQ(40u, write_blocked_list.PopFront()); | |
42 | |
43 EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams()); | |
44 EXPECT_FALSE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); | |
45 EXPECT_FALSE(write_blocked_list.HasWriteBlockedDataStreams()); | |
46 } | |
47 | |
48 TEST(QuicWriteBlockedListTest, CryptoStream) { | |
49 QuicWriteBlockedList write_blocked_list; | |
50 write_blocked_list.PushBack(kCryptoStreamId, | |
51 QuicWriteBlockedList::kHighestPriority); | |
52 | |
53 EXPECT_EQ(1u, write_blocked_list.NumBlockedStreams()); | |
54 EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); | |
55 EXPECT_EQ(kCryptoStreamId, write_blocked_list.PopFront()); | |
56 EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams()); | |
57 EXPECT_FALSE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); | |
58 } | |
59 | |
60 TEST(QuicWriteBlockedListTest, HeadersStream) { | |
61 QuicWriteBlockedList write_blocked_list; | |
62 write_blocked_list.PushBack(kHeadersStreamId, | |
63 QuicWriteBlockedList::kHighestPriority); | |
64 | |
65 EXPECT_EQ(1u, write_blocked_list.NumBlockedStreams()); | |
66 EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); | |
67 EXPECT_EQ(kHeadersStreamId, write_blocked_list.PopFront()); | |
68 EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams()); | |
69 EXPECT_FALSE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); | |
70 } | |
71 | |
72 TEST(QuicWriteBlockedListTest, VerifyHeadersStream) { | |
73 QuicWriteBlockedList write_blocked_list; | |
74 write_blocked_list.PushBack(5, | |
75 QuicWriteBlockedList::kHighestPriority); | |
76 write_blocked_list.PushBack(kHeadersStreamId, | |
77 QuicWriteBlockedList::kHighestPriority); | |
78 | |
79 EXPECT_EQ(2u, write_blocked_list.NumBlockedStreams()); | |
80 EXPECT_TRUE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); | |
81 EXPECT_TRUE(write_blocked_list.HasWriteBlockedDataStreams()); | |
82 // In newer QUIC versions, there is a headers stream which is | |
83 // higher priority than data streams. | |
84 EXPECT_EQ(kHeadersStreamId, write_blocked_list.PopFront()); | |
85 EXPECT_EQ(5u, write_blocked_list.PopFront()); | |
86 EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams()); | |
87 EXPECT_FALSE(write_blocked_list.HasWriteBlockedCryptoOrHeadersStream()); | |
88 EXPECT_FALSE(write_blocked_list.HasWriteBlockedDataStreams()); | |
89 } | |
90 | |
91 TEST(QuicWriteBlockedListTest, NoDuplicateEntries) { | |
92 // Test that QuicWriteBlockedList doesn't allow duplicate entries. | |
93 QuicWriteBlockedList write_blocked_list; | |
94 | |
95 // Try to add a stream to the write blocked list multiple times at the same | |
96 // priority. | |
97 const QuicStreamId kBlockedId = kClientDataStreamId1; | |
98 write_blocked_list.PushBack(kBlockedId, | |
99 QuicWriteBlockedList::kHighestPriority); | |
100 write_blocked_list.PushBack(kBlockedId, | |
101 QuicWriteBlockedList::kHighestPriority); | |
102 write_blocked_list.PushBack(kBlockedId, | |
103 QuicWriteBlockedList::kHighestPriority); | |
104 | |
105 // This should only result in one blocked stream being added. | |
106 EXPECT_EQ(1u, write_blocked_list.NumBlockedStreams()); | |
107 EXPECT_TRUE(write_blocked_list.HasWriteBlockedDataStreams()); | |
108 | |
109 // There should only be one stream to pop off the front. | |
110 EXPECT_EQ(kBlockedId, write_blocked_list.PopFront()); | |
111 EXPECT_EQ(0u, write_blocked_list.NumBlockedStreams()); | |
112 EXPECT_FALSE(write_blocked_list.HasWriteBlockedDataStreams()); | |
113 } | |
114 | |
115 } // namespace | |
116 } // namespace test | |
117 } // namespace net | |
OLD | NEW |