Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 1 | // 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 Evans | 3388a03 | 2020-03-24 11:25:55 +0900 | [diff] [blame] | 5 | #include "patchpanel/address_manager.h" |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 6 | |
| 7 | #include <map> |
| 8 | #include <utility> |
| 9 | #include <vector> |
| 10 | |
| 11 | #include <arpa/inet.h> |
| 12 | |
Garrick Evans | 3388a03 | 2020-03-24 11:25:55 +0900 | [diff] [blame] | 13 | #include "patchpanel/net_util.h" |
Hugo Benichi | 2ac4d07 | 2019-05-28 14:51:23 +0900 | [diff] [blame] | 14 | |
Garrick Evans | 7d9a232 | 2020-04-02 11:59:56 +0900 | [diff] [blame] | 15 | #include <base/rand_util.h> |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 16 | #include <gtest/gtest.h> |
| 17 | |
Garrick Evans | 3388a03 | 2020-03-24 11:25:55 +0900 | [diff] [blame] | 18 | namespace patchpanel { |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 19 | |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 20 | TEST(AddressManager, BaseAddresses) { |
| 21 | std::map<AddressManager::Guest, size_t> addrs = { |
Hugo Benichi | 6c63ae2 | 2019-05-29 11:19:15 +0900 | [diff] [blame] | 22 | {AddressManager::Guest::ARC, Ipv4Addr(100, 115, 92, 0)}, |
Hugo Benichi | ad1bdd9 | 2020-06-12 13:48:37 +0900 | [diff] [blame^] | 23 | {AddressManager::Guest::ARC_NET, Ipv4Addr(100, 115, 92, 4)}, |
Hugo Benichi | 6c63ae2 | 2019-05-29 11:19:15 +0900 | [diff] [blame] | 24 | {AddressManager::Guest::VM_TERMINA, Ipv4Addr(100, 115, 92, 24)}, |
Garrick Evans | 1fa4e64 | 2020-03-13 11:43:41 +0900 | [diff] [blame] | 25 | {AddressManager::Guest::VM_PLUGIN, Ipv4Addr(100, 115, 93, 0)}, |
Garrick Evans | 43b4e2d | 2019-12-11 13:43:08 +0900 | [diff] [blame] | 26 | {AddressManager::Guest::CONTAINER, Ipv4Addr(100, 115, 92, 192)}, |
Hugo Benichi | adf1ec5 | 2020-01-17 16:23:58 +0900 | [diff] [blame] | 27 | {AddressManager::Guest::MINIJAIL_NETNS, Ipv4Addr(100, 115, 92, 128)}, |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 28 | }; |
Garrick Evans | 4ee5ce2 | 2020-03-18 07:05:17 +0900 | [diff] [blame] | 29 | AddressManager mgr; |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 30 | 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 Benichi | 6c63ae2 | 2019-05-29 11:19:15 +0900 | [diff] [blame] | 35 | EXPECT_EQ(a.second, htonl(ntohl(subnet->AddressAtOffset(0)) - 1)); |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 36 | } |
| 37 | } |
| 38 | |
| 39 | TEST(AddressManager, AddressesPerSubnet) { |
| 40 | std::map<AddressManager::Guest, size_t> addrs = { |
| 41 | {AddressManager::Guest::ARC, 2}, |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 42 | {AddressManager::Guest::ARC_NET, 2}, |
| 43 | {AddressManager::Guest::VM_TERMINA, 2}, |
Garrick Evans | 1fa4e64 | 2020-03-13 11:43:41 +0900 | [diff] [blame] | 44 | {AddressManager::Guest::VM_PLUGIN, 6}, |
Garrick Evans | 43b4e2d | 2019-12-11 13:43:08 +0900 | [diff] [blame] | 45 | {AddressManager::Guest::CONTAINER, 14}, |
Hugo Benichi | adf1ec5 | 2020-01-17 16:23:58 +0900 | [diff] [blame] | 46 | {AddressManager::Guest::MINIJAIL_NETNS, 2}, |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 47 | }; |
Garrick Evans | 4ee5ce2 | 2020-03-18 07:05:17 +0900 | [diff] [blame] | 48 | AddressManager mgr; |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 49 | 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 | |
| 56 | TEST(AddressManager, SubnetsPerPool) { |
| 57 | std::map<AddressManager::Guest, size_t> addrs = { |
| 58 | {AddressManager::Guest::ARC, 1}, |
Hugo Benichi | ad1bdd9 | 2020-06-12 13:48:37 +0900 | [diff] [blame^] | 59 | {AddressManager::Guest::ARC_NET, 5}, |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 60 | {AddressManager::Guest::VM_TERMINA, 26}, |
Garrick Evans | 1fa4e64 | 2020-03-13 11:43:41 +0900 | [diff] [blame] | 61 | {AddressManager::Guest::VM_PLUGIN, 32}, |
Garrick Evans | 43b4e2d | 2019-12-11 13:43:08 +0900 | [diff] [blame] | 62 | {AddressManager::Guest::CONTAINER, 4}, |
Hugo Benichi | adf1ec5 | 2020-01-17 16:23:58 +0900 | [diff] [blame] | 63 | {AddressManager::Guest::MINIJAIL_NETNS, 8}, |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 64 | }; |
Garrick Evans | 4ee5ce2 | 2020-03-18 07:05:17 +0900 | [diff] [blame] | 65 | AddressManager mgr; |
Garrick Evans | 0dbd418 | 2019-03-07 08:38:38 +0900 | [diff] [blame] | 66 | 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 Evans | 43b4e2d | 2019-12-11 13:43:08 +0900 | [diff] [blame] | 78 | TEST(AddressManager, SubnetIndexing) { |
Garrick Evans | 4ee5ce2 | 2020-03-18 07:05:17 +0900 | [diff] [blame] | 79 | AddressManager mgr; |
Garrick Evans | 53a2a98 | 2020-02-05 10:53:35 +0900 | [diff] [blame] | 80 | EXPECT_FALSE(mgr.AllocateIPv4Subnet(AddressManager::Guest::ARC, 1)); |
Garrick Evans | 53a2a98 | 2020-02-05 10:53:35 +0900 | [diff] [blame] | 81 | EXPECT_FALSE(mgr.AllocateIPv4Subnet(AddressManager::Guest::ARC_NET, 1)); |
| 82 | EXPECT_FALSE(mgr.AllocateIPv4Subnet(AddressManager::Guest::VM_TERMINA, 1)); |
Garrick Evans | 1fa4e64 | 2020-03-13 11:43:41 +0900 | [diff] [blame] | 83 | EXPECT_TRUE(mgr.AllocateIPv4Subnet(AddressManager::Guest::VM_PLUGIN, 1)); |
Garrick Evans | 53a2a98 | 2020-02-05 10:53:35 +0900 | [diff] [blame] | 84 | EXPECT_FALSE(mgr.AllocateIPv4Subnet(AddressManager::Guest::CONTAINER, 1)); |
Hugo Benichi | adf1ec5 | 2020-01-17 16:23:58 +0900 | [diff] [blame] | 85 | EXPECT_FALSE( |
| 86 | mgr.AllocateIPv4Subnet(AddressManager::Guest::MINIJAIL_NETNS, 1)); |
Garrick Evans | 43b4e2d | 2019-12-11 13:43:08 +0900 | [diff] [blame] | 87 | } |
| 88 | |
Garrick Evans | 7d9a232 | 2020-04-02 11:59:56 +0900 | [diff] [blame] | 89 | TEST(AddressManager, StableMacAddresses) { |
Garrick Evans | 20132ee | 2020-04-06 11:24:42 +0900 | [diff] [blame] | 90 | AddressManager mgr; |
Garrick Evans | 7d9a232 | 2020-04-02 11:59:56 +0900 | [diff] [blame] | 91 | 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 Evans | 3388a03 | 2020-03-24 11:25:55 +0900 | [diff] [blame] | 103 | } // namespace patchpanel |