OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |