1 // Copyright (c) 2022 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/load_balancer/load_balancer_server_id.h"
6 
7 #include <cstdint>
8 #include <cstring>
9 
10 #include "absl/hash/hash_testing.h"
11 #include "absl/types/span.h"
12 
13 #include "quiche/quic/platform/api/quic_expect_bug.h"
14 #include "quiche/quic/platform/api/quic_test.h"
15 
16 namespace quic {
17 
18 namespace test {
19 
20 namespace {
21 
22 class LoadBalancerServerIdTest : public QuicTest {};
23 
24 constexpr uint8_t kRawServerId[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
25                                     0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
26                                     0x0c, 0x0d, 0x0e, 0x0f};
27 
TEST_F(LoadBalancerServerIdTest,CreateReturnsNullIfTooLong)28 TEST_F(LoadBalancerServerIdTest, CreateReturnsNullIfTooLong) {
29   EXPECT_QUIC_BUG(EXPECT_FALSE(LoadBalancerServerId(
30                                    absl::Span<const uint8_t>(kRawServerId, 16))
31                                    .IsValid()),
32                   "Attempted to create LoadBalancerServerId with length 16");
33   EXPECT_QUIC_BUG(
34       EXPECT_FALSE(LoadBalancerServerId(absl::Span<const uint8_t>()).IsValid()),
35       "Attempted to create LoadBalancerServerId with length 0");
36 }
37 
TEST_F(LoadBalancerServerIdTest,CompareIdenticalExceptLength)38 TEST_F(LoadBalancerServerIdTest, CompareIdenticalExceptLength) {
39   LoadBalancerServerId server_id(absl::Span<const uint8_t>(kRawServerId, 15));
40   ASSERT_TRUE(server_id.IsValid());
41   EXPECT_EQ(server_id.length(), 15);
42   LoadBalancerServerId shorter_server_id(
43       absl::Span<const uint8_t>(kRawServerId, 5));
44   ASSERT_TRUE(shorter_server_id.IsValid());
45   EXPECT_EQ(shorter_server_id.length(), 5);
46   // Shorter comes before longer if all bits match
47   EXPECT_TRUE(shorter_server_id < server_id);
48   EXPECT_FALSE(server_id < shorter_server_id);
49   // Different lengths are never equal.
50   EXPECT_FALSE(shorter_server_id == server_id);
51 }
52 
TEST_F(LoadBalancerServerIdTest,AccessorFunctions)53 TEST_F(LoadBalancerServerIdTest, AccessorFunctions) {
54   LoadBalancerServerId server_id(absl::Span<const uint8_t>(kRawServerId, 5));
55   EXPECT_TRUE(server_id.IsValid());
56   EXPECT_EQ(server_id.length(), 5);
57   EXPECT_EQ(memcmp(server_id.data().data(), kRawServerId, 5), 0);
58   EXPECT_EQ(server_id.ToString(), "0001020304");
59 }
60 
TEST_F(LoadBalancerServerIdTest,CompareDifferentServerIds)61 TEST_F(LoadBalancerServerIdTest, CompareDifferentServerIds) {
62   LoadBalancerServerId server_id(absl::Span<const uint8_t>(kRawServerId, 5));
63   ASSERT_TRUE(server_id.IsValid());
64   LoadBalancerServerId reverse({0x0f, 0x0e, 0x0d, 0x0c, 0x0b});
65   ASSERT_TRUE(reverse.IsValid());
66   EXPECT_TRUE(server_id < reverse);
67   LoadBalancerServerId long_server_id(
68       absl::Span<const uint8_t>(kRawServerId, 15));
69   EXPECT_TRUE(long_server_id < reverse);
70 }
71 
TEST_F(LoadBalancerServerIdTest,EqualityOperators)72 TEST_F(LoadBalancerServerIdTest, EqualityOperators) {
73   LoadBalancerServerId server_id(absl::Span<const uint8_t>(kRawServerId, 15));
74   ASSERT_TRUE(server_id.IsValid());
75   LoadBalancerServerId shorter_server_id(
76       absl::Span<const uint8_t>(kRawServerId, 5));
77   ASSERT_TRUE(shorter_server_id.IsValid());
78   EXPECT_FALSE(server_id == shorter_server_id);
79   LoadBalancerServerId server_id2 = server_id;
80   EXPECT_TRUE(server_id == server_id2);
81 }
82 
TEST_F(LoadBalancerServerIdTest,SupportsHash)83 TEST_F(LoadBalancerServerIdTest, SupportsHash) {
84   LoadBalancerServerId server_id(absl::Span<const uint8_t>(kRawServerId, 15));
85   ASSERT_TRUE(server_id.IsValid());
86   LoadBalancerServerId shorter_server_id(
87       absl::Span<const uint8_t>(kRawServerId, 5));
88   ASSERT_TRUE(shorter_server_id.IsValid());
89   LoadBalancerServerId different_server_id({0x0f, 0x0e, 0x0d, 0x0c, 0x0b});
90   ASSERT_TRUE(different_server_id.IsValid());
91   EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly({
92       server_id,
93       shorter_server_id,
94       different_server_id,
95   }));
96 }
97 
TEST_F(LoadBalancerServerIdTest,SetLengthInvalid)98 TEST_F(LoadBalancerServerIdTest, SetLengthInvalid) {
99   LoadBalancerServerId server_id;
100   EXPECT_QUIC_BUG(server_id.set_length(16),
101                   "Attempted to set LoadBalancerServerId length to 16");
102   EXPECT_QUIC_BUG(server_id.set_length(0),
103                   "Attempted to set LoadBalancerServerId length to 0");
104   server_id.set_length(1);
105   EXPECT_EQ(server_id.length(), 1);
106   server_id.set_length(15);
107   EXPECT_EQ(server_id.length(), 15);
108 }
109 
110 }  // namespace
111 
112 }  // namespace test
113 
114 }  // namespace quic
115