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