| Index: net/udp/udp_socket_unittest.cc
|
| diff --git a/net/udp/udp_socket_unittest.cc b/net/udp/udp_socket_unittest.cc
|
| index cb4a495c70386703a4ec6b6e69dd7ab59dad0a31..1f34ff6bba38663caa964b885d1e4ffbe55dfd91 100644
|
| --- a/net/udp/udp_socket_unittest.cc
|
| +++ b/net/udp/udp_socket_unittest.cc
|
| @@ -29,6 +29,10 @@
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "testing/platform_test.h"
|
|
|
| +#if defined(OS_ANDROID)
|
| +#include "base/android/build_info.h"
|
| +#endif
|
| +
|
| #if defined(OS_IOS)
|
| #include <TargetConditionals.h>
|
| #endif
|
| @@ -687,6 +691,53 @@ TEST_F(UDPSocketTest, SetDSCP) {
|
| client.Close();
|
| }
|
|
|
| +TEST_F(UDPSocketTest, TestBindToNetwork) {
|
| + UDPSocket socket(DatagramSocket::RANDOM_BIND, base::Bind(&PrivilegedRand),
|
| + NULL, NetLog::Source());
|
| + ASSERT_EQ(OK, socket.Open(ADDRESS_FAMILY_IPV4));
|
| + // Test unsuccessful binding, by attempting to bind to a bogus NetworkHandle.
|
| + int rv = socket.BindToNetwork(65536);
|
| +#if !defined(OS_ANDROID)
|
| + EXPECT_EQ(ERR_NOT_IMPLEMENTED, rv);
|
| +#else
|
| + if (base::android::BuildInfo::GetInstance()->sdk_int() <
|
| + base::android::SDK_VERSION_LOLLIPOP) {
|
| + EXPECT_EQ(ERR_NOT_IMPLEMENTED, rv);
|
| + } else if (base::android::BuildInfo::GetInstance()->sdk_int() >=
|
| + base::android::SDK_VERSION_LOLLIPOP &&
|
| + base::android::BuildInfo::GetInstance()->sdk_int() <
|
| + base::android::SDK_VERSION_MARSHMALLOW) {
|
| + // On Lollipop, we assume if the user has a NetworkHandle that they must
|
| + // have gotten it from a legitimate source, so if binding to the network
|
| + // fails it's assumed to be because the network went away so
|
| + // ERR_NETWORK_CHANGED is returned. In this test the network never existed
|
| + // anyhow. ConnectivityService.MAX_NET_ID is 65535, so 65536 won't be used.
|
| + EXPECT_EQ(ERR_NETWORK_CHANGED, rv);
|
| + } else if (base::android::BuildInfo::GetInstance()->sdk_int() >=
|
| + base::android::SDK_VERSION_MARSHMALLOW) {
|
| + // On Marshmallow and newer releases, the NetworkHandle is munged by
|
| + // Network.getNetworkHandle() and 65536 isn't munged so it's rejected.
|
| + EXPECT_EQ(ERR_INVALID_ARGUMENT, rv);
|
| + }
|
| +
|
| + if (base::android::BuildInfo::GetInstance()->sdk_int() >=
|
| + base::android::SDK_VERSION_LOLLIPOP) {
|
| + EXPECT_EQ(
|
| + ERR_INVALID_ARGUMENT,
|
| + socket.BindToNetwork(NetworkChangeNotifier::kInvalidNetworkHandle));
|
| +
|
| + // Test successful binding, if possible.
|
| + if (NetworkChangeNotifier::AreNetworkHandlesSupported()) {
|
| + NetworkChangeNotifier::NetworkHandle network_handle =
|
| + NetworkChangeNotifier::GetDefaultNetwork();
|
| + if (network_handle != NetworkChangeNotifier::kInvalidNetworkHandle) {
|
| + EXPECT_EQ(OK, socket.BindToNetwork(network_handle));
|
| + }
|
| + }
|
| + }
|
| +#endif
|
| +}
|
| +
|
| } // namespace
|
|
|
| #if defined(OS_WIN)
|
|
|