blob: 4b79c45016375f064bdffe2ca483b131ac4fe8d3 [file] [log] [blame]
Garrick Evans0dbd4182019-03-07 08:38:38 +09001// Copyright 2019 The Chromium OS 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
Garrick Evans3388a032020-03-24 11:25:55 +09005#include "patchpanel/address_manager.h"
Garrick Evans0dbd4182019-03-07 08:38:38 +09006
7#include <map>
8#include <utility>
9#include <vector>
10
11#include <arpa/inet.h>
12
Garrick Evans3388a032020-03-24 11:25:55 +090013#include "patchpanel/net_util.h"
Hugo Benichi2ac4d072019-05-28 14:51:23 +090014
Garrick Evans7d9a2322020-04-02 11:59:56 +090015#include <base/rand_util.h>
Garrick Evans0dbd4182019-03-07 08:38:38 +090016#include <gtest/gtest.h>
17
Garrick Evans3388a032020-03-24 11:25:55 +090018namespace patchpanel {
Garrick Evans0dbd4182019-03-07 08:38:38 +090019
Garrick Evans0dbd4182019-03-07 08:38:38 +090020TEST(AddressManager, BaseAddresses) {
21 std::map<AddressManager::Guest, size_t> addrs = {
Hugo Benichi6c63ae22019-05-29 11:19:15 +090022 {AddressManager::Guest::ARC, Ipv4Addr(100, 115, 92, 0)},
Hugo Benichiad1bdd92020-06-12 13:48:37 +090023 {AddressManager::Guest::ARC_NET, Ipv4Addr(100, 115, 92, 4)},
Hugo Benichi6c63ae22019-05-29 11:19:15 +090024 {AddressManager::Guest::VM_TERMINA, Ipv4Addr(100, 115, 92, 24)},
Garrick Evans1fa4e642020-03-13 11:43:41 +090025 {AddressManager::Guest::VM_PLUGIN, Ipv4Addr(100, 115, 93, 0)},
Garrick Evans43b4e2d2019-12-11 13:43:08 +090026 {AddressManager::Guest::CONTAINER, Ipv4Addr(100, 115, 92, 192)},
Hugo Benichiadf1ec52020-01-17 16:23:58 +090027 {AddressManager::Guest::MINIJAIL_NETNS, Ipv4Addr(100, 115, 92, 128)},
Garrick Evans0dbd4182019-03-07 08:38:38 +090028 };
Garrick Evans4ee5ce22020-03-18 07:05:17 +090029 AddressManager mgr;
Garrick Evans0dbd4182019-03-07 08:38:38 +090030 for (const auto a : addrs) {
31 auto subnet = mgr.AllocateIPv4Subnet(a.first);
32 ASSERT_TRUE(subnet != nullptr);
33 // The first address (offset 0) returned by Subnet is not the base address,
34 // rather it's the first usable IP address... so the base is 1 less.
Hugo Benichi6c63ae22019-05-29 11:19:15 +090035 EXPECT_EQ(a.second, htonl(ntohl(subnet->AddressAtOffset(0)) - 1));
Garrick Evans0dbd4182019-03-07 08:38:38 +090036 }
37}
38
39TEST(AddressManager, AddressesPerSubnet) {
40 std::map<AddressManager::Guest, size_t> addrs = {
41 {AddressManager::Guest::ARC, 2},
Garrick Evans0dbd4182019-03-07 08:38:38 +090042 {AddressManager::Guest::ARC_NET, 2},
43 {AddressManager::Guest::VM_TERMINA, 2},
Garrick Evans1fa4e642020-03-13 11:43:41 +090044 {AddressManager::Guest::VM_PLUGIN, 6},
Garrick Evans43b4e2d2019-12-11 13:43:08 +090045 {AddressManager::Guest::CONTAINER, 14},
Hugo Benichiadf1ec52020-01-17 16:23:58 +090046 {AddressManager::Guest::MINIJAIL_NETNS, 2},
Garrick Evans0dbd4182019-03-07 08:38:38 +090047 };
Garrick Evans4ee5ce22020-03-18 07:05:17 +090048 AddressManager mgr;
Garrick Evans0dbd4182019-03-07 08:38:38 +090049 for (const auto a : addrs) {
50 auto subnet = mgr.AllocateIPv4Subnet(a.first);
51 ASSERT_TRUE(subnet != nullptr);
52 EXPECT_EQ(a.second, subnet->AvailableCount());
53 }
54}
55
56TEST(AddressManager, SubnetsPerPool) {
57 std::map<AddressManager::Guest, size_t> addrs = {
58 {AddressManager::Guest::ARC, 1},
Hugo Benichiad1bdd92020-06-12 13:48:37 +090059 {AddressManager::Guest::ARC_NET, 5},
Garrick Evans0dbd4182019-03-07 08:38:38 +090060 {AddressManager::Guest::VM_TERMINA, 26},
Garrick Evans1fa4e642020-03-13 11:43:41 +090061 {AddressManager::Guest::VM_PLUGIN, 32},
Garrick Evans43b4e2d2019-12-11 13:43:08 +090062 {AddressManager::Guest::CONTAINER, 4},
Hugo Benichiadf1ec52020-01-17 16:23:58 +090063 {AddressManager::Guest::MINIJAIL_NETNS, 8},
Garrick Evans0dbd4182019-03-07 08:38:38 +090064 };
Garrick Evans4ee5ce22020-03-18 07:05:17 +090065 AddressManager mgr;
Garrick Evans0dbd4182019-03-07 08:38:38 +090066 for (const auto a : addrs) {
67 std::vector<std::unique_ptr<Subnet>> subnets;
68 for (size_t i = 0; i < a.second; ++i) {
69 auto subnet = mgr.AllocateIPv4Subnet(a.first);
70 EXPECT_TRUE(subnet != nullptr);
71 subnets.emplace_back(std::move(subnet));
72 }
73 auto subnet = mgr.AllocateIPv4Subnet(a.first);
74 EXPECT_TRUE(subnet == nullptr);
75 }
76}
77
Garrick Evans43b4e2d2019-12-11 13:43:08 +090078TEST(AddressManager, SubnetIndexing) {
Garrick Evans4ee5ce22020-03-18 07:05:17 +090079 AddressManager mgr;
Garrick Evans53a2a982020-02-05 10:53:35 +090080 EXPECT_FALSE(mgr.AllocateIPv4Subnet(AddressManager::Guest::ARC, 1));
Garrick Evans53a2a982020-02-05 10:53:35 +090081 EXPECT_FALSE(mgr.AllocateIPv4Subnet(AddressManager::Guest::ARC_NET, 1));
82 EXPECT_FALSE(mgr.AllocateIPv4Subnet(AddressManager::Guest::VM_TERMINA, 1));
Garrick Evans1fa4e642020-03-13 11:43:41 +090083 EXPECT_TRUE(mgr.AllocateIPv4Subnet(AddressManager::Guest::VM_PLUGIN, 1));
Garrick Evans53a2a982020-02-05 10:53:35 +090084 EXPECT_FALSE(mgr.AllocateIPv4Subnet(AddressManager::Guest::CONTAINER, 1));
Hugo Benichiadf1ec52020-01-17 16:23:58 +090085 EXPECT_FALSE(
86 mgr.AllocateIPv4Subnet(AddressManager::Guest::MINIJAIL_NETNS, 1));
Garrick Evans43b4e2d2019-12-11 13:43:08 +090087}
88
Garrick Evans7d9a2322020-04-02 11:59:56 +090089TEST(AddressManager, StableMacAddresses) {
Garrick Evans20132ee2020-04-06 11:24:42 +090090 AddressManager mgr;
Garrick Evans7d9a2322020-04-02 11:59:56 +090091 EXPECT_NE(mgr.GenerateMacAddress(), mgr.GenerateMacAddress());
92 EXPECT_NE(mgr.GenerateMacAddress(kAnySubnetIndex),
93 mgr.GenerateMacAddress(kAnySubnetIndex));
94 for (int i = 0; i < 100; ++i) {
95 uint8_t index = 0;
96 while (index == 0) {
97 base::RandBytes(&index, 1);
98 }
99 EXPECT_EQ(mgr.GenerateMacAddress(index), mgr.GenerateMacAddress(index));
100 }
101}
102
Garrick Evans3388a032020-03-24 11:25:55 +0900103} // namespace patchpanel