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

Side by Side 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 unified diff | Download patch
« no previous file with comments | « webrtc/base/network.cc ('k') | webrtc/p2p/base/candidate.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 16 matching lines...) Expand all
27 namespace rtc { 27 namespace rtc {
28 28
29 namespace { 29 namespace {
30 30
31 class FakeNetworkMonitor : public NetworkMonitorBase { 31 class FakeNetworkMonitor : public NetworkMonitorBase {
32 public: 32 public:
33 void Start() override { started_ = true; } 33 void Start() override { started_ = true; }
34 void Stop() override { started_ = false; } 34 void Stop() override { started_ = false; }
35 bool started() { return started_; } 35 bool started() { return started_; }
36 AdapterType GetAdapterType(const std::string& if_name) override { 36 AdapterType GetAdapterType(const std::string& if_name) override {
37 // Note that the name matching rules are different from the
38 // GetAdapterTypeFromName in NetworkManager.
39 if (if_name.find("wifi") == 0) {
40 return ADAPTER_TYPE_WIFI;
41 }
42 if (if_name.find("cellular") == 0) {
43 return ADAPTER_TYPE_CELLULAR;
44 }
37 return ADAPTER_TYPE_UNKNOWN; 45 return ADAPTER_TYPE_UNKNOWN;
38 } 46 }
39 47
40 private: 48 private:
41 bool started_ = false; 49 bool started_ = false;
42 }; 50 };
43 51
44 class FakeNetworkMonitorFactory : public NetworkMonitorFactory { 52 class FakeNetworkMonitorFactory : public NetworkMonitorFactory {
45 public: 53 public:
46 FakeNetworkMonitorFactory() {} 54 FakeNetworkMonitorFactory() {}
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 network_manager.network_monitor_.get()); 103 network_manager.network_monitor_.get());
96 } 104 }
97 void ClearNetworks(BasicNetworkManager& network_manager) { 105 void ClearNetworks(BasicNetworkManager& network_manager) {
98 for (const auto& kv : network_manager.networks_map_) { 106 for (const auto& kv : network_manager.networks_map_) {
99 delete kv.second; 107 delete kv.second;
100 } 108 }
101 network_manager.networks_.clear(); 109 network_manager.networks_.clear();
102 network_manager.networks_map_.clear(); 110 network_manager.networks_map_.clear();
103 } 111 }
104 112
113 AdapterType GetAdapterType(BasicNetworkManager& network_manager) {
114 BasicNetworkManager::NetworkList list;
115 network_manager.GetNetworks(&list);
116 ASSERT(list.size() == 1u);
117 return list[0]->type();
118 }
119
105 #if defined(WEBRTC_POSIX) 120 #if defined(WEBRTC_POSIX)
106 // Separated from CreateNetworks for tests. 121 // Separated from CreateNetworks for tests.
107 static void CallConvertIfAddrs(const BasicNetworkManager& network_manager, 122 static void CallConvertIfAddrs(const BasicNetworkManager& network_manager,
108 struct ifaddrs* interfaces, 123 struct ifaddrs* interfaces,
109 bool include_ignored, 124 bool include_ignored,
110 NetworkManager::NetworkList* networks) { 125 NetworkManager::NetworkList* networks) {
111 // Use the base IfAddrsConverter for test cases. 126 // Use the base IfAddrsConverter for test cases.
112 std::unique_ptr<IfAddrsConverter> ifaddrs_converter(new IfAddrsConverter()); 127 std::unique_ptr<IfAddrsConverter> ifaddrs_converter(new IfAddrsConverter());
113 network_manager.ConvertIfAddrs(interfaces, ifaddrs_converter.get(), 128 network_manager.ConvertIfAddrs(interfaces, ifaddrs_converter.get(),
114 include_ignored, networks); 129 include_ignored, networks);
(...skipping 22 matching lines...) Expand all
137 if_addr->ifa_name = if_name; 152 if_addr->ifa_name = if_name;
138 if_addr->ifa_addr = reinterpret_cast<struct sockaddr*>( 153 if_addr->ifa_addr = reinterpret_cast<struct sockaddr*>(
139 CreateIpv6Addr(ipv6_address, scope_id)); 154 CreateIpv6Addr(ipv6_address, scope_id));
140 if_addr->ifa_netmask = 155 if_addr->ifa_netmask =
141 reinterpret_cast<struct sockaddr*>(CreateIpv6Addr(ipv6_netmask, 0)); 156 reinterpret_cast<struct sockaddr*>(CreateIpv6Addr(ipv6_netmask, 0));
142 if_addr->ifa_next = list; 157 if_addr->ifa_next = list;
143 if_addr->ifa_flags = IFF_RUNNING; 158 if_addr->ifa_flags = IFF_RUNNING;
144 return if_addr; 159 return if_addr;
145 } 160 }
146 161
162 struct ifaddrs* InstallIpv6Network(char* if_name,
163 const std::string& ipv6_address,
164 const std::string& ipv6_mask,
165 BasicNetworkManager& network_manager) {
166 ifaddrs* addr_list = nullptr;
167 addr_list = AddIpv6Address(addr_list, if_name, ipv6_address, ipv6_mask, 0);
168 NetworkManager::NetworkList result;
169 bool changed;
170 NetworkManager::Stats stats;
171 CallConvertIfAddrs(network_manager, addr_list, true, &result);
172 network_manager.MergeNetworkList(result, &changed, &stats);
173 return addr_list;
174 }
175
147 void ReleaseIfAddrs(struct ifaddrs* list) { 176 void ReleaseIfAddrs(struct ifaddrs* list) {
148 struct ifaddrs* if_addr = list; 177 struct ifaddrs* if_addr = list;
149 while (if_addr != nullptr) { 178 while (if_addr != nullptr) {
150 struct ifaddrs* next_addr = if_addr->ifa_next; 179 struct ifaddrs* next_addr = if_addr->ifa_next;
151 delete if_addr->ifa_addr; 180 delete if_addr->ifa_addr;
152 delete if_addr->ifa_netmask; 181 delete if_addr->ifa_netmask;
153 delete if_addr; 182 delete if_addr;
154 if_addr = next_addr; 183 if_addr = next_addr;
155 } 184 }
156 } 185 }
(...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after
774 sockaddr ifa_addr; 803 sockaddr ifa_addr;
775 sockaddr ifa_netmask; 804 sockaddr ifa_netmask;
776 list.ifa_addr = &ifa_addr; 805 list.ifa_addr = &ifa_addr;
777 list.ifa_netmask = &ifa_netmask; 806 list.ifa_netmask = &ifa_netmask;
778 807
779 NetworkManager::NetworkList result; 808 NetworkManager::NetworkList result;
780 BasicNetworkManager manager; 809 BasicNetworkManager manager;
781 CallConvertIfAddrs(manager, &list, true, &result); 810 CallConvertIfAddrs(manager, &list, true, &result);
782 EXPECT_TRUE(result.empty()); 811 EXPECT_TRUE(result.empty());
783 } 812 }
813
814 // Tests that the network type can be updated after the network monitor is
815 // started.
816 TEST_F(NetworkTest, TestGetAdapterTypeFromNetworkMonitor) {
817 char if_name1[20] = "wifi0";
818 std::string ipv6_address1 = "1000:2000:3000:4000:0:0:0:1";
819 std::string ipv6_address2 = "1000:2000:3000:8000:0:0:0:1";
820 std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
821 BasicNetworkManager manager;
822 // A network created before the network monitor is started will get
823 // UNKNOWN type.
824 ifaddrs* addr_list =
825 InstallIpv6Network(if_name1, ipv6_address1, ipv6_mask, manager);
826 EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, GetAdapterType(manager));
827 ReleaseIfAddrs(addr_list);
828 // Note: Do not call ClearNetworks here in order to test that the type
829 // of an existing network can be changed after the network monitor starts
830 // and detects the network type correctly.
831
832 // After the network monitor starts, the type will be updated.
833 FakeNetworkMonitorFactory* factory = new FakeNetworkMonitorFactory();
834 NetworkMonitorFactory::SetFactory(factory);
835 // This brings up the hook with the network monitor.
836 manager.StartUpdating();
837 // Add the same ipv6 address as before but it has the right network type
838 // detected by the network monitor now.
839 addr_list = InstallIpv6Network(if_name1, ipv6_address1, ipv6_mask, manager);
840 EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
841 ReleaseIfAddrs(addr_list);
842 ClearNetworks(manager);
843
844 // Add another network with the type inferred from the network monitor.
845 char if_name2[20] = "cellular0";
846 addr_list = InstallIpv6Network(if_name2, ipv6_address2, ipv6_mask, manager);
847 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
848 ReleaseIfAddrs(addr_list);
849 ClearNetworks(manager);
850 }
851
852 // Test that the network type can be determined based on name matching in
853 // a few cases. Note that UNKNOWN type for non-matching strings has been tested
854 // in the above test.
855 TEST_F(NetworkTest, TestGetAdapterTypeFromNameMatching) {
856 std::string ipv6_address1 = "1000:2000:3000:4000:0:0:0:1";
857 std::string ipv6_address2 = "1000:2000:3000:8000:0:0:0:1";
858 std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
859 BasicNetworkManager manager;
860
861 #if defined(WEBRTC_IOS)
862 char if_name[20] = "pdp_ip0";
863 ifaddrs* addr_list =
864 InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
865
866 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
867 ClearNetworks(manager);
868 ReleaseIfAddrs(addr_list);
869
870 #elif defined(WEBRTC_ANDROID)
871 char if_name[20] = "rmnet0";
872 ifaddrs* addr_list =
873 InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
874
875 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
876 ClearNetworks(manager);
877 ReleaseIfAddrs(addr_list);
878
879 strcpy(if_name, "wlan1");
880 addr_list = InstallIpv6Network(if_name, ipv6_address2, ipv6_mask, manager);
881 EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
882 ClearNetworks(manager);
883 ReleaseIfAddrs(addr_list);
884
885 strcpy(if_name, "v4-rmnet_data0");
886 addr_list = InstallIpv6Network(if_name, ipv6_address2, ipv6_mask, manager);
887 EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
888 ClearNetworks(manager);
889 ReleaseIfAddrs(addr_list);
890 #else
891 char if_name[20] = "wlan0";
892 ifaddrs* addr_list =
893 InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
894
895 EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, GetAdapterType(manager));
896 ClearNetworks(manager);
897 ReleaseIfAddrs(addr_list);
898 #endif
899 }
784 #endif // defined(WEBRTC_POSIX) 900 #endif // defined(WEBRTC_POSIX)
785 901
786 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) 902 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
787 // If you want to test non-default routes, you can do the following on a linux 903 // If you want to test non-default routes, you can do the following on a linux
788 // machine: 904 // machine:
789 // 1) Load the dummy network driver: 905 // 1) Load the dummy network driver:
790 // sudo modprobe dummy 906 // sudo modprobe dummy
791 // sudo ifconfig dummy0 127.0.0.1 907 // sudo ifconfig dummy0 127.0.0.1
792 // 2) Run this test and confirm the output says it found a dummy route (and 908 // 2) Run this test and confirm the output says it found a dummy route (and
793 // passes). 909 // passes).
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
1033 // If the set default address is in a network, GetDefaultLocalAddress will 1149 // If the set default address is in a network, GetDefaultLocalAddress will
1034 // return the best IP in that network. 1150 // return the best IP in that network.
1035 manager.set_default_local_addresses(GetLoopbackIP(AF_INET), ip2); 1151 manager.set_default_local_addresses(GetLoopbackIP(AF_INET), ip2);
1036 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip)); 1152 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
1037 EXPECT_EQ(static_cast<IPAddress>(ip1), ip); 1153 EXPECT_EQ(static_cast<IPAddress>(ip1), ip);
1038 1154
1039 manager.StopUpdating(); 1155 manager.StopUpdating();
1040 } 1156 }
1041 1157
1042 } // namespace rtc 1158 } // namespace rtc
OLDNEW
« 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