Index: ppapi/tests/test_udp_socket.cc |
diff --git a/ppapi/tests/test_udp_socket.cc b/ppapi/tests/test_udp_socket.cc |
index 2b0568244e30001b37e5670f41a4799e733e7af6..395abe0c5d1b5b97668c5f1a365adfd51f53de0b 100644 |
--- a/ppapi/tests/test_udp_socket.cc |
+++ b/ppapi/tests/test_udp_socket.cc |
@@ -47,7 +47,10 @@ pp::NetAddress ReplacePort(const pp::InstanceHandle& instance, |
} // namespace |
-TestUDPSocket::TestUDPSocket(TestingInstance* instance) : TestCase(instance) { |
+TestUDPSocket::TestUDPSocket(TestingInstance* instance) |
+ : TestCase(instance), |
+ socket_interface_1_0_(NULL), |
+ socket_interface_1_1_(NULL) { |
} |
bool TestUDPSocket::Init() { |
@@ -71,19 +74,36 @@ bool TestUDPSocket::Init() { |
if (!init_address) |
instance_->AppendError("Can't init address"); |
+ socket_interface_1_0_ = |
+ static_cast<const PPB_UDPSocket_1_0*>( |
+ pp::Module::Get()->GetBrowserInterface(PPB_UDPSOCKET_INTERFACE_1_0)); |
+ if (!socket_interface_1_0_) |
+ instance_->AppendError("PPB_UDPSocket_1_0 interface not available"); |
+ |
+ socket_interface_1_1_ = |
+ static_cast<const PPB_UDPSocket_1_1*>( |
+ pp::Module::Get()->GetBrowserInterface(PPB_UDPSOCKET_INTERFACE_1_1)); |
+ if (!socket_interface_1_1_) |
+ instance_->AppendError("PPB_UDPSocket_1_1 interface not available"); |
+ |
return tcp_socket_is_available && |
udp_socket_is_available && |
net_address_is_available && |
init_address && |
CheckTestingInterface() && |
- EnsureRunningOverHTTP(); |
+ EnsureRunningOverHTTP() && |
+ socket_interface_1_0_ != NULL && |
+ socket_interface_1_1_ != NULL; |
} |
void TestUDPSocket::RunTests(const std::string& filter) { |
RUN_CALLBACK_TEST(TestUDPSocket, ReadWrite, filter); |
RUN_CALLBACK_TEST(TestUDPSocket, Broadcast, filter); |
+ RUN_CALLBACK_TEST(TestUDPSocket, SetOption_1_0, filter); |
+ RUN_CALLBACK_TEST(TestUDPSocket, SetOption_1_1, filter); |
RUN_CALLBACK_TEST(TestUDPSocket, SetOption, filter); |
RUN_CALLBACK_TEST(TestUDPSocket, ParallelSend, filter); |
+ RUN_CALLBACK_TEST(TestUDPSocket, Multicast, filter); |
} |
std::string TestUDPSocket::GetLocalAddress(pp::NetAddress* address) { |
@@ -186,6 +206,23 @@ std::string TestUDPSocket::PassMessage(pp::UDPSocket* target, |
PASS(); |
} |
+std::string TestUDPSocket::SetMulticastOptions(pp::UDPSocket* socket) { |
+ TestCompletionCallback callback_1(instance_->pp_instance(), callback_type()); |
+ callback_1.WaitForResult(socket->SetOption( |
+ PP_UDPSOCKET_OPTION_MULTICAST_LOOP, pp::Var(true), |
+ callback_1.GetCallback())); |
+ CHECK_CALLBACK_BEHAVIOR(callback_1); |
+ ASSERT_EQ(PP_OK, callback_1.result()); |
+ |
+ TestCompletionCallback callback_2(instance_->pp_instance(), callback_type()); |
+ callback_2.WaitForResult(socket->SetOption( |
+ PP_UDPSOCKET_OPTION_MULTICAST_TTL, pp::Var(1), callback_2.GetCallback())); |
+ CHECK_CALLBACK_BEHAVIOR(callback_2); |
+ ASSERT_EQ(PP_OK, callback_2.result()); |
+ |
+ PASS(); |
+} |
+ |
std::string TestUDPSocket::TestReadWrite() { |
pp::UDPSocket server_socket(instance_), client_socket(instance_); |
pp::NetAddress server_address, client_address; |
@@ -256,10 +293,43 @@ std::string TestUDPSocket::TestBroadcast() { |
PASS(); |
} |
+std::string TestUDPSocket::TestSetOption_1_0() { |
+ PP_Resource socket = socket_interface_1_0_->Create(instance_->pp_instance()); |
+ ASSERT_NE(0, socket); |
+ |
+ // Multicast options are not supported in interface 1.0. |
+ struct PP_Var value = PP_MakeBool(true); |
bbudge
2015/02/19 21:27:04
Could we create a SetOption utility function to do
etrunko
2015/02/23 22:09:10
Done.
|
+ TestCompletionCallback cb(instance_->pp_instance(), callback_type()); |
+ cb.WaitForResult(socket_interface_1_0_->SetOption(socket, |
+ PP_UDPSOCKET_OPTION_MULTICAST_LOOP, value, |
+ cb.GetCallback().pp_completion_callback())); |
+ CHECK_CALLBACK_BEHAVIOR(cb); |
+ ASSERT_EQ(PP_ERROR_BADARGUMENT, cb.result()); |
+ |
+ PASS(); |
bbudge
2015/02/19 21:27:05
If you create a resource (in this case 'socket') y
etrunko
2015/02/23 22:09:10
Done.
|
+} |
+ |
+std::string TestUDPSocket::TestSetOption_1_1() { |
+ PP_Resource socket = socket_interface_1_1_->Create(instance_->pp_instance()); |
+ ASSERT_NE(0, socket); |
+ |
+ // Multicast options are not supported in interface 1.1. |
+ struct PP_Var value = PP_MakeBool(true); |
+ TestCompletionCallback cb(instance_->pp_instance(), callback_type()); |
+ cb.WaitForResult(socket_interface_1_1_->SetOption(socket, |
+ PP_UDPSOCKET_OPTION_MULTICAST_LOOP, value, |
+ cb.GetCallback().pp_completion_callback())); |
+ CHECK_CALLBACK_BEHAVIOR(cb); |
+ ASSERT_EQ(PP_ERROR_BADARGUMENT, cb.result()); |
+ |
+ PASS(); |
bbudge
2015/02/19 21:27:05
release 'socket'
etrunko
2015/02/23 22:09:10
Done.
|
+} |
+ |
std::string TestUDPSocket::TestSetOption() { |
pp::UDPSocket socket(instance_); |
ASSERT_SUBTEST_SUCCESS(SetBroadcastOptions(&socket)); |
+ ASSERT_SUBTEST_SUCCESS(SetMulticastOptions(&socket)); |
// Try to pass incorrect option value's type. |
TestCompletionCallback callback(instance_->pp_instance(), callback_type()); |
@@ -268,6 +338,17 @@ std::string TestUDPSocket::TestSetOption() { |
CHECK_CALLBACK_BEHAVIOR(callback); |
ASSERT_EQ(PP_ERROR_BADARGUMENT, callback.result()); |
+ // Invalid multicast TTL values (less than 0 and greater than 255). |
+ callback.WaitForResult(socket->SetOption( |
+ PP_UDPSOCKET_OPTION_MULTICAST_TTL, pp::Var(-1), callback.GetCallback())); |
+ CHECK_CALLBACK_BEHAVIOR(callback); |
+ ASSERT_EQ(PP_ERROR_BADARGUMENT, callback.result()); |
+ |
+ callback.WaitForResult(socket->SetOption( |
+ PP_UDPSOCKET_OPTION_MULTICAST_TTL, pp::Var(256), callback.GetCallback())); |
+ CHECK_CALLBACK_BEHAVIOR(callback); |
+ ASSERT_EQ(PP_ERROR_BADARGUMENT, callback.result()); |
+ |
callback.WaitForResult(socket.SetOption( |
PP_UDPSOCKET_OPTION_BROADCAST, pp::Var(false), callback.GetCallback())); |
CHECK_CALLBACK_BEHAVIOR(callback); |
@@ -383,6 +464,12 @@ std::string TestUDPSocket::TestParallelSend() { |
server_socket.Close(); |
client_socket.Close(); |
+} |
+ |
+std::string TestUDPSocket::TestMulticast() { |
+ pp::UDPSocket server1(instance_), server2(instance_); |
+ ASSERT_SUBTEST_SUCCESS(SetMulticastOptions(&server1)); |
+ ASSERT_SUBTEST_SUCCESS(SetMulticastOptions(&server2)); |
PASS(); |
} |