Chromium Code Reviews| Index: webrtc/base/network_unittest.cc |
| diff --git a/webrtc/base/network_unittest.cc b/webrtc/base/network_unittest.cc |
| index f3193e2b0f3fdd18da34e7358d8be60b1297fc72..62e63eb92284078ee94d3ac8725fadf2a78bde31 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 not 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 to check that an existing network |
|
pthatcher1
2016/05/17 21:23:11
do => Do
honghaiz3
2016/05/18 07:41:46
Done.
|
| + // will be updated. |
|
pthatcher1
2016/05/17 21:23:11
Why not? It could use some explanation.
honghaiz3
2016/05/18 07:41:47
Added explanations.
|
| + |
| + // 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 |
| + // inferred from 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 UNKNOW type for non-matching strings has been tested |
|
pthatcher1
2016/05/17 21:23:11
UNKNOW => UNKNOWN
honghaiz3
2016/05/18 07:41:46
Done.
|
| +// 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) |