| // Copyright 2018 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "net/third_party/quiche/src/quic/core/quic_connection_id.h" | |
| #include <cstdint> | |
| #include <cstring> | |
| #include <string> | |
| #include "net/third_party/quiche/src/quic/core/quic_types.h" | |
| #include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h" | |
| #include "net/third_party/quiche/src/quic/platform/api/quic_test.h" | |
| #include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h" | |
| namespace quic { | |
| namespace { | |
| class QuicConnectionIdTest : public QuicTest {}; | |
| TEST_F(QuicConnectionIdTest, Empty) { | |
| QuicConnectionId connection_id_empty = EmptyQuicConnectionId(); | |
| EXPECT_TRUE(connection_id_empty.IsEmpty()); | |
| } | |
| TEST_F(QuicConnectionIdTest, DefaultIsEmpty) { | |
| QuicConnectionId connection_id_empty = QuicConnectionId(); | |
| EXPECT_TRUE(connection_id_empty.IsEmpty()); | |
| } | |
| TEST_F(QuicConnectionIdTest, NotEmpty) { | |
| QuicConnectionId connection_id = test::TestConnectionId(1); | |
| EXPECT_FALSE(connection_id.IsEmpty()); | |
| } | |
| TEST_F(QuicConnectionIdTest, ZeroIsNotEmpty) { | |
| QuicConnectionId connection_id = test::TestConnectionId(0); | |
| EXPECT_FALSE(connection_id.IsEmpty()); | |
| } | |
| TEST_F(QuicConnectionIdTest, Data) { | |
| char connection_id_data[kQuicDefaultConnectionIdLength]; | |
| memset(connection_id_data, 0x42, sizeof(connection_id_data)); | |
| QuicConnectionId connection_id1 = | |
| QuicConnectionId(connection_id_data, sizeof(connection_id_data)); | |
| QuicConnectionId connection_id2 = | |
| QuicConnectionId(connection_id_data, sizeof(connection_id_data)); | |
| EXPECT_EQ(connection_id1, connection_id2); | |
| EXPECT_EQ(connection_id1.length(), kQuicDefaultConnectionIdLength); | |
| EXPECT_EQ(connection_id1.data(), connection_id1.mutable_data()); | |
| EXPECT_EQ(0, memcmp(connection_id1.data(), connection_id2.data(), | |
| sizeof(connection_id_data))); | |
| EXPECT_EQ(0, memcmp(connection_id1.data(), connection_id_data, | |
| sizeof(connection_id_data))); | |
| connection_id2.mutable_data()[0] = 0x33; | |
| EXPECT_NE(connection_id1, connection_id2); | |
| static const uint8_t kNewLength = 4; | |
| connection_id2.set_length(kNewLength); | |
| EXPECT_EQ(kNewLength, connection_id2.length()); | |
| } | |
| TEST_F(QuicConnectionIdTest, DoubleConvert) { | |
| QuicConnectionId connection_id64_1 = test::TestConnectionId(1); | |
| QuicConnectionId connection_id64_2 = test::TestConnectionId(42); | |
| QuicConnectionId connection_id64_3 = | |
| test::TestConnectionId(UINT64_C(0xfedcba9876543210)); | |
| EXPECT_EQ(connection_id64_1, | |
| test::TestConnectionId( | |
| test::TestConnectionIdToUInt64(connection_id64_1))); | |
| EXPECT_EQ(connection_id64_2, | |
| test::TestConnectionId( | |
| test::TestConnectionIdToUInt64(connection_id64_2))); | |
| EXPECT_EQ(connection_id64_3, | |
| test::TestConnectionId( | |
| test::TestConnectionIdToUInt64(connection_id64_3))); | |
| EXPECT_NE(connection_id64_1, connection_id64_2); | |
| EXPECT_NE(connection_id64_1, connection_id64_3); | |
| EXPECT_NE(connection_id64_2, connection_id64_3); | |
| } | |
| TEST_F(QuicConnectionIdTest, Hash) { | |
| QuicConnectionId connection_id64_1 = test::TestConnectionId(1); | |
| QuicConnectionId connection_id64_1b = test::TestConnectionId(1); | |
| QuicConnectionId connection_id64_2 = test::TestConnectionId(42); | |
| QuicConnectionId connection_id64_3 = | |
| test::TestConnectionId(UINT64_C(0xfedcba9876543210)); | |
| EXPECT_EQ(connection_id64_1.Hash(), connection_id64_1b.Hash()); | |
| EXPECT_NE(connection_id64_1.Hash(), connection_id64_2.Hash()); | |
| EXPECT_NE(connection_id64_1.Hash(), connection_id64_3.Hash()); | |
| EXPECT_NE(connection_id64_2.Hash(), connection_id64_3.Hash()); | |
| } | |
| TEST_F(QuicConnectionIdTest, AssignAndCopy) { | |
| QuicConnectionId connection_id = test::TestConnectionId(1); | |
| QuicConnectionId connection_id2 = test::TestConnectionId(2); | |
| connection_id = connection_id2; | |
| EXPECT_EQ(connection_id, test::TestConnectionId(2)); | |
| EXPECT_NE(connection_id, test::TestConnectionId(1)); | |
| connection_id = QuicConnectionId(test::TestConnectionId(1)); | |
| EXPECT_EQ(connection_id, test::TestConnectionId(1)); | |
| EXPECT_NE(connection_id, test::TestConnectionId(2)); | |
| } | |
| TEST_F(QuicConnectionIdTest, ChangeLength) { | |
| QuicConnectionId connection_id64_1 = test::TestConnectionId(1); | |
| QuicConnectionId connection_id64_2 = test::TestConnectionId(2); | |
| QuicConnectionId connection_id136_2 = test::TestConnectionId(2); | |
| connection_id136_2.set_length(17); | |
| memset(connection_id136_2.mutable_data() + 8, 0, 9); | |
| char connection_id136_2_bytes[17] = {0, 0, 0, 0, 0, 0, 0, 2, 0, | |
| 0, 0, 0, 0, 0, 0, 0, 0}; | |
| QuicConnectionId connection_id136_2b(connection_id136_2_bytes, | |
| sizeof(connection_id136_2_bytes)); | |
| EXPECT_EQ(connection_id136_2, connection_id136_2b); | |
| QuicConnectionId connection_id = connection_id64_1; | |
| connection_id.set_length(17); | |
| EXPECT_NE(connection_id64_1, connection_id); | |
| // Check resizing big to small. | |
| connection_id.set_length(8); | |
| EXPECT_EQ(connection_id64_1, connection_id); | |
| // Check resizing small to big. | |
| connection_id.set_length(17); | |
| memset(connection_id.mutable_data(), 0, connection_id.length()); | |
| memcpy(connection_id.mutable_data(), connection_id64_2.data(), | |
| connection_id64_2.length()); | |
| EXPECT_EQ(connection_id136_2, connection_id); | |
| EXPECT_EQ(connection_id136_2b, connection_id); | |
| QuicConnectionId connection_id120(connection_id136_2_bytes, 15); | |
| connection_id.set_length(15); | |
| EXPECT_EQ(connection_id120, connection_id); | |
| // Check resizing big to big. | |
| QuicConnectionId connection_id2 = connection_id120; | |
| connection_id2.set_length(17); | |
| connection_id2.mutable_data()[15] = 0; | |
| connection_id2.mutable_data()[16] = 0; | |
| EXPECT_EQ(connection_id136_2, connection_id2); | |
| EXPECT_EQ(connection_id136_2b, connection_id2); | |
| } | |
| } // namespace | |
| } // namespace quic |