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_map.h"
6
7 #include <cstdint>
8 #include <optional>
9
10 #include "absl/types/span.h"
11 #include "quiche/quic/load_balancer/load_balancer_server_id.h"
12 #include "quiche/quic/platform/api/quic_expect_bug.h"
13 #include "quiche/quic/platform/api/quic_test.h"
14
15 namespace quic {
16
17 namespace test {
18
19 namespace {
20
21 constexpr uint8_t kServerId[] = {0xed, 0x79, 0x3a, 0x51};
22
23 class LoadBalancerServerIdMapTest : public QuicTest {
24 public:
25 const LoadBalancerServerId valid_server_id_ = LoadBalancerServerId(kServerId);
26 const LoadBalancerServerId invalid_server_id_ =
27 LoadBalancerServerId(absl::Span<const uint8_t>(kServerId, 3));
28 };
29
TEST_F(LoadBalancerServerIdMapTest,CreateWithBadServerIdLength)30 TEST_F(LoadBalancerServerIdMapTest, CreateWithBadServerIdLength) {
31 EXPECT_QUIC_BUG(EXPECT_EQ(LoadBalancerServerIdMap<int>::Create(0), nullptr),
32 "Tried to configure map with server ID length 0");
33 EXPECT_QUIC_BUG(EXPECT_EQ(LoadBalancerServerIdMap<int>::Create(16), nullptr),
34 "Tried to configure map with server ID length 16");
35 }
36
TEST_F(LoadBalancerServerIdMapTest,AddOrReplaceWithBadServerIdLength)37 TEST_F(LoadBalancerServerIdMapTest, AddOrReplaceWithBadServerIdLength) {
38 int record = 1;
39 auto pool = LoadBalancerServerIdMap<int>::Create(4);
40 EXPECT_NE(pool, nullptr);
41 EXPECT_QUIC_BUG(pool->AddOrReplace(invalid_server_id_, record),
42 "Server ID of 3 bytes; this map requires 4");
43 }
44
TEST_F(LoadBalancerServerIdMapTest,LookupWithBadServerIdLength)45 TEST_F(LoadBalancerServerIdMapTest, LookupWithBadServerIdLength) {
46 int record = 1;
47 auto pool = LoadBalancerServerIdMap<int>::Create(4);
48 EXPECT_NE(pool, nullptr);
49 pool->AddOrReplace(valid_server_id_, record);
50 EXPECT_QUIC_BUG(EXPECT_FALSE(pool->Lookup(invalid_server_id_).has_value()),
51 "Lookup with a 3 byte server ID, map requires 4");
52 EXPECT_QUIC_BUG(EXPECT_EQ(pool->LookupNoCopy(invalid_server_id_), nullptr),
53 "Lookup with a 3 byte server ID, map requires 4");
54 }
55
TEST_F(LoadBalancerServerIdMapTest,LookupWhenEmpty)56 TEST_F(LoadBalancerServerIdMapTest, LookupWhenEmpty) {
57 auto pool = LoadBalancerServerIdMap<int>::Create(4);
58 EXPECT_NE(pool, nullptr);
59 EXPECT_EQ(pool->LookupNoCopy(valid_server_id_), nullptr);
60 std::optional<int> result = pool->Lookup(valid_server_id_);
61 EXPECT_FALSE(result.has_value());
62 }
63
TEST_F(LoadBalancerServerIdMapTest,AddLookup)64 TEST_F(LoadBalancerServerIdMapTest, AddLookup) {
65 int record1 = 1, record2 = 2;
66 auto pool = LoadBalancerServerIdMap<int>::Create(4);
67 EXPECT_NE(pool, nullptr);
68 LoadBalancerServerId other_server_id({0x01, 0x02, 0x03, 0x04});
69 EXPECT_TRUE(other_server_id.IsValid());
70 pool->AddOrReplace(valid_server_id_, record1);
71 pool->AddOrReplace(other_server_id, record2);
72 std::optional<int> result = pool->Lookup(valid_server_id_);
73 EXPECT_TRUE(result.has_value());
74 EXPECT_EQ(*result, record1);
75 auto result_ptr = pool->LookupNoCopy(valid_server_id_);
76 EXPECT_NE(result_ptr, nullptr);
77 EXPECT_EQ(*result_ptr, record1);
78 result = pool->Lookup(other_server_id);
79 EXPECT_TRUE(result.has_value());
80 EXPECT_EQ(*result, record2);
81 }
82
TEST_F(LoadBalancerServerIdMapTest,AddErase)83 TEST_F(LoadBalancerServerIdMapTest, AddErase) {
84 int record = 1;
85 auto pool = LoadBalancerServerIdMap<int>::Create(4);
86 EXPECT_NE(pool, nullptr);
87 pool->AddOrReplace(valid_server_id_, record);
88 EXPECT_EQ(*pool->LookupNoCopy(valid_server_id_), record);
89 pool->Erase(valid_server_id_);
90 EXPECT_EQ(pool->LookupNoCopy(valid_server_id_), nullptr);
91 }
92
93 } // namespace
94
95 } // namespace test
96
97 } // namespace quic
98