Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(164)

Unified Diff: webrtc/base/network_unittest.cc

Issue 1976683003: Update the type and cost of existing networks if its type is found later by network monitor (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: Minor changes Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/base/network.cc ('k') | webrtc/p2p/base/candidate.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)
« no previous file with comments | « webrtc/base/network.cc ('k') | webrtc/p2p/base/candidate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698