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 not 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 to check that an existing network | |
pthatcher1
2016/05/17 21:23:11
do => Do
honghaiz3
2016/05/18 07:41:46
Done.
| |
829 // 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.
| |
830 | |
831 // After the network monitor starts, the type will be updated. | |
832 FakeNetworkMonitorFactory* factory = new FakeNetworkMonitorFactory(); | |
833 NetworkMonitorFactory::SetFactory(factory); | |
834 // This brings up the hook with the network monitor. | |
835 manager.StartUpdating(); | |
836 // Add the same ipv6 address as before but it has the right network type | |
837 // inferred from the network monitor now. | |
838 addr_list = InstallIpv6Network(if_name1, ipv6_address1, ipv6_mask, manager); | |
839 | |
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 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.
| |
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 |