blob: ebb106aa6895861686223b58375bae36bf2fb99c [file] [log] [blame]
// Copyright 2018 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 "arc/network/device_manager.h"
#include <utility>
#include <vector>
#include <base/strings/stringprintf.h>
#include <gtest/gtest.h>
namespace arc_networkd {
namespace {
class FakeAddressManager : public AddressManager {
public:
FakeAddressManager()
: AddressManager({
AddressManager::Guest::ARC,
AddressManager::Guest::ARC_NET,
}) {}
MacAddress GenerateMacAddress() override {
static const MacAddress kAddr = {0xf7, 0x69, 0xe5, 0xc4, 0x1f, 0x74};
return kAddr;
}
};
class DeviceManagerTest : public testing::Test {
protected:
DeviceManagerTest() : testing::Test() {}
void SetUp() override {
capture_msgs_ = false;
android_announce_msg_.set_dev_ifname(kAndroidDevice);
NewManager("")
->MakeDevice(kAndroidDevice)
->FillProto(android_announce_msg_.mutable_dev_config());
legacy_android_announce_msg_.set_dev_ifname(kAndroidLegacyDevice);
NewManager("")
->MakeDevice(kAndroidLegacyDevice)
->FillProto(legacy_android_announce_msg_.mutable_dev_config());
}
std::unique_ptr<DeviceManager> NewManager(
const std::string& arc_device = kAndroidDevice) {
return std::make_unique<DeviceManager>(
&addr_mgr_,
base::Bind(&DeviceManagerTest::RecvMsg, base::Unretained(this)),
arc_device);
}
void VerifyMsgs(const std::vector<IpHelperMessage>& expected) {
ASSERT_EQ(msgs_recv_.size(), expected.size());
for (size_t i = 0; i < msgs_recv_.size(); ++i) {
EXPECT_EQ(msgs_recv_[i], expected[i].SerializeAsString());
}
}
void ClearMsgs() { msgs_recv_.clear(); }
bool capture_msgs_;
IpHelperMessage android_announce_msg_;
IpHelperMessage legacy_android_announce_msg_;
private:
void RecvMsg(const IpHelperMessage& msg) {
if (capture_msgs_)
msgs_recv_.emplace_back(msg.SerializeAsString());
}
std::vector<std::string> msgs_recv_;
FakeAddressManager addr_mgr_;
};
} // namespace
TEST_F(DeviceManagerTest, MakeDevice) {
auto mgr = NewManager();
DeviceConfig msg;
mgr->MakeDevice("eth0")->FillProto(&msg);
EXPECT_EQ(msg.br_ifname(), "arc_eth0");
EXPECT_EQ(msg.arc_ifname(), "eth0");
EXPECT_EQ(msg.br_ipv4(), "100.115.92.9");
EXPECT_EQ(msg.arc_ipv4(), "100.115.92.10");
EXPECT_FALSE(msg.mac_addr().empty());
EXPECT_FALSE(msg.fwd_multicast());
EXPECT_FALSE(msg.find_ipv6_routes());
}
TEST_F(DeviceManagerTest, MakeDevice_Android) {
auto mgr = NewManager("" /* no default arc device */);
DeviceConfig msg;
mgr->MakeDevice(kAndroidDevice)->FillProto(&msg);
EXPECT_EQ(msg.br_ifname(), "arcbr0");
EXPECT_EQ(msg.arc_ifname(), "arc0");
EXPECT_EQ(msg.br_ipv4(), "100.115.92.1");
EXPECT_EQ(msg.arc_ipv4(), "100.115.92.2");
EXPECT_FALSE(msg.mac_addr().empty());
EXPECT_FALSE(msg.fwd_multicast());
EXPECT_FALSE(msg.find_ipv6_routes());
}
TEST_F(DeviceManagerTest, MakeDevice_LegacyAndroid) {
auto mgr = NewManager("" /* no default arc device */);
DeviceConfig msg;
mgr->MakeDevice(kAndroidLegacyDevice)->FillProto(&msg);
EXPECT_EQ(msg.br_ifname(), "arcbr0");
EXPECT_EQ(msg.arc_ifname(), "arc0");
EXPECT_EQ(msg.br_ipv4(), "100.115.92.1");
EXPECT_EQ(msg.arc_ipv4(), "100.115.92.2");
EXPECT_FALSE(msg.mac_addr().empty());
EXPECT_TRUE(msg.fwd_multicast());
EXPECT_TRUE(msg.find_ipv6_routes());
}
TEST_F(DeviceManagerTest, MakeDevice_NoMoreSubnets) {
auto mgr = NewManager("" /* no default arc device */);
DeviceConfig msg;
{
auto dev = mgr->MakeDevice(kAndroidDevice);
EXPECT_TRUE(dev);
EXPECT_FALSE(mgr->MakeDevice(kAndroidDevice));
}
{
auto dev = mgr->MakeDevice(kAndroidLegacyDevice);
EXPECT_TRUE(dev);
EXPECT_FALSE(mgr->MakeDevice(kAndroidLegacyDevice));
}
{
std::vector<std::unique_ptr<Device>> devices;
for (int i = 0; i < 4; ++i) {
auto dev = mgr->MakeDevice(base::StringPrintf("%d", i));
EXPECT_TRUE(dev);
devices.emplace_back(std::move(dev));
}
EXPECT_FALSE(mgr->MakeDevice("x"));
}
}
TEST_F(DeviceManagerTest, CtorAddsAndroidDevice) {
capture_msgs_ = true;
auto mgr = NewManager();
VerifyMsgs({android_announce_msg_});
}
TEST_F(DeviceManagerTest, CtorAddsLegacyAndroidDevice_MultinetDisabled) {
capture_msgs_ = true;
auto mgr = NewManager(kAndroidLegacyDevice);
VerifyMsgs({legacy_android_announce_msg_});
}
TEST_F(DeviceManagerTest, AddNewDevices) {
auto mgr = NewManager();
EXPECT_TRUE(mgr->Add("eth0"));
}
TEST_F(DeviceManagerTest, CannotAddExistingDevice) {
auto mgr = NewManager();
EXPECT_FALSE(mgr->Add(kAndroidDevice));
}
TEST_F(DeviceManagerTest, CannotAddExistingDevice_MultinetDisabled) {
auto mgr = NewManager(kAndroidLegacyDevice);
EXPECT_FALSE(mgr->Add(kAndroidLegacyDevice));
}
TEST_F(DeviceManagerTest, ResetAddsNewDevices) {
auto mgr = NewManager();
EXPECT_TRUE(mgr->Add("eth0"));
EXPECT_EQ(mgr->Reset({"eth0", "wlan0"}), 3);
}
TEST_F(DeviceManagerTest, ResetRemovesExistingDevices) {
auto mgr = NewManager();
EXPECT_TRUE(mgr->Add("eth0"));
EXPECT_EQ(mgr->Reset({"wlan0"}), 2);
// Can use Add now to verify only android and wlan0 exist (eth0 removed).
EXPECT_FALSE(mgr->Add(kAndroidDevice));
EXPECT_FALSE(mgr->Add("wlan0"));
}
TEST_F(DeviceManagerTest, EnableDoesNothing_Multinet) {
auto mgr = NewManager(kAndroidDevice);
EXPECT_FALSE(mgr->Enable("eth0"));
}
TEST_F(DeviceManagerTest, DisableDoesNothing_Multinet) {
auto mgr = NewManager(kAndroidDevice);
EXPECT_FALSE(mgr->Enable("eth0"));
EXPECT_FALSE(mgr->Disable());
}
TEST_F(DeviceManagerTest, Enable_MultinetDisabled) {
auto mgr = NewManager(kAndroidLegacyDevice);
// Need to use an empty interface here so that Device::Enable does not
// proceed since it will crash during testing while trying to set up
// IPv6 route finding.
EXPECT_TRUE(mgr->Enable(""));
}
TEST_F(DeviceManagerTest, CanDisableLegacyAndroidDevice_MultinetDisabled) {
auto mgr = NewManager(kAndroidLegacyDevice);
EXPECT_TRUE(mgr->Enable(""));
EXPECT_TRUE(mgr->Disable());
}
} // namespace arc_networkd