blob: 5922ce9e7998434df0a89e26aa561efd4c03e0b8 [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 <vector>
#include <gtest/gtest.h>
namespace arc_networkd {
namespace {
class DeviceManagerTest : public testing::Test {
protected:
void SetUp() override {
capture_msgs_ = false;
auto dev = Device::ForInterface(
kAndroidDevice,
base::Bind(&DeviceManagerTest::RecvMsg, base::Unretained(this)));
android_announce_msg_.set_dev_ifname(kAndroidDevice);
*android_announce_msg_.mutable_dev_config() = dev->config();
}
std::unique_ptr<DeviceManager> NewManager() {
return std::make_unique<DeviceManager>(
base::Bind(&DeviceManagerTest::RecvMsg, base::Unretained(this)));
}
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_;
private:
void RecvMsg(const IpHelperMessage& msg) {
if (capture_msgs_)
msgs_recv_.emplace_back(msg.SerializeAsString());
}
std::vector<std::string> msgs_recv_;
};
} // namespace
TEST_F(DeviceManagerTest, CtorAddsAndroidDevice) {
capture_msgs_ = true;
auto mgr = NewManager();
VerifyMsgs({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, 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, CannotEnableNonAndroidDevice) {
auto mgr = NewManager();
EXPECT_FALSE(mgr->Enable("eth0", "eth0"));
}
TEST_F(DeviceManagerTest, CannotDisableNonAndroidDevice) {
auto mgr = NewManager();
EXPECT_FALSE(mgr->Disable("eth0"));
}
TEST_F(DeviceManagerTest, CanDisableAndroidDevice) {
auto mgr = NewManager();
capture_msgs_ = true;
EXPECT_TRUE(mgr->Disable(kAndroidDevice));
IpHelperMessage clear_msg;
clear_msg.set_dev_ifname(kAndroidDevice);
clear_msg.set_clear_arc_ip(true);
IpHelperMessage disable_msg;
disable_msg.set_dev_ifname(kAndroidDevice);
disable_msg.set_disable_inbound(true);
VerifyMsgs({clear_msg, disable_msg});
}
TEST_F(DeviceManagerTest, DisabllAllDisablesAndroidDevice) {
auto mgr = NewManager();
capture_msgs_ = true;
mgr->DisableAll();
IpHelperMessage clear_msg;
clear_msg.set_dev_ifname(kAndroidDevice);
clear_msg.set_clear_arc_ip(true);
IpHelperMessage disable_msg;
disable_msg.set_dev_ifname(kAndroidDevice);
disable_msg.set_disable_inbound(true);
VerifyMsgs({clear_msg, disable_msg});
}
} // namespace arc_networkd