15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/test_host_resolver_private.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_net_address_private.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module_impl.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/private/host_resolver_private.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/private/tcp_socket_private.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/var.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/test_utils.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/testing_instance.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)REGISTER_TEST_CASE(HostResolverPrivate); 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestHostResolverPrivate::TestHostResolverPrivate(TestingInstance* instance) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : TestCase(instance) { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestHostResolverPrivate::Init() { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool host_resolver_private_is_available = 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::HostResolverPrivate::IsAvailable(); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!host_resolver_private_is_available) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_->AppendError("PPB_HostResolver_Private interface not available"); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool tcp_socket_private_is_available = pp::TCPSocketPrivate::IsAvailable(); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!tcp_socket_private_is_available) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_->AppendError("PPB_TCPSocket_Private interface not available"); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool init_host_port = 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLocalHostPort(instance_->pp_instance(), &host_, &port_); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!init_host_port) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_->AppendError("Can't init host and port"); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return host_resolver_private_is_available && 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tcp_socket_private_is_available && 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) init_host_port && 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckTestingInterface() && 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnsureRunningOverHTTP(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHostResolverPrivate::RunTests(const std::string& filter) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(Empty, filter); 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RUN_CALLBACK_TEST(TestHostResolverPrivate, Resolve, filter); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RUN_CALLBACK_TEST(TestHostResolverPrivate, ResolveIPv4, filter); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestHostResolverPrivate::SyncConnect(pp::TCPSocketPrivate* socket, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& host, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t port) { 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestCompletionCallback callback(instance_->pp_instance(), callback_type()); 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback.WaitForResult( 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) socket->Connect(host.c_str(), port, callback.GetCallback())); 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CHECK_CALLBACK_BEHAVIOR(callback); 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(PP_OK, callback.result()); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestHostResolverPrivate::SyncConnect( 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::TCPSocketPrivate* socket, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_NetAddress_Private& address) { 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestCompletionCallback callback(instance_->pp_instance(), callback_type()); 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback.WaitForResult( 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) socket->ConnectWithNetAddress(&address, callback.GetCallback())); 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CHECK_CALLBACK_BEHAVIOR(callback); 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(PP_OK, callback.result()); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestHostResolverPrivate::SyncRead(pp::TCPSocketPrivate* socket, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* buffer, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t num_bytes, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t* bytes_read) { 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestCompletionCallback callback(instance_->pp_instance(), callback_type()); 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback.WaitForResult( 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) socket->Read(buffer, num_bytes, callback.GetCallback())); 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CHECK_CALLBACK_BEHAVIOR(callback); 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(num_bytes, callback.result()); 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *bytes_read = callback.result(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestHostResolverPrivate::SyncWrite(pp::TCPSocketPrivate* socket, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* buffer, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t num_bytes, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t* bytes_written) { 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestCompletionCallback callback(instance_->pp_instance(), callback_type()); 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback.WaitForResult( 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) socket->Write(buffer, num_bytes, callback.GetCallback())); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CHECK_CALLBACK_BEHAVIOR(callback); 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(num_bytes, callback.result()); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *bytes_written = callback.result(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestHostResolverPrivate::CheckHTTPResponse( 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::TCPSocketPrivate* socket, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& request, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& response) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t rv = 0; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_SUBTEST_SUCCESS( 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncWrite(socket, request.c_str(), request.size(), &rv)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<char> response_buffer(response.size()); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_SUBTEST_SUCCESS( 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncRead(socket, &response_buffer[0], response.size(), &rv)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string actual_response(&response_buffer[0], rv); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (response != actual_response) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "CheckHTTPResponse failed, expected: " + response + 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ", actual: " + actual_response; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestHostResolverPrivate::SyncResolve( 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::HostResolverPrivate* host_resolver, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& host, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16_t port, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_HostResolver_Private_Hint& hint) { 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestCompletionCallback callback(instance_->pp_instance(), callback_type()); 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback.WaitForResult( 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_resolver->Resolve(host, port, hint, callback.GetCallback())); 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CHECK_CALLBACK_BEHAVIOR(callback); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestHostResolverPrivate::TestEmpty() { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::HostResolverPrivate host_resolver(instance_); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, host_resolver.GetSize()); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private address; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(host_resolver.GetNetAddress(0, &address)); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestHostResolverPrivate::ParametrizedTestResolve( 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_HostResolver_Private_Hint &hint) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::HostResolverPrivate host_resolver(instance_); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_SUBTEST_SUCCESS(SyncResolve(&host_resolver, host_, port_, hint)); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t size = host_resolver.GetSize(); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(size >= 1); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_NetAddress_Private address; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < size; ++i) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(host_resolver.GetNetAddress(i, &address)); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::TCPSocketPrivate socket(instance_); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_SUBTEST_SUCCESS(SyncConnect(&socket, address)); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_SUBTEST_SUCCESS(CheckHTTPResponse(&socket, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GET / HTTP/1.0\r\n\r\n", 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "HTTP")); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket.Disconnect(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(host_resolver.GetNetAddress(size, &address)); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Var canonical_name = host_resolver.GetCanonicalName(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(canonical_name.is_string()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::TCPSocketPrivate socket(instance_); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_SUBTEST_SUCCESS(SyncConnect(&socket, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canonical_name.AsString(), 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) port_)); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_SUBTEST_SUCCESS(CheckHTTPResponse(&socket, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GET / HTTP/1.0\r\n\r\n", 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "HTTP")); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket.Disconnect(); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestHostResolverPrivate::TestResolve() { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_HostResolver_Private_Hint hint; 174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch hint.family = PP_NETADDRESSFAMILY_PRIVATE_UNSPECIFIED; 175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch hint.flags = PP_HOST_RESOLVER_PRIVATE_FLAGS_CANONNAME; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ParametrizedTestResolve(hint); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestHostResolverPrivate::TestResolveIPv4() { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_HostResolver_Private_Hint hint; 181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch hint.family = PP_NETADDRESSFAMILY_PRIVATE_IPV4; 182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch hint.flags = PP_HOST_RESOLVER_PRIVATE_FLAGS_CANONNAME; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ParametrizedTestResolve(hint); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 185