xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/core/quic_connection_id_test.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2018 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 "quiche/quic/core/quic_connection_id.h"
6 
7 #include <cstdint>
8 #include <cstring>
9 #include <string>
10 
11 #include "absl/base/macros.h"
12 #include "quiche/quic/core/quic_types.h"
13 #include "quiche/quic/platform/api/quic_test.h"
14 #include "quiche/quic/test_tools/quic_test_utils.h"
15 
16 namespace quic::test {
17 
18 namespace {
19 
20 class QuicConnectionIdTest : public QuicTest {};
21 
TEST_F(QuicConnectionIdTest,Empty)22 TEST_F(QuicConnectionIdTest, Empty) {
23   QuicConnectionId connection_id_empty = EmptyQuicConnectionId();
24   EXPECT_TRUE(connection_id_empty.IsEmpty());
25 }
26 
TEST_F(QuicConnectionIdTest,DefaultIsEmpty)27 TEST_F(QuicConnectionIdTest, DefaultIsEmpty) {
28   QuicConnectionId connection_id_empty = QuicConnectionId();
29   EXPECT_TRUE(connection_id_empty.IsEmpty());
30 }
31 
TEST_F(QuicConnectionIdTest,NotEmpty)32 TEST_F(QuicConnectionIdTest, NotEmpty) {
33   QuicConnectionId connection_id = test::TestConnectionId(1);
34   EXPECT_FALSE(connection_id.IsEmpty());
35 }
36 
TEST_F(QuicConnectionIdTest,ZeroIsNotEmpty)37 TEST_F(QuicConnectionIdTest, ZeroIsNotEmpty) {
38   QuicConnectionId connection_id = test::TestConnectionId(0);
39   EXPECT_FALSE(connection_id.IsEmpty());
40 }
41 
TEST_F(QuicConnectionIdTest,Data)42 TEST_F(QuicConnectionIdTest, Data) {
43   char connection_id_data[kQuicDefaultConnectionIdLength];
44   memset(connection_id_data, 0x42, sizeof(connection_id_data));
45   QuicConnectionId connection_id1 =
46       QuicConnectionId(connection_id_data, sizeof(connection_id_data));
47   QuicConnectionId connection_id2 =
48       QuicConnectionId(connection_id_data, sizeof(connection_id_data));
49   EXPECT_EQ(connection_id1, connection_id2);
50   EXPECT_EQ(connection_id1.length(), kQuicDefaultConnectionIdLength);
51   EXPECT_EQ(connection_id1.data(), connection_id1.mutable_data());
52   EXPECT_EQ(0, memcmp(connection_id1.data(), connection_id2.data(),
53                       sizeof(connection_id_data)));
54   EXPECT_EQ(0, memcmp(connection_id1.data(), connection_id_data,
55                       sizeof(connection_id_data)));
56   connection_id2.mutable_data()[0] = 0x33;
57   EXPECT_NE(connection_id1, connection_id2);
58   static const uint8_t kNewLength = 4;
59   connection_id2.set_length(kNewLength);
60   EXPECT_EQ(kNewLength, connection_id2.length());
61 }
62 
TEST_F(QuicConnectionIdTest,SpanData)63 TEST_F(QuicConnectionIdTest, SpanData) {
64   QuicConnectionId connection_id = QuicConnectionId({0x01, 0x02, 0x03});
65   EXPECT_EQ(connection_id.length(), 3);
66   QuicConnectionId empty_connection_id =
67       QuicConnectionId(absl::Span<uint8_t>());
68   EXPECT_EQ(empty_connection_id.length(), 0);
69   QuicConnectionId connection_id2 = QuicConnectionId({
70       0x01,
71       0x02,
72       0x03,
73       0x04,
74       0x05,
75       0x06,
76       0x07,
77       0x08,
78       0x09,
79       0x0a,
80       0x0b,
81       0x0c,
82       0x0d,
83       0x0e,
84       0x0f,
85       0x10,
86   });
87   EXPECT_EQ(connection_id2.length(), 16);
88 }
89 
TEST_F(QuicConnectionIdTest,DoubleConvert)90 TEST_F(QuicConnectionIdTest, DoubleConvert) {
91   QuicConnectionId connection_id64_1 = test::TestConnectionId(1);
92   QuicConnectionId connection_id64_2 = test::TestConnectionId(42);
93   QuicConnectionId connection_id64_3 =
94       test::TestConnectionId(UINT64_C(0xfedcba9876543210));
95   EXPECT_EQ(connection_id64_1,
96             test::TestConnectionId(
97                 test::TestConnectionIdToUInt64(connection_id64_1)));
98   EXPECT_EQ(connection_id64_2,
99             test::TestConnectionId(
100                 test::TestConnectionIdToUInt64(connection_id64_2)));
101   EXPECT_EQ(connection_id64_3,
102             test::TestConnectionId(
103                 test::TestConnectionIdToUInt64(connection_id64_3)));
104   EXPECT_NE(connection_id64_1, connection_id64_2);
105   EXPECT_NE(connection_id64_1, connection_id64_3);
106   EXPECT_NE(connection_id64_2, connection_id64_3);
107 }
108 
TEST_F(QuicConnectionIdTest,Hash)109 TEST_F(QuicConnectionIdTest, Hash) {
110   QuicConnectionId connection_id64_1 = test::TestConnectionId(1);
111   QuicConnectionId connection_id64_1b = test::TestConnectionId(1);
112   QuicConnectionId connection_id64_2 = test::TestConnectionId(42);
113   QuicConnectionId connection_id64_3 =
114       test::TestConnectionId(UINT64_C(0xfedcba9876543210));
115   EXPECT_EQ(connection_id64_1.Hash(), connection_id64_1b.Hash());
116   EXPECT_NE(connection_id64_1.Hash(), connection_id64_2.Hash());
117   EXPECT_NE(connection_id64_1.Hash(), connection_id64_3.Hash());
118   EXPECT_NE(connection_id64_2.Hash(), connection_id64_3.Hash());
119 
120   // Verify that any two all-zero connection IDs of different lengths never
121   // have the same hash.
122   const char connection_id_bytes[255] = {};
123   for (uint8_t i = 0; i < sizeof(connection_id_bytes) - 1; ++i) {
124     QuicConnectionId connection_id_i(connection_id_bytes, i);
125     for (uint8_t j = i + 1; j < sizeof(connection_id_bytes); ++j) {
126       QuicConnectionId connection_id_j(connection_id_bytes, j);
127       EXPECT_NE(connection_id_i.Hash(), connection_id_j.Hash());
128     }
129   }
130 }
131 
TEST_F(QuicConnectionIdTest,AssignAndCopy)132 TEST_F(QuicConnectionIdTest, AssignAndCopy) {
133   QuicConnectionId connection_id = test::TestConnectionId(1);
134   QuicConnectionId connection_id2 = test::TestConnectionId(2);
135   connection_id = connection_id2;
136   EXPECT_EQ(connection_id, test::TestConnectionId(2));
137   EXPECT_NE(connection_id, test::TestConnectionId(1));
138   connection_id = QuicConnectionId(test::TestConnectionId(1));
139   EXPECT_EQ(connection_id, test::TestConnectionId(1));
140   EXPECT_NE(connection_id, test::TestConnectionId(2));
141 }
142 
TEST_F(QuicConnectionIdTest,ChangeLength)143 TEST_F(QuicConnectionIdTest, ChangeLength) {
144   QuicConnectionId connection_id64_1 = test::TestConnectionId(1);
145   QuicConnectionId connection_id64_2 = test::TestConnectionId(2);
146   QuicConnectionId connection_id136_2 = test::TestConnectionId(2);
147   connection_id136_2.set_length(17);
148   memset(connection_id136_2.mutable_data() + 8, 0, 9);
149   char connection_id136_2_bytes[17] = {0, 0, 0, 0, 0, 0, 0, 2, 0,
150                                        0, 0, 0, 0, 0, 0, 0, 0};
151   QuicConnectionId connection_id136_2b(connection_id136_2_bytes,
152                                        sizeof(connection_id136_2_bytes));
153   EXPECT_EQ(connection_id136_2, connection_id136_2b);
154   QuicConnectionId connection_id = connection_id64_1;
155   connection_id.set_length(17);
156   EXPECT_NE(connection_id64_1, connection_id);
157   // Check resizing big to small.
158   connection_id.set_length(8);
159   EXPECT_EQ(connection_id64_1, connection_id);
160   // Check resizing small to big.
161   connection_id.set_length(17);
162   memset(connection_id.mutable_data(), 0, connection_id.length());
163   memcpy(connection_id.mutable_data(), connection_id64_2.data(),
164          connection_id64_2.length());
165   EXPECT_EQ(connection_id136_2, connection_id);
166   EXPECT_EQ(connection_id136_2b, connection_id);
167   QuicConnectionId connection_id120(connection_id136_2_bytes, 15);
168   connection_id.set_length(15);
169   EXPECT_EQ(connection_id120, connection_id);
170   // Check resizing big to big.
171   QuicConnectionId connection_id2 = connection_id120;
172   connection_id2.set_length(17);
173   connection_id2.mutable_data()[15] = 0;
174   connection_id2.mutable_data()[16] = 0;
175   EXPECT_EQ(connection_id136_2, connection_id2);
176   EXPECT_EQ(connection_id136_2b, connection_id2);
177 }
178 
179 }  // namespace
180 
181 }  // namespace quic::test
182