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