arc: Move platform2/arc/network/ to platform2/patchpanel

Next step in the arc-networkd -> patchpanel rename, this patch moves the
location of the code.

BUG=b:151879931
TEST=units,flashed image to atlas
TEST=tasts arc.PlayStore, crostini.LaunchTerminal.download

Change-Id: I1b5cf8d670e1631d46f6449b725395157bf88dde
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/2115863
Tested-by: Garrick Evans <garrick@chromium.org>
Commit-Queue: Garrick Evans <garrick@chromium.org>
Reviewed-by: Hidehiko Abe <hidehiko@chromium.org>
Reviewed-by: Eric Caruso <ejcaruso@chromium.org>
Reviewed-by: Chirantan Ekbote <chirantan@chromium.org>
Reviewed-by: Hugo Benichi <hugobenichi@google.com>
diff --git a/patchpanel/address_manager_test.cc b/patchpanel/address_manager_test.cc
new file mode 100644
index 0000000..1a04651
--- /dev/null
+++ b/patchpanel/address_manager_test.cc
@@ -0,0 +1,107 @@
+// Copyright 2019 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "patchpanel/address_manager.h"
+
+#include <map>
+#include <utility>
+#include <vector>
+
+#include <arpa/inet.h>
+
+#include "patchpanel/net_util.h"
+
+#include <base/rand_util.h>
+#include <gtest/gtest.h>
+
+namespace patchpanel {
+
+TEST(AddressManager, BaseAddresses) {
+  std::map<AddressManager::Guest, size_t> addrs = {
+      {AddressManager::Guest::ARC, Ipv4Addr(100, 115, 92, 0)},
+      {AddressManager::Guest::VM_ARC, Ipv4Addr(100, 115, 92, 4)},
+      {AddressManager::Guest::ARC_NET, Ipv4Addr(100, 115, 92, 8)},
+      {AddressManager::Guest::VM_TERMINA, Ipv4Addr(100, 115, 92, 24)},
+      {AddressManager::Guest::VM_PLUGIN, Ipv4Addr(100, 115, 93, 0)},
+      {AddressManager::Guest::CONTAINER, Ipv4Addr(100, 115, 92, 192)},
+      {AddressManager::Guest::MINIJAIL_NETNS, Ipv4Addr(100, 115, 92, 128)},
+  };
+  AddressManager mgr;
+  for (const auto a : addrs) {
+    auto subnet = mgr.AllocateIPv4Subnet(a.first);
+    ASSERT_TRUE(subnet != nullptr);
+    // The first address (offset 0) returned by Subnet is not the base address,
+    // rather it's the first usable IP address... so the base is 1 less.
+    EXPECT_EQ(a.second, htonl(ntohl(subnet->AddressAtOffset(0)) - 1));
+  }
+}
+
+TEST(AddressManager, AddressesPerSubnet) {
+  std::map<AddressManager::Guest, size_t> addrs = {
+      {AddressManager::Guest::ARC, 2},
+      {AddressManager::Guest::VM_ARC, 2},
+      {AddressManager::Guest::ARC_NET, 2},
+      {AddressManager::Guest::VM_TERMINA, 2},
+      {AddressManager::Guest::VM_PLUGIN, 6},
+      {AddressManager::Guest::CONTAINER, 14},
+      {AddressManager::Guest::MINIJAIL_NETNS, 2},
+  };
+  AddressManager mgr;
+  for (const auto a : addrs) {
+    auto subnet = mgr.AllocateIPv4Subnet(a.first);
+    ASSERT_TRUE(subnet != nullptr);
+    EXPECT_EQ(a.second, subnet->AvailableCount());
+  }
+}
+
+TEST(AddressManager, SubnetsPerPool) {
+  std::map<AddressManager::Guest, size_t> addrs = {
+      {AddressManager::Guest::ARC, 1},
+      {AddressManager::Guest::VM_ARC, 1},
+      {AddressManager::Guest::ARC_NET, 4},
+      {AddressManager::Guest::VM_TERMINA, 26},
+      {AddressManager::Guest::VM_PLUGIN, 32},
+      {AddressManager::Guest::CONTAINER, 4},
+      {AddressManager::Guest::MINIJAIL_NETNS, 8},
+  };
+  AddressManager mgr;
+  for (const auto a : addrs) {
+    std::vector<std::unique_ptr<Subnet>> subnets;
+    for (size_t i = 0; i < a.second; ++i) {
+      auto subnet = mgr.AllocateIPv4Subnet(a.first);
+      EXPECT_TRUE(subnet != nullptr);
+      subnets.emplace_back(std::move(subnet));
+    }
+    auto subnet = mgr.AllocateIPv4Subnet(a.first);
+    EXPECT_TRUE(subnet == nullptr);
+  }
+}
+
+TEST(AddressManager, SubnetIndexing) {
+  AddressManager mgr;
+  EXPECT_FALSE(mgr.AllocateIPv4Subnet(AddressManager::Guest::ARC, 1));
+  EXPECT_FALSE(mgr.AllocateIPv4Subnet(AddressManager::Guest::VM_ARC, 1));
+  EXPECT_FALSE(mgr.AllocateIPv4Subnet(AddressManager::Guest::ARC_NET, 1));
+  EXPECT_FALSE(mgr.AllocateIPv4Subnet(AddressManager::Guest::VM_TERMINA, 1));
+  EXPECT_TRUE(mgr.AllocateIPv4Subnet(AddressManager::Guest::VM_PLUGIN, 1));
+  EXPECT_FALSE(mgr.AllocateIPv4Subnet(AddressManager::Guest::CONTAINER, 1));
+  EXPECT_FALSE(
+      mgr.AllocateIPv4Subnet(AddressManager::Guest::MINIJAIL_NETNS, 1));
+}
+
+TEST(AddressManager, StableMacAddresses) {
+  AddressManager mgr;
+  EXPECT_NE(mgr.GenerateMacAddress(), mgr.GenerateMacAddress());
+  EXPECT_NE(mgr.GenerateMacAddress(kAnySubnetIndex),
+            mgr.GenerateMacAddress(kAnySubnetIndex));
+  for (int i = 0; i < 100; ++i) {
+    uint8_t index = 0;
+    while (index == 0) {
+      base::RandBytes(&index, 1);
+    }
+    EXPECT_EQ(mgr.GenerateMacAddress(index), mgr.GenerateMacAddress(index));
+  }
+}
+
+}  // namespace patchpanel