blob: 6b3bc5260b747ca25d4ffd05ce8af462ef1eadb1 [file] [log] [blame]
Bence Békybac04052022-04-07 15:44:29 -04001// 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
martindukeba658fc2023-08-22 14:30:51 -07007#include <cstdint>
8#include <cstring>
9
Bence Békybac04052022-04-07 15:44:29 -040010#include "absl/hash/hash_testing.h"
martindukeba658fc2023-08-22 14:30:51 -070011#include "absl/types/span.h"
Bence Békybac04052022-04-07 15:44:29 -040012
Bence Békybac04052022-04-07 15:44:29 -040013#include "quiche/quic/platform/api/quic_expect_bug.h"
14#include "quiche/quic/platform/api/quic_test.h"
Bence Békybac04052022-04-07 15:44:29 -040015
16namespace quic {
17
18namespace test {
19
20namespace {
21
22class LoadBalancerServerIdTest : public QuicTest {};
23
24constexpr uint8_t kRawServerId[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
25 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
26 0x0c, 0x0d, 0x0e, 0x0f};
27
28TEST_F(LoadBalancerServerIdTest, CreateReturnsNullIfTooLong) {
rch04c5a3e2024-01-08 12:29:09 -080029 EXPECT_QUIC_BUG(EXPECT_FALSE(LoadBalancerServerId(
Bence Békybac04052022-04-07 15:44:29 -040030 absl::Span<const uint8_t>(kRawServerId, 16))
rch04c5a3e2024-01-08 12:29:09 -080031 .IsValid()),
Bence Békybac04052022-04-07 15:44:29 -040032 "Attempted to create LoadBalancerServerId with length 16");
33 EXPECT_QUIC_BUG(
rch04c5a3e2024-01-08 12:29:09 -080034 EXPECT_FALSE(LoadBalancerServerId(absl::Span<const uint8_t>()).IsValid()),
Bence Békybac04052022-04-07 15:44:29 -040035 "Attempted to create LoadBalancerServerId with length 0");
36}
37
38TEST_F(LoadBalancerServerIdTest, CompareIdenticalExceptLength) {
rch04c5a3e2024-01-08 12:29:09 -080039 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);
Bence Békybac04052022-04-07 15:44:29 -040046 // 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
53TEST_F(LoadBalancerServerIdTest, AccessorFunctions) {
rch04c5a3e2024-01-08 12:29:09 -080054 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");
Bence Békybac04052022-04-07 15:44:29 -040059}
60
61TEST_F(LoadBalancerServerIdTest, CompareDifferentServerIds) {
rch04c5a3e2024-01-08 12:29:09 -080062 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());
Bence Békybac04052022-04-07 15:44:29 -040066 EXPECT_TRUE(server_id < reverse);
rch04c5a3e2024-01-08 12:29:09 -080067 LoadBalancerServerId long_server_id(
68 absl::Span<const uint8_t>(kRawServerId, 15));
Bence Békybac04052022-04-07 15:44:29 -040069 EXPECT_TRUE(long_server_id < reverse);
70}
71
72TEST_F(LoadBalancerServerIdTest, EqualityOperators) {
rch04c5a3e2024-01-08 12:29:09 -080073 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());
Bence Békybac04052022-04-07 15:44:29 -040078 EXPECT_FALSE(server_id == shorter_server_id);
rch04c5a3e2024-01-08 12:29:09 -080079 LoadBalancerServerId server_id2 = server_id;
Bence Békybac04052022-04-07 15:44:29 -040080 EXPECT_TRUE(server_id == server_id2);
81}
82
83TEST_F(LoadBalancerServerIdTest, SupportsHash) {
rch04c5a3e2024-01-08 12:29:09 -080084 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());
Bence Békybac04052022-04-07 15:44:29 -040091 EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly({
rch04c5a3e2024-01-08 12:29:09 -080092 server_id,
93 shorter_server_id,
94 different_server_id,
Bence Békybac04052022-04-07 15:44:29 -040095 }));
96}
97
martinduke91759bc2024-01-19 11:27:08 -080098TEST_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
Bence Békybac04052022-04-07 15:44:29 -0400110} // namespace
111
112} // namespace test
113
114} // namespace quic