| Index: webrtc/base/network_unittest.cc
|
| diff --git a/webrtc/base/network_unittest.cc b/webrtc/base/network_unittest.cc
|
| index f3193e2b0f3fdd18da34e7358d8be60b1297fc72..9572c697467736fac007601a9f027befc3f36bc9 100644
|
| --- a/webrtc/base/network_unittest.cc
|
| +++ b/webrtc/base/network_unittest.cc
|
| @@ -34,6 +34,14 @@ class FakeNetworkMonitor : public NetworkMonitorBase {
|
| void Stop() override { started_ = false; }
|
| bool started() { return started_; }
|
| AdapterType GetAdapterType(const std::string& if_name) override {
|
| + // Note that the name matching rules are different from the
|
| + // GetAdapterTypeFromName in NetworkManager.
|
| + if (if_name.find("wifi") == 0) {
|
| + return ADAPTER_TYPE_WIFI;
|
| + }
|
| + if (if_name.find("cellular") == 0) {
|
| + return ADAPTER_TYPE_CELLULAR;
|
| + }
|
| return ADAPTER_TYPE_UNKNOWN;
|
| }
|
|
|
| @@ -102,6 +110,13 @@ class NetworkTest : public testing::Test, public sigslot::has_slots<> {
|
| network_manager.networks_map_.clear();
|
| }
|
|
|
| + AdapterType GetAdapterType(BasicNetworkManager& network_manager) {
|
| + BasicNetworkManager::NetworkList list;
|
| + network_manager.GetNetworks(&list);
|
| + ASSERT(list.size() == 1u);
|
| + return list[0]->type();
|
| + }
|
| +
|
| #if defined(WEBRTC_POSIX)
|
| // Separated from CreateNetworks for tests.
|
| static void CallConvertIfAddrs(const BasicNetworkManager& network_manager,
|
| @@ -144,6 +159,20 @@ class NetworkTest : public testing::Test, public sigslot::has_slots<> {
|
| return if_addr;
|
| }
|
|
|
| + struct ifaddrs* InstallIpv6Network(char* if_name,
|
| + const std::string& ipv6_address,
|
| + const std::string& ipv6_mask,
|
| + BasicNetworkManager& network_manager) {
|
| + ifaddrs* addr_list = nullptr;
|
| + addr_list = AddIpv6Address(addr_list, if_name, ipv6_address, ipv6_mask, 0);
|
| + NetworkManager::NetworkList result;
|
| + bool changed;
|
| + NetworkManager::Stats stats;
|
| + CallConvertIfAddrs(network_manager, addr_list, true, &result);
|
| + network_manager.MergeNetworkList(result, &changed, &stats);
|
| + return addr_list;
|
| + }
|
| +
|
| void ReleaseIfAddrs(struct ifaddrs* list) {
|
| struct ifaddrs* if_addr = list;
|
| while (if_addr != nullptr) {
|
| @@ -781,6 +810,93 @@ TEST_F(NetworkTest, TestConvertIfAddrsNotRunning) {
|
| CallConvertIfAddrs(manager, &list, true, &result);
|
| EXPECT_TRUE(result.empty());
|
| }
|
| +
|
| +// Tests that the network type can be updated after the network monitor is
|
| +// started.
|
| +TEST_F(NetworkTest, TestGetAdapterTypeFromNetworkMonitor) {
|
| + char if_name1[20] = "wifi0";
|
| + std::string ipv6_address1 = "1000:2000:3000:4000:0:0:0:1";
|
| + std::string ipv6_address2 = "1000:2000:3000:8000:0:0:0:1";
|
| + std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
|
| + BasicNetworkManager manager;
|
| + // A network created before the network monitor is started will get
|
| + // UNKNOWN type.
|
| + ifaddrs* addr_list =
|
| + InstallIpv6Network(if_name1, ipv6_address1, ipv6_mask, manager);
|
| + EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, GetAdapterType(manager));
|
| + ReleaseIfAddrs(addr_list);
|
| + // Note: Do not call ClearNetworks here in order to test that the type
|
| + // of an existing network can be changed after the network monitor starts
|
| + // and detects the network type correctly.
|
| +
|
| + // After the network monitor starts, the type will be updated.
|
| + FakeNetworkMonitorFactory* factory = new FakeNetworkMonitorFactory();
|
| + NetworkMonitorFactory::SetFactory(factory);
|
| + // This brings up the hook with the network monitor.
|
| + manager.StartUpdating();
|
| + // Add the same ipv6 address as before but it has the right network type
|
| + // detected by the network monitor now.
|
| + addr_list = InstallIpv6Network(if_name1, ipv6_address1, ipv6_mask, manager);
|
| + EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
|
| + ReleaseIfAddrs(addr_list);
|
| + ClearNetworks(manager);
|
| +
|
| + // Add another network with the type inferred from the network monitor.
|
| + char if_name2[20] = "cellular0";
|
| + addr_list = InstallIpv6Network(if_name2, ipv6_address2, ipv6_mask, manager);
|
| + EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
|
| + ReleaseIfAddrs(addr_list);
|
| + ClearNetworks(manager);
|
| +}
|
| +
|
| +// Test that the network type can be determined based on name matching in
|
| +// a few cases. Note that UNKNOWN type for non-matching strings has been tested
|
| +// in the above test.
|
| +TEST_F(NetworkTest, TestGetAdapterTypeFromNameMatching) {
|
| + std::string ipv6_address1 = "1000:2000:3000:4000:0:0:0:1";
|
| + std::string ipv6_address2 = "1000:2000:3000:8000:0:0:0:1";
|
| + std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
|
| + BasicNetworkManager manager;
|
| +
|
| +#if defined(WEBRTC_IOS)
|
| + char if_name[20] = "pdp_ip0";
|
| + ifaddrs* addr_list =
|
| + InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
|
| +
|
| + EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
|
| + ClearNetworks(manager);
|
| + ReleaseIfAddrs(addr_list);
|
| +
|
| +#elif defined(WEBRTC_ANDROID)
|
| + char if_name[20] = "rmnet0";
|
| + ifaddrs* addr_list =
|
| + InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
|
| +
|
| + EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
|
| + ClearNetworks(manager);
|
| + ReleaseIfAddrs(addr_list);
|
| +
|
| + strcpy(if_name, "wlan1");
|
| + addr_list = InstallIpv6Network(if_name, ipv6_address2, ipv6_mask, manager);
|
| + EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
|
| + ClearNetworks(manager);
|
| + ReleaseIfAddrs(addr_list);
|
| +
|
| + strcpy(if_name, "v4-rmnet_data0");
|
| + addr_list = InstallIpv6Network(if_name, ipv6_address2, ipv6_mask, manager);
|
| + EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
|
| + ClearNetworks(manager);
|
| + ReleaseIfAddrs(addr_list);
|
| +#else
|
| + char if_name[20] = "wlan0";
|
| + ifaddrs* addr_list =
|
| + InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
|
| +
|
| + EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, GetAdapterType(manager));
|
| + ClearNetworks(manager);
|
| + ReleaseIfAddrs(addr_list);
|
| +#endif
|
| +}
|
| #endif // defined(WEBRTC_POSIX)
|
|
|
| #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
|
|
|