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

Side by Side Diff: net/base/net_util_unittest.cc

Issue 1154323007: Split network_interfaces.h off of net_utils.h. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@ip_util
Patch Set: address matt's comments Created 5 years, 6 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 | « net/base/net_util_posix.cc ('k') | net/base/net_util_win.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 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/base/net_util.h" 5 #include "net/base/net_util.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <ostream> 9 #include <ostream>
10 10
(...skipping 24 matching lines...) Expand all
35 #if defined(OS_WIN) 35 #if defined(OS_WIN)
36 #include <iphlpapi.h> 36 #include <iphlpapi.h>
37 #include <objbase.h> 37 #include <objbase.h>
38 #include "base/win/windows_version.h" 38 #include "base/win/windows_version.h"
39 #endif // OS_WIN 39 #endif // OS_WIN
40 40
41 #if !defined(OS_MACOSX) && !defined(OS_NACL) && !defined(OS_WIN) 41 #if !defined(OS_MACOSX) && !defined(OS_NACL) && !defined(OS_WIN)
42 #include "net/base/address_tracker_linux.h" 42 #include "net/base/address_tracker_linux.h"
43 #endif // !OS_MACOSX && !OS_NACL && !OS_WIN 43 #endif // !OS_MACOSX && !OS_NACL && !OS_WIN
44 44
45 #if defined(OS_WIN)
46 #include "net/base/net_util_win.h"
47 #else // OS_WIN
48 #include "net/base/net_util_posix.h"
49 #if defined(OS_MACOSX)
50 #include "net/base/net_util_mac.h"
51 #else // OS_MACOSX
52 #include "net/base/net_util_linux.h"
53 #endif // OS_MACOSX
54 #endif // OS_WIN
55
56 using base::ASCIIToUTF16; 45 using base::ASCIIToUTF16;
57 using base::WideToUTF16; 46 using base::WideToUTF16;
58 47
59 namespace net { 48 namespace net {
60 49
61 namespace { 50 namespace {
62 51
63 struct HeaderCase { 52 struct HeaderCase {
64 const char* const header_name; 53 const char* const header_name;
65 const char* const expected; 54 const char* const expected;
66 }; 55 };
67 56
68 #if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_CHROMEOS)
69 const char kWiFiSSID[] = "TestWiFi";
70 const char kInterfaceWithDifferentSSID[] = "wlan999";
71
72 std::string TestGetInterfaceSSID(const std::string& ifname) {
73 return (ifname == kInterfaceWithDifferentSSID) ? "AnotherSSID" : kWiFiSSID;
74 }
75 #endif
76
77 // Fills in sockaddr for the given 32-bit address (IPv4.) 57 // Fills in sockaddr for the given 32-bit address (IPv4.)
78 // |bytes| should be an array of length 4. 58 // |bytes| should be an array of length 4.
79 void MakeIPv4Address(const uint8* bytes, int port, SockaddrStorage* storage) { 59 void MakeIPv4Address(const uint8* bytes, int port, SockaddrStorage* storage) {
80 memset(&storage->addr_storage, 0, sizeof(storage->addr_storage)); 60 memset(&storage->addr_storage, 0, sizeof(storage->addr_storage));
81 storage->addr_len = sizeof(struct sockaddr_in); 61 storage->addr_len = sizeof(struct sockaddr_in);
82 struct sockaddr_in* addr4 = reinterpret_cast<sockaddr_in*>(storage->addr); 62 struct sockaddr_in* addr4 = reinterpret_cast<sockaddr_in*>(storage->addr);
83 addr4->sin_port = base::HostToNet16(port); 63 addr4->sin_port = base::HostToNet16(port);
84 addr4->sin_family = AF_INET; 64 addr4->sin_family = AF_INET;
85 memcpy(&addr4->sin_addr, bytes, 4); 65 memcpy(&addr4->sin_addr, bytes, 4);
86 } 66 }
87 67
88 // Fills in sockaddr for the given 128-bit address (IPv6.) 68 // Fills in sockaddr for the given 128-bit address (IPv6.)
89 // |bytes| should be an array of length 16. 69 // |bytes| should be an array of length 16.
90 void MakeIPv6Address(const uint8* bytes, int port, SockaddrStorage* storage) { 70 void MakeIPv6Address(const uint8* bytes, int port, SockaddrStorage* storage) {
91 memset(&storage->addr_storage, 0, sizeof(storage->addr_storage)); 71 memset(&storage->addr_storage, 0, sizeof(storage->addr_storage));
92 storage->addr_len = sizeof(struct sockaddr_in6); 72 storage->addr_len = sizeof(struct sockaddr_in6);
93 struct sockaddr_in6* addr6 = reinterpret_cast<sockaddr_in6*>(storage->addr); 73 struct sockaddr_in6* addr6 = reinterpret_cast<sockaddr_in6*>(storage->addr);
94 addr6->sin6_port = base::HostToNet16(port); 74 addr6->sin6_port = base::HostToNet16(port);
95 addr6->sin6_family = AF_INET6; 75 addr6->sin6_family = AF_INET6;
96 memcpy(&addr6->sin6_addr, bytes, 16); 76 memcpy(&addr6->sin6_addr, bytes, 16);
97 } 77 }
98 78
99 #if defined(OS_MACOSX)
100 class IPAttributesGetterTest : public internal::IPAttributesGetterMac {
101 public:
102 IPAttributesGetterTest() : native_attributes_(0) {}
103 bool IsInitialized() const override { return true; }
104 bool GetIPAttributes(const char* ifname,
105 const sockaddr* sock_addr,
106 int* native_attributes) override {
107 *native_attributes = native_attributes_;
108 return true;
109 }
110 void set_native_attributes(int native_attributes) {
111 native_attributes_ = native_attributes;
112 }
113
114 private:
115 int native_attributes_;
116 };
117
118 // Helper function to create a single valid ifaddrs
119 bool FillIfaddrs(ifaddrs* interfaces,
120 const char* ifname,
121 uint flags,
122 const IPAddressNumber& ip_address,
123 const IPAddressNumber& ip_netmask,
124 sockaddr_storage sock_addrs[2]) {
125 interfaces->ifa_next = NULL;
126 interfaces->ifa_name = const_cast<char*>(ifname);
127 interfaces->ifa_flags = flags;
128
129 socklen_t sock_len = sizeof(sockaddr_storage);
130
131 // Convert to sockaddr for next check.
132 if (!IPEndPoint(ip_address, 0)
133 .ToSockAddr(reinterpret_cast<sockaddr*>(&sock_addrs[0]),
134 &sock_len)) {
135 return false;
136 }
137 interfaces->ifa_addr = reinterpret_cast<sockaddr*>(&sock_addrs[0]);
138
139 sock_len = sizeof(sockaddr_storage);
140 if (!IPEndPoint(ip_netmask, 0)
141 .ToSockAddr(reinterpret_cast<sockaddr*>(&sock_addrs[1]),
142 &sock_len)) {
143 return false;
144 }
145 interfaces->ifa_netmask = reinterpret_cast<sockaddr*>(&sock_addrs[1]);
146
147 return true;
148 }
149 #endif // OS_MACOSX
150
151 } // anonymous namespace 79 } // anonymous namespace
152 80
153 TEST(NetUtilTest, GetIdentityFromURL) { 81 TEST(NetUtilTest, GetIdentityFromURL) {
154 struct { 82 struct {
155 const char* const input_url; 83 const char* const input_url;
156 const char* const expected_username; 84 const char* const expected_username;
157 const char* const expected_password; 85 const char* const expected_password;
158 } tests[] = { 86 } tests[] = {
159 { 87 {
160 "http://username:password@google.com", 88 "http://username:password@google.com",
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after
616 {GURL("http://google.co"), false}, 544 {GURL("http://google.co"), false},
617 {GURL("http://oggole.com"), false}, 545 {GURL("http://oggole.com"), false},
618 }; 546 };
619 547
620 for (size_t i = 0; i < arraysize(google_host_cases); ++i) { 548 for (size_t i = 0; i < arraysize(google_host_cases); ++i) {
621 EXPECT_EQ(google_host_cases[i].expected_output, 549 EXPECT_EQ(google_host_cases[i].expected_output,
622 HasGoogleHost(google_host_cases[i].url)); 550 HasGoogleHost(google_host_cases[i].url));
623 } 551 }
624 } 552 }
625 553
626 // Verify GetNetworkList().
627 TEST(NetUtilTest, GetNetworkList) {
628 NetworkInterfaceList list;
629 ASSERT_TRUE(GetNetworkList(&list, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES));
630 for (NetworkInterfaceList::iterator it = list.begin();
631 it != list.end(); ++it) {
632 // Verify that the names are not empty.
633 EXPECT_FALSE(it->name.empty());
634 EXPECT_FALSE(it->friendly_name.empty());
635
636 // Verify that the address is correct.
637 EXPECT_TRUE(it->address.size() == kIPv4AddressSize ||
638 it->address.size() == kIPv6AddressSize)
639 << "Invalid address of size " << it->address.size();
640 bool all_zeroes = true;
641 for (size_t i = 0; i < it->address.size(); ++i) {
642 if (it->address[i] != 0) {
643 all_zeroes = false;
644 break;
645 }
646 }
647 EXPECT_FALSE(all_zeroes);
648 EXPECT_GT(it->prefix_length, 1u);
649 EXPECT_LE(it->prefix_length, it->address.size() * 8);
650
651 #if defined(OS_WIN)
652 // On Windows |name| is NET_LUID.
653 base::ScopedNativeLibrary phlpapi_lib(
654 base::FilePath(FILE_PATH_LITERAL("iphlpapi.dll")));
655 ASSERT_TRUE(phlpapi_lib.is_valid());
656 typedef NETIO_STATUS (WINAPI* ConvertInterfaceIndexToLuid)(NET_IFINDEX,
657 PNET_LUID);
658 ConvertInterfaceIndexToLuid interface_to_luid =
659 reinterpret_cast<ConvertInterfaceIndexToLuid>(
660 phlpapi_lib.GetFunctionPointer("ConvertInterfaceIndexToLuid"));
661
662 typedef NETIO_STATUS (WINAPI* ConvertInterfaceLuidToGuid)(NET_LUID*,
663 GUID*);
664 ConvertInterfaceLuidToGuid luid_to_guid =
665 reinterpret_cast<ConvertInterfaceLuidToGuid>(
666 phlpapi_lib.GetFunctionPointer("ConvertInterfaceLuidToGuid"));
667
668 if (interface_to_luid && luid_to_guid) {
669 NET_LUID luid;
670 EXPECT_EQ(interface_to_luid(it->interface_index, &luid), NO_ERROR);
671 GUID guid;
672 EXPECT_EQ(luid_to_guid(&luid, &guid), NO_ERROR);
673 LPOLESTR name;
674 StringFromCLSID(guid, &name);
675 EXPECT_STREQ(base::UTF8ToWide(it->name).c_str(), name);
676 CoTaskMemFree(name);
677 continue;
678 } else {
679 EXPECT_LT(base::win::GetVersion(), base::win::VERSION_VISTA);
680 EXPECT_LT(it->interface_index, 1u << 24u); // Must fit 0.x.x.x.
681 EXPECT_NE(it->interface_index, 0u); // 0 means to use default.
682 }
683 if (it->type == NetworkChangeNotifier::CONNECTION_WIFI) {
684 EXPECT_NE(WIFI_PHY_LAYER_PROTOCOL_NONE, GetWifiPHYLayerProtocol());
685 }
686 #elif !defined(OS_ANDROID)
687 char name[IF_NAMESIZE];
688 EXPECT_TRUE(if_indextoname(it->interface_index, name));
689 EXPECT_STREQ(it->name.c_str(), name);
690 #endif
691 }
692 }
693
694 static const char ifname_em1[] = "em1";
695 #if defined(OS_WIN)
696 static const char ifname_vm[] = "VMnet";
697 #else
698 static const char ifname_vm[] = "vmnet";
699 #endif // OS_WIN
700
701 static const unsigned char kIPv6LocalAddr[] = {
702 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
703
704 // The following 3 addresses need to be changed together. IPv6Addr is the IPv6
705 // address. IPv6Netmask is the mask address with as many leading bits set to 1
706 // as the prefix length. IPv6AddrPrefix needs to match IPv6Addr with the same
707 // number of bits as the prefix length.
708 static const unsigned char kIPv6Addr[] =
709 {0x24, 0x01, 0xfa, 0x00, 0x00, 0x04, 0x10, 0x00, 0xbe, 0x30, 0x5b, 0xff,
710 0xfe, 0xe5, 0x00, 0xc3};
711 #if defined(OS_WIN)
712 static const unsigned char kIPv6AddrPrefix[] =
713 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
714 0x00, 0x00, 0x00, 0x00};
715 #endif // OS_WIN
716 #if defined(OS_MACOSX)
717 static const unsigned char kIPv6Netmask[] =
718 {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
719 0x00, 0x00, 0x00, 0x00};
720 #endif // OS_MACOSX
721
722 #if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(OS_NACL)
723
724 char* CopyInterfaceName(const char* ifname, int ifname_size, char* output) {
725 EXPECT_LT(ifname_size, IF_NAMESIZE);
726 memcpy(output, ifname, ifname_size);
727 return output;
728 }
729
730 char* GetInterfaceName(int interface_index, char* ifname) {
731 return CopyInterfaceName(ifname_em1, arraysize(ifname_em1), ifname);
732 }
733
734 char* GetInterfaceNameVM(int interface_index, char* ifname) {
735 return CopyInterfaceName(ifname_vm, arraysize(ifname_vm), ifname);
736 }
737
738 TEST(NetUtilTest, GetNetworkListTrimming) {
739 IPAddressNumber ipv6_local_address(
740 kIPv6LocalAddr, kIPv6LocalAddr + arraysize(kIPv6LocalAddr));
741 IPAddressNumber ipv6_address(kIPv6Addr, kIPv6Addr + arraysize(kIPv6Addr));
742
743 NetworkInterfaceList results;
744 ::base::hash_set<int> online_links;
745 internal::AddressTrackerLinux::AddressMap address_map;
746
747 // Interface 1 is offline.
748 struct ifaddrmsg msg = {
749 AF_INET6,
750 1, /* prefix length */
751 IFA_F_TEMPORARY, /* address flags */
752 0, /* link scope */
753 1 /* link index */
754 };
755
756 // Address of offline links should be ignored.
757 ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second);
758 EXPECT_TRUE(internal::GetNetworkListImpl(
759 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, online_links,
760 address_map, GetInterfaceName));
761 EXPECT_EQ(results.size(), 0ul);
762
763 // Mark interface 1 online.
764 online_links.insert(1);
765
766 // Local address should be trimmed out.
767 address_map.clear();
768 ASSERT_TRUE(
769 address_map.insert(std::make_pair(ipv6_local_address, msg)).second);
770 EXPECT_TRUE(internal::GetNetworkListImpl(
771 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, online_links,
772 address_map, GetInterfaceName));
773 EXPECT_EQ(results.size(), 0ul);
774
775 // vmware address should return by default.
776 address_map.clear();
777 ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second);
778 EXPECT_TRUE(internal::GetNetworkListImpl(
779 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, online_links,
780 address_map, GetInterfaceNameVM));
781 EXPECT_EQ(results.size(), 1ul);
782 EXPECT_EQ(results[0].name, ifname_vm);
783 EXPECT_EQ(results[0].prefix_length, 1ul);
784 EXPECT_EQ(results[0].address, ipv6_address);
785 results.clear();
786
787 // vmware address should be trimmed out if policy specified so.
788 address_map.clear();
789 ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second);
790 EXPECT_TRUE(internal::GetNetworkListImpl(
791 &results, EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, online_links,
792 address_map, GetInterfaceNameVM));
793 EXPECT_EQ(results.size(), 0ul);
794 results.clear();
795
796 // Addresses with banned attributes should be ignored.
797 address_map.clear();
798 msg.ifa_flags = IFA_F_TENTATIVE;
799 ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second);
800 EXPECT_TRUE(internal::GetNetworkListImpl(
801 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, online_links,
802 address_map, GetInterfaceName));
803 EXPECT_EQ(results.size(), 0ul);
804 results.clear();
805
806 // Addresses with allowed attribute IFA_F_TEMPORARY should be returned and
807 // attributes should be translated correctly.
808 address_map.clear();
809 msg.ifa_flags = IFA_F_TEMPORARY;
810 ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second);
811 EXPECT_TRUE(internal::GetNetworkListImpl(
812 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, online_links,
813 address_map, GetInterfaceName));
814 EXPECT_EQ(results.size(), 1ul);
815 EXPECT_EQ(results[0].name, ifname_em1);
816 EXPECT_EQ(results[0].prefix_length, 1ul);
817 EXPECT_EQ(results[0].address, ipv6_address);
818 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_TEMPORARY);
819 results.clear();
820
821 // Addresses with allowed attribute IFA_F_DEPRECATED should be returned and
822 // attributes should be translated correctly.
823 address_map.clear();
824 msg.ifa_flags = IFA_F_DEPRECATED;
825 ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second);
826 EXPECT_TRUE(internal::GetNetworkListImpl(
827 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, online_links,
828 address_map, GetInterfaceName));
829 EXPECT_EQ(results.size(), 1ul);
830 EXPECT_EQ(results[0].name, ifname_em1);
831 EXPECT_EQ(results[0].prefix_length, 1ul);
832 EXPECT_EQ(results[0].address, ipv6_address);
833 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_DEPRECATED);
834 results.clear();
835 }
836
837 #elif defined(OS_MACOSX)
838
839 TEST(NetUtilTest, GetNetworkListTrimming) {
840 IPAddressNumber ipv6_local_address(
841 kIPv6LocalAddr, kIPv6LocalAddr + arraysize(kIPv6LocalAddr));
842 IPAddressNumber ipv6_address(kIPv6Addr, kIPv6Addr + arraysize(kIPv6Addr));
843 IPAddressNumber ipv6_netmask(kIPv6Netmask,
844 kIPv6Netmask + arraysize(kIPv6Netmask));
845
846 NetworkInterfaceList results;
847 IPAttributesGetterTest ip_attributes_getter;
848 sockaddr_storage addresses[2];
849 ifaddrs interface;
850
851 // Address of offline links should be ignored.
852 ASSERT_TRUE(FillIfaddrs(&interface, ifname_em1, IFF_UP, ipv6_address,
853 ipv6_netmask, addresses));
854 EXPECT_TRUE(internal::GetNetworkListImpl(
855 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface,
856 &ip_attributes_getter));
857 EXPECT_EQ(results.size(), 0ul);
858
859 // Local address should be trimmed out.
860 ASSERT_TRUE(FillIfaddrs(&interface, ifname_em1, IFF_RUNNING,
861 ipv6_local_address, ipv6_netmask, addresses));
862 EXPECT_TRUE(internal::GetNetworkListImpl(
863 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface,
864 &ip_attributes_getter));
865 EXPECT_EQ(results.size(), 0ul);
866
867 // vmware address should return by default.
868 ASSERT_TRUE(FillIfaddrs(&interface, ifname_vm, IFF_RUNNING, ipv6_address,
869 ipv6_netmask, addresses));
870 EXPECT_TRUE(internal::GetNetworkListImpl(
871 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface,
872 &ip_attributes_getter));
873 EXPECT_EQ(results.size(), 1ul);
874 EXPECT_EQ(results[0].name, ifname_vm);
875 EXPECT_EQ(results[0].prefix_length, 1ul);
876 EXPECT_EQ(results[0].address, ipv6_address);
877 results.clear();
878
879 // vmware address should be trimmed out if policy specified so.
880 ASSERT_TRUE(FillIfaddrs(&interface, ifname_vm, IFF_RUNNING, ipv6_address,
881 ipv6_netmask, addresses));
882 EXPECT_TRUE(internal::GetNetworkListImpl(
883 &results, EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface,
884 &ip_attributes_getter));
885 EXPECT_EQ(results.size(), 0ul);
886 results.clear();
887
888 #if !defined(OS_IOS)
889 // Addresses with banned attributes should be ignored.
890 ip_attributes_getter.set_native_attributes(IN6_IFF_ANYCAST);
891 ASSERT_TRUE(FillIfaddrs(&interface, ifname_em1, IFF_RUNNING, ipv6_address,
892 ipv6_netmask, addresses));
893 EXPECT_TRUE(internal::GetNetworkListImpl(
894 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface,
895 &ip_attributes_getter));
896 EXPECT_EQ(results.size(), 0ul);
897 results.clear();
898
899 // Addresses with allowed attribute IFA_F_TEMPORARY should be returned and
900 // attributes should be translated correctly.
901 ip_attributes_getter.set_native_attributes(IN6_IFF_TEMPORARY);
902 ASSERT_TRUE(FillIfaddrs(&interface, ifname_em1, IFF_RUNNING, ipv6_address,
903 ipv6_netmask, addresses));
904 EXPECT_TRUE(internal::GetNetworkListImpl(
905 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface,
906 &ip_attributes_getter));
907 EXPECT_EQ(results.size(), 1ul);
908 EXPECT_EQ(results[0].name, ifname_em1);
909 EXPECT_EQ(results[0].prefix_length, 1ul);
910 EXPECT_EQ(results[0].address, ipv6_address);
911 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_TEMPORARY);
912 results.clear();
913
914 // Addresses with allowed attribute IFA_F_DEPRECATED should be returned and
915 // attributes should be translated correctly.
916 ip_attributes_getter.set_native_attributes(IN6_IFF_DEPRECATED);
917 ASSERT_TRUE(FillIfaddrs(&interface, ifname_em1, IFF_RUNNING, ipv6_address,
918 ipv6_netmask, addresses));
919 EXPECT_TRUE(internal::GetNetworkListImpl(
920 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface,
921 &ip_attributes_getter));
922 EXPECT_EQ(results.size(), 1ul);
923 EXPECT_EQ(results[0].name, ifname_em1);
924 EXPECT_EQ(results[0].prefix_length, 1ul);
925 EXPECT_EQ(results[0].address, ipv6_address);
926 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_DEPRECATED);
927 results.clear();
928 #endif // !OS_IOS
929 }
930 #elif defined(OS_WIN) // !OS_MACOSX && !OS_WIN && !OS_NACL
931
932 // Helper function to create a valid IP_ADAPTER_ADDRESSES with reasonable
933 // default value. The output is the |adapter_address|. All the rests are input
934 // to fill the |adapter_address|. |sock_addrs| are temporary storage used by
935 // |adapter_address| once the function is returned.
936 bool FillAdapterAddress(IP_ADAPTER_ADDRESSES* adapter_address,
937 const char* ifname,
938 const IPAddressNumber& ip_address,
939 const IPAddressNumber& ip_netmask,
940 sockaddr_storage sock_addrs[2]) {
941 adapter_address->AdapterName = const_cast<char*>(ifname);
942 adapter_address->FriendlyName = const_cast<PWCHAR>(L"interface");
943 adapter_address->IfType = IF_TYPE_ETHERNET_CSMACD;
944 adapter_address->OperStatus = IfOperStatusUp;
945 adapter_address->FirstUnicastAddress->DadState = IpDadStatePreferred;
946 adapter_address->FirstUnicastAddress->PrefixOrigin = IpPrefixOriginOther;
947 adapter_address->FirstUnicastAddress->SuffixOrigin = IpSuffixOriginOther;
948 adapter_address->FirstUnicastAddress->PreferredLifetime = 100;
949 adapter_address->FirstUnicastAddress->ValidLifetime = 1000;
950
951 socklen_t sock_len = sizeof(sockaddr_storage);
952
953 // Convert to sockaddr for next check.
954 if (!IPEndPoint(ip_address, 0)
955 .ToSockAddr(reinterpret_cast<sockaddr*>(&sock_addrs[0]),
956 &sock_len)) {
957 return false;
958 }
959 adapter_address->FirstUnicastAddress->Address.lpSockaddr =
960 reinterpret_cast<sockaddr*>(&sock_addrs[0]);
961 adapter_address->FirstUnicastAddress->Address.iSockaddrLength = sock_len;
962 adapter_address->FirstUnicastAddress->OnLinkPrefixLength = 1;
963
964 sock_len = sizeof(sockaddr_storage);
965 if (!IPEndPoint(ip_netmask, 0)
966 .ToSockAddr(reinterpret_cast<sockaddr*>(&sock_addrs[1]),
967 &sock_len)) {
968 return false;
969 }
970 adapter_address->FirstPrefix->Address.lpSockaddr =
971 reinterpret_cast<sockaddr*>(&sock_addrs[1]);
972 adapter_address->FirstPrefix->Address.iSockaddrLength = sock_len;
973 adapter_address->FirstPrefix->PrefixLength = 1;
974
975 DCHECK_EQ(sock_addrs[0].ss_family, sock_addrs[1].ss_family);
976 if (sock_addrs[0].ss_family == AF_INET6) {
977 adapter_address->Ipv6IfIndex = 0;
978 } else {
979 DCHECK_EQ(sock_addrs[0].ss_family, AF_INET);
980 adapter_address->IfIndex = 0;
981 }
982
983 return true;
984 }
985
986 TEST(NetUtilTest, GetNetworkListTrimming) {
987 IPAddressNumber ipv6_local_address(
988 kIPv6LocalAddr, kIPv6LocalAddr + arraysize(kIPv6LocalAddr));
989 IPAddressNumber ipv6_address(kIPv6Addr, kIPv6Addr + arraysize(kIPv6Addr));
990 IPAddressNumber ipv6_prefix(kIPv6AddrPrefix,
991 kIPv6AddrPrefix + arraysize(kIPv6AddrPrefix));
992
993 NetworkInterfaceList results;
994 sockaddr_storage addresses[2];
995 IP_ADAPTER_ADDRESSES adapter_address = {0};
996 IP_ADAPTER_UNICAST_ADDRESS address = {0};
997 IP_ADAPTER_PREFIX adapter_prefix = {0};
998 adapter_address.FirstUnicastAddress = &address;
999 adapter_address.FirstPrefix = &adapter_prefix;
1000
1001 // Address of offline links should be ignored.
1002 ASSERT_TRUE(FillAdapterAddress(
1003 &adapter_address /* adapter_address */, ifname_em1 /* ifname */,
1004 ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */,
1005 addresses /* sock_addrs */));
1006 adapter_address.OperStatus = IfOperStatusDown;
1007
1008 EXPECT_TRUE(internal::GetNetworkListImpl(
1009 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address));
1010
1011 EXPECT_EQ(results.size(), 0ul);
1012
1013 // Address on loopback interface should be trimmed out.
1014 ASSERT_TRUE(FillAdapterAddress(
1015 &adapter_address /* adapter_address */, ifname_em1 /* ifname */,
1016 ipv6_local_address /* ip_address */, ipv6_prefix /* ip_netmask */,
1017 addresses /* sock_addrs */));
1018 adapter_address.IfType = IF_TYPE_SOFTWARE_LOOPBACK;
1019
1020 EXPECT_TRUE(internal::GetNetworkListImpl(
1021 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address));
1022 EXPECT_EQ(results.size(), 0ul);
1023
1024 // vmware address should return by default.
1025 ASSERT_TRUE(FillAdapterAddress(
1026 &adapter_address /* adapter_address */, ifname_vm /* ifname */,
1027 ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */,
1028 addresses /* sock_addrs */));
1029 EXPECT_TRUE(internal::GetNetworkListImpl(
1030 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address));
1031 EXPECT_EQ(results.size(), 1ul);
1032 EXPECT_EQ(results[0].name, ifname_vm);
1033 EXPECT_EQ(results[0].prefix_length, 1ul);
1034 EXPECT_EQ(results[0].address, ipv6_address);
1035 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_NONE);
1036 results.clear();
1037
1038 // vmware address should be trimmed out if policy specified so.
1039 ASSERT_TRUE(FillAdapterAddress(
1040 &adapter_address /* adapter_address */, ifname_vm /* ifname */,
1041 ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */,
1042 addresses /* sock_addrs */));
1043 EXPECT_TRUE(internal::GetNetworkListImpl(
1044 &results, EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address));
1045 EXPECT_EQ(results.size(), 0ul);
1046 results.clear();
1047
1048 // Addresses with incompleted DAD should be ignored.
1049 ASSERT_TRUE(FillAdapterAddress(
1050 &adapter_address /* adapter_address */, ifname_em1 /* ifname */,
1051 ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */,
1052 addresses /* sock_addrs */));
1053 adapter_address.FirstUnicastAddress->DadState = IpDadStateTentative;
1054
1055 EXPECT_TRUE(internal::GetNetworkListImpl(
1056 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address));
1057 EXPECT_EQ(results.size(), 0ul);
1058 results.clear();
1059
1060 // Addresses with allowed attribute IpSuffixOriginRandom should be returned
1061 // and attributes should be translated correctly to
1062 // IP_ADDRESS_ATTRIBUTE_TEMPORARY.
1063 ASSERT_TRUE(FillAdapterAddress(
1064 &adapter_address /* adapter_address */, ifname_em1 /* ifname */,
1065 ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */,
1066 addresses /* sock_addrs */));
1067 adapter_address.FirstUnicastAddress->PrefixOrigin =
1068 IpPrefixOriginRouterAdvertisement;
1069 adapter_address.FirstUnicastAddress->SuffixOrigin = IpSuffixOriginRandom;
1070
1071 EXPECT_TRUE(internal::GetNetworkListImpl(
1072 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address));
1073 EXPECT_EQ(results.size(), 1ul);
1074 EXPECT_EQ(results[0].name, ifname_em1);
1075 EXPECT_EQ(results[0].prefix_length, 1ul);
1076 EXPECT_EQ(results[0].address, ipv6_address);
1077 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_TEMPORARY);
1078 results.clear();
1079
1080 // Addresses with preferred lifetime 0 should be returned and
1081 // attributes should be translated correctly to
1082 // IP_ADDRESS_ATTRIBUTE_DEPRECATED.
1083 ASSERT_TRUE(FillAdapterAddress(
1084 &adapter_address /* adapter_address */, ifname_em1 /* ifname */,
1085 ipv6_address /* ip_address */, ipv6_prefix /* ip_netmask */,
1086 addresses /* sock_addrs */));
1087 adapter_address.FirstUnicastAddress->PreferredLifetime = 0;
1088 adapter_address.FriendlyName = const_cast<PWCHAR>(L"FriendlyInterfaceName");
1089 EXPECT_TRUE(internal::GetNetworkListImpl(
1090 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, true, &adapter_address));
1091 EXPECT_EQ(results.size(), 1ul);
1092 EXPECT_EQ(results[0].friendly_name, "FriendlyInterfaceName");
1093 EXPECT_EQ(results[0].name, ifname_em1);
1094 EXPECT_EQ(results[0].prefix_length, 1ul);
1095 EXPECT_EQ(results[0].address, ipv6_address);
1096 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_DEPRECATED);
1097 results.clear();
1098 }
1099
1100 #endif // !OS_MACOSX && !OS_WIN && !OS_NACL
1101
1102 TEST(NetUtilTest, GetWifiSSID) {
1103 // We can't check the result of GetWifiSSID() directly, since the result
1104 // will differ across machines. Simply exercise the code path and hope that it
1105 // doesn't crash.
1106 EXPECT_NE((const char*)NULL, GetWifiSSID().c_str());
1107 }
1108
1109 #if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_CHROMEOS)
1110 TEST(NetUtilTest, GetWifiSSIDFromInterfaceList) {
1111 NetworkInterfaceList list;
1112 EXPECT_EQ(std::string(), internal::GetWifiSSIDFromInterfaceListInternal(
1113 list, TestGetInterfaceSSID));
1114
1115 NetworkInterface interface1;
1116 interface1.name = "wlan0";
1117 interface1.type = NetworkChangeNotifier::CONNECTION_WIFI;
1118 list.push_back(interface1);
1119 ASSERT_EQ(1u, list.size());
1120 EXPECT_EQ(std::string(kWiFiSSID),
1121 internal::GetWifiSSIDFromInterfaceListInternal(
1122 list, TestGetInterfaceSSID));
1123
1124 NetworkInterface interface2;
1125 interface2.name = "wlan1";
1126 interface2.type = NetworkChangeNotifier::CONNECTION_WIFI;
1127 list.push_back(interface2);
1128 ASSERT_EQ(2u, list.size());
1129 EXPECT_EQ(std::string(kWiFiSSID),
1130 internal::GetWifiSSIDFromInterfaceListInternal(
1131 list, TestGetInterfaceSSID));
1132
1133 NetworkInterface interface3;
1134 interface3.name = kInterfaceWithDifferentSSID;
1135 interface3.type = NetworkChangeNotifier::CONNECTION_WIFI;
1136 list.push_back(interface3);
1137 ASSERT_EQ(3u, list.size());
1138 EXPECT_EQ(std::string(), internal::GetWifiSSIDFromInterfaceListInternal(
1139 list, TestGetInterfaceSSID));
1140
1141 list.pop_back();
1142 NetworkInterface interface4;
1143 interface4.name = "eth0";
1144 interface4.type = NetworkChangeNotifier::CONNECTION_ETHERNET;
1145 list.push_back(interface4);
1146 ASSERT_EQ(3u, list.size());
1147 EXPECT_EQ(std::string(), internal::GetWifiSSIDFromInterfaceListInternal(
1148 list, TestGetInterfaceSSID));
1149 }
1150 #endif // OS_LINUX
1151
1152 namespace {
1153
1154 #if defined(OS_WIN)
1155 bool read_int_or_bool(DWORD data_size,
1156 PVOID data) {
1157 switch (data_size) {
1158 case 1:
1159 return !!*reinterpret_cast<uint8*>(data);
1160 case 4:
1161 return !!*reinterpret_cast<uint32*>(data);
1162 default:
1163 LOG(FATAL) << "That is not a type I know!";
1164 return false;
1165 }
1166 }
1167
1168 int GetWifiOptions() {
1169 const internal::WlanApi& wlanapi = internal::WlanApi::GetInstance();
1170 if (!wlanapi.initialized)
1171 return -1;
1172
1173 internal::WlanHandle client;
1174 DWORD cur_version = 0;
1175 const DWORD kMaxClientVersion = 2;
1176 DWORD result = wlanapi.OpenHandle(
1177 kMaxClientVersion, &cur_version, &client);
1178 if (result != ERROR_SUCCESS)
1179 return -1;
1180
1181 WLAN_INTERFACE_INFO_LIST* interface_list_ptr = NULL;
1182 result = wlanapi.enum_interfaces_func(client.Get(), NULL,
1183 &interface_list_ptr);
1184 if (result != ERROR_SUCCESS)
1185 return -1;
1186 scoped_ptr<WLAN_INTERFACE_INFO_LIST, internal::WlanApiDeleter> interface_list(
1187 interface_list_ptr);
1188
1189 for (unsigned i = 0; i < interface_list->dwNumberOfItems; ++i) {
1190 WLAN_INTERFACE_INFO* info = &interface_list->InterfaceInfo[i];
1191 DWORD data_size;
1192 PVOID data;
1193 int options = 0;
1194 result = wlanapi.query_interface_func(
1195 client.Get(),
1196 &info->InterfaceGuid,
1197 wlan_intf_opcode_background_scan_enabled,
1198 NULL,
1199 &data_size,
1200 &data,
1201 NULL);
1202 if (result != ERROR_SUCCESS)
1203 continue;
1204 if (!read_int_or_bool(data_size, data)) {
1205 options |= WIFI_OPTIONS_DISABLE_SCAN;
1206 }
1207 internal::WlanApi::GetInstance().free_memory_func(data);
1208
1209 result = wlanapi.query_interface_func(
1210 client.Get(),
1211 &info->InterfaceGuid,
1212 wlan_intf_opcode_media_streaming_mode,
1213 NULL,
1214 &data_size,
1215 &data,
1216 NULL);
1217 if (result != ERROR_SUCCESS)
1218 continue;
1219 if (read_int_or_bool(data_size, data)) {
1220 options |= WIFI_OPTIONS_MEDIA_STREAMING_MODE;
1221 }
1222 internal::WlanApi::GetInstance().free_memory_func(data);
1223
1224 // Just the the options from the first succesful
1225 // interface.
1226 return options;
1227 }
1228
1229 // No wifi interface found.
1230 return -1;
1231 }
1232
1233 #else // OS_WIN
1234
1235 int GetWifiOptions() {
1236 // Not supported.
1237 return -1;
1238 }
1239
1240 #endif // OS_WIN
1241
1242 void TryChangeWifiOptions(int options) {
1243 int previous_options = GetWifiOptions();
1244 scoped_ptr<ScopedWifiOptions> scoped_options = SetWifiOptions(options);
1245 EXPECT_EQ(previous_options | options, GetWifiOptions());
1246 scoped_options.reset();
1247 EXPECT_EQ(previous_options, GetWifiOptions());
1248 }
1249
1250 }; // namespace
1251
1252 // Test SetWifiOptions().
1253 TEST(NetUtilTest, SetWifiOptionsTest) {
1254 TryChangeWifiOptions(0);
1255 TryChangeWifiOptions(WIFI_OPTIONS_DISABLE_SCAN);
1256 TryChangeWifiOptions(WIFI_OPTIONS_MEDIA_STREAMING_MODE);
1257 TryChangeWifiOptions(WIFI_OPTIONS_DISABLE_SCAN |
1258 WIFI_OPTIONS_MEDIA_STREAMING_MODE);
1259 }
1260
1261 struct NonUniqueNameTestData { 554 struct NonUniqueNameTestData {
1262 bool is_unique; 555 bool is_unique;
1263 const char* const hostname; 556 const char* const hostname;
1264 }; 557 };
1265 558
1266 // Google Test pretty-printer. 559 // Google Test pretty-printer.
1267 void PrintTo(const NonUniqueNameTestData& data, std::ostream* os) { 560 void PrintTo(const NonUniqueNameTestData& data, std::ostream* os) {
1268 ASSERT_TRUE(data.hostname); 561 ASSERT_TRUE(data.hostname);
1269 *os << " hostname: " << testing::PrintToString(data.hostname) 562 *os << " hostname: " << testing::PrintToString(data.hostname)
1270 << "; is_unique: " << testing::PrintToString(data.is_unique); 563 << "; is_unique: " << testing::PrintToString(data.is_unique);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1331 TEST_P(NetUtilNonUniqueNameTest, IsHostnameNonUnique) { 624 TEST_P(NetUtilNonUniqueNameTest, IsHostnameNonUnique) {
1332 const NonUniqueNameTestData& test_data = GetParam(); 625 const NonUniqueNameTestData& test_data = GetParam();
1333 626
1334 EXPECT_EQ(test_data.is_unique, IsUnique(test_data.hostname)); 627 EXPECT_EQ(test_data.is_unique, IsUnique(test_data.hostname));
1335 } 628 }
1336 629
1337 INSTANTIATE_TEST_CASE_P(, NetUtilNonUniqueNameTest, 630 INSTANTIATE_TEST_CASE_P(, NetUtilNonUniqueNameTest,
1338 testing::ValuesIn(kNonUniqueNameTestData)); 631 testing::ValuesIn(kNonUniqueNameTestData));
1339 632
1340 } // namespace net 633 } // namespace net
OLDNEW
« no previous file with comments | « net/base/net_util_posix.cc ('k') | net/base/net_util_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698