OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 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_protocol.h" | |
6 | |
7 #include "base/stl_util.h" | |
8 #include "testing/gtest/include/gtest/gtest.h" | |
9 | |
10 namespace net { | |
11 namespace test { | |
12 namespace { | |
13 | |
14 TEST(QuicProtocolTest, AdjustErrorForVersion) { | |
15 ASSERT_EQ(8, QUIC_STREAM_LAST_ERROR) | |
16 << "Any additions to QuicRstStreamErrorCode require an addition to " | |
17 << "AdjustErrorForVersion and this associated test."; | |
18 | |
19 // If we ever add different RST codes, we should have a test akin to the | |
20 // following. | |
21 // EXPECT_EQ(QUIC_RST_ACKNOWLEDGEMENT, AdjustErrorForVersion( | |
22 // QUIC_RST_ACKNOWLEDGEMENT, | |
23 // QUIC_VERSION_23)); | |
24 } | |
25 | |
26 TEST(QuicProtocolTest, MakeQuicTag) { | |
27 QuicTag tag = MakeQuicTag('A', 'B', 'C', 'D'); | |
28 char bytes[4]; | |
29 memcpy(bytes, &tag, 4); | |
30 EXPECT_EQ('A', bytes[0]); | |
31 EXPECT_EQ('B', bytes[1]); | |
32 EXPECT_EQ('C', bytes[2]); | |
33 EXPECT_EQ('D', bytes[3]); | |
34 } | |
35 | |
36 TEST(QuicProtocolTest, IsAawaitingPacket) { | |
37 QuicAckFrame ack_frame; | |
38 ack_frame.largest_observed = 10u; | |
39 EXPECT_TRUE(IsAwaitingPacket(ack_frame, 11u)); | |
40 EXPECT_FALSE(IsAwaitingPacket(ack_frame, 1u)); | |
41 | |
42 ack_frame.missing_packets.insert(10); | |
43 EXPECT_TRUE(IsAwaitingPacket(ack_frame, 10u)); | |
44 } | |
45 | |
46 TEST(QuicProtocolTest, InsertMissingPacketsBetween) { | |
47 QuicAckFrame ack_frame; | |
48 InsertMissingPacketsBetween(&ack_frame, 4u, 10u); | |
49 EXPECT_EQ(6u, ack_frame.missing_packets.size()); | |
50 | |
51 QuicPacketSequenceNumber i = 4; | |
52 for (SequenceNumberSet::iterator it = ack_frame.missing_packets.begin(); | |
53 it != ack_frame.missing_packets.end(); ++it, ++i) { | |
54 EXPECT_EQ(i, *it); | |
55 } | |
56 } | |
57 | |
58 TEST(QuicProtocolTest, QuicVersionToQuicTag) { | |
59 // If you add a new version to the QuicVersion enum you will need to add a new | |
60 // case to QuicVersionToQuicTag, otherwise this test will fail. | |
61 | |
62 // TODO(rtenneti): Enable checking of Log(ERROR) messages. | |
63 #if 0 | |
64 // Any logs would indicate an unsupported version which we don't expect. | |
65 ScopedMockLog log(kDoNotCaptureLogsYet); | |
66 EXPECT_CALL(log, Log(_, _, _)).Times(0); | |
67 log.StartCapturingLogs(); | |
68 #endif | |
69 | |
70 // Explicitly test a specific version. | |
71 EXPECT_EQ(MakeQuicTag('Q', '0', '2', '3'), | |
72 QuicVersionToQuicTag(QUIC_VERSION_23)); | |
73 | |
74 // Loop over all supported versions and make sure that we never hit the | |
75 // default case (i.e. all supported versions should be successfully converted | |
76 // to valid QuicTags). | |
77 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { | |
78 QuicVersion version = kSupportedQuicVersions[i]; | |
79 EXPECT_LT(0u, QuicVersionToQuicTag(version)); | |
80 } | |
81 } | |
82 | |
83 TEST(QuicProtocolTest, QuicVersionToQuicTagUnsupported) { | |
84 // TODO(rtenneti): Enable checking of Log(ERROR) messages. | |
85 #if 0 | |
86 // TODO(rjshade): Change to DFATAL once we actually support multiple versions, | |
87 // and QuicConnectionTest::SendVersionNegotiationPacket can be changed to use | |
88 // mis-matched versions rather than relying on QUIC_VERSION_UNSUPPORTED. | |
89 ScopedMockLog log(kDoNotCaptureLogsYet); | |
90 EXPECT_CALL(log, Log(ERROR, _, "Unsupported QuicVersion: 0")).Times(1); | |
91 log.StartCapturingLogs(); | |
92 #endif | |
93 | |
94 EXPECT_EQ(0u, QuicVersionToQuicTag(QUIC_VERSION_UNSUPPORTED)); | |
95 } | |
96 | |
97 TEST(QuicProtocolTest, QuicTagToQuicVersion) { | |
98 // If you add a new version to the QuicVersion enum you will need to add a new | |
99 // case to QuicTagToQuicVersion, otherwise this test will fail. | |
100 | |
101 // TODO(rtenneti): Enable checking of Log(ERROR) messages. | |
102 #if 0 | |
103 // Any logs would indicate an unsupported version which we don't expect. | |
104 ScopedMockLog log(kDoNotCaptureLogsYet); | |
105 EXPECT_CALL(log, Log(_, _, _)).Times(0); | |
106 log.StartCapturingLogs(); | |
107 #endif | |
108 | |
109 // Explicitly test specific versions. | |
110 EXPECT_EQ(QUIC_VERSION_23, | |
111 QuicTagToQuicVersion(MakeQuicTag('Q', '0', '2', '3'))); | |
112 | |
113 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { | |
114 QuicVersion version = kSupportedQuicVersions[i]; | |
115 | |
116 // Get the tag from the version (we can loop over QuicVersions easily). | |
117 QuicTag tag = QuicVersionToQuicTag(version); | |
118 EXPECT_LT(0u, tag); | |
119 | |
120 // Now try converting back. | |
121 QuicVersion tag_to_quic_version = QuicTagToQuicVersion(tag); | |
122 EXPECT_EQ(version, tag_to_quic_version); | |
123 EXPECT_NE(QUIC_VERSION_UNSUPPORTED, tag_to_quic_version); | |
124 } | |
125 } | |
126 | |
127 TEST(QuicProtocolTest, QuicTagToQuicVersionUnsupported) { | |
128 // TODO(rtenneti): Enable checking of Log(ERROR) messages. | |
129 #if 0 | |
130 ScopedMockLog log(kDoNotCaptureLogsYet); | |
131 #ifndef NDEBUG | |
132 EXPECT_CALL(log, Log(INFO, _, "Unsupported QuicTag version: FAKE")).Times(1); | |
133 #endif | |
134 log.StartCapturingLogs(); | |
135 #endif | |
136 | |
137 EXPECT_EQ(QUIC_VERSION_UNSUPPORTED, | |
138 QuicTagToQuicVersion(MakeQuicTag('F', 'A', 'K', 'E'))); | |
139 } | |
140 | |
141 TEST(QuicProtocolTest, QuicVersionToString) { | |
142 EXPECT_EQ("QUIC_VERSION_23", QuicVersionToString(QUIC_VERSION_23)); | |
143 EXPECT_EQ("QUIC_VERSION_UNSUPPORTED", | |
144 QuicVersionToString(QUIC_VERSION_UNSUPPORTED)); | |
145 | |
146 QuicVersion single_version[] = {QUIC_VERSION_23}; | |
147 QuicVersionVector versions_vector; | |
148 for (size_t i = 0; i < arraysize(single_version); ++i) { | |
149 versions_vector.push_back(single_version[i]); | |
150 } | |
151 EXPECT_EQ("QUIC_VERSION_23", QuicVersionVectorToString(versions_vector)); | |
152 | |
153 QuicVersion multiple_versions[] = {QUIC_VERSION_UNSUPPORTED, QUIC_VERSION_23}; | |
154 versions_vector.clear(); | |
155 for (size_t i = 0; i < arraysize(multiple_versions); ++i) { | |
156 versions_vector.push_back(multiple_versions[i]); | |
157 } | |
158 EXPECT_EQ("QUIC_VERSION_UNSUPPORTED,QUIC_VERSION_23", | |
159 QuicVersionVectorToString(versions_vector)); | |
160 | |
161 // Make sure that all supported versions are present in QuicVersionToString. | |
162 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { | |
163 QuicVersion version = kSupportedQuicVersions[i]; | |
164 EXPECT_NE("QUIC_VERSION_UNSUPPORTED", QuicVersionToString(version)); | |
165 } | |
166 } | |
167 | |
168 } // namespace | |
169 } // namespace test | |
170 } // namespace net | |
OLD | NEW |