17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file. 47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/tests/test_host_resolver.h" 67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/cpp/host_resolver.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/cpp/net_address.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/cpp/tcp_socket.h" 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/cpp/var.h" 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/tests/test_utils.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/tests/testing_instance.h" 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)REGISTER_TEST_CASE(HostResolver); 157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TestHostResolver::TestHostResolver(TestingInstance* instance) 177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) : TestCase(instance) { 187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool TestHostResolver::Init() { 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool host_resolver_is_available = pp::HostResolver::IsAvailable(); 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!host_resolver_is_available) 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) instance_->AppendError("PPB_HostResolver interface not available"); 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool tcp_socket_is_available = pp::TCPSocket::IsAvailable(); 267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!tcp_socket_is_available) 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) instance_->AppendError("PPB_TCPSocket interface not available"); 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool init_host_port = 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetLocalHostPort(instance_->pp_instance(), &host_, &port_); 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!init_host_port) 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) instance_->AppendError("Can't init host and port"); 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return host_resolver_is_available && 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) tcp_socket_is_available && 367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) init_host_port && 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CheckTestingInterface() && 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EnsureRunningOverHTTP(); 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void TestHostResolver::RunTests(const std::string& filter) { 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RUN_TEST(Empty, filter); 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RUN_CALLBACK_TEST(TestHostResolver, Resolve, filter); 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) RUN_CALLBACK_TEST(TestHostResolver, ResolveIPv4, filter); 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)std::string TestHostResolver::SyncConnect( 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pp::TCPSocket* socket, 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const pp::NetAddress& address) { 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TestCompletionCallback callback(instance_->pp_instance(), callback_type()); 517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) callback.WaitForResult(socket->Connect(address, callback.GetCallback())); 527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CHECK_CALLBACK_BEHAVIOR(callback); 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_EQ(PP_OK, callback.result()); 547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PASS(); 557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::string TestHostResolver::SyncRead(pp::TCPSocket* socket, 587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) char* buffer, 597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int32_t num_bytes, 607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int32_t* bytes_read) { 617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TestCompletionCallback callback(instance_->pp_instance(), callback_type()); 627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) callback.WaitForResult( 637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) socket->Read(buffer, num_bytes, callback.GetCallback())); 647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CHECK_CALLBACK_BEHAVIOR(callback); 657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_EQ(num_bytes, callback.result()); 667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *bytes_read = callback.result(); 677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PASS(); 687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::string TestHostResolver::SyncWrite(pp::TCPSocket* socket, 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const char* buffer, 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int32_t num_bytes, 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int32_t* bytes_written) { 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TestCompletionCallback callback(instance_->pp_instance(), callback_type()); 757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) callback.WaitForResult( 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) socket->Write(buffer, num_bytes, callback.GetCallback())); 777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CHECK_CALLBACK_BEHAVIOR(callback); 787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_EQ(num_bytes, callback.result()); 797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *bytes_written = callback.result(); 807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PASS(); 817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::string TestHostResolver::CheckHTTPResponse(pp::TCPSocket* socket, 847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::string& request, 857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::string& response) { 867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int32_t rv = 0; 877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_SUBTEST_SUCCESS( 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SyncWrite(socket, request.c_str(), request.size(), &rv)); 897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::vector<char> response_buffer(response.size()); 907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_SUBTEST_SUCCESS( 917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SyncRead(socket, &response_buffer[0], response.size(), &rv)); 927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string actual_response(&response_buffer[0], rv); 937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (response != actual_response) { 947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return "CheckHTTPResponse failed, expected: " + response + 957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ", actual: " + actual_response; 967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PASS(); 987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)std::string TestHostResolver::SyncResolve( 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pp::HostResolver* host_resolver, 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::string& host, 1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) uint16_t port, 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const PP_HostResolver_Hint& hint) { 1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TestCompletionCallback callback(instance_->pp_instance(), callback_type()); 1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) callback.WaitForResult( 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) host_resolver->Resolve(host.c_str(), port, hint, callback.GetCallback())); 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CHECK_CALLBACK_BEHAVIOR(callback); 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_EQ(PP_OK, callback.result()); 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PASS(); 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)std::string TestHostResolver::ParameterizedTestResolve( 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const PP_HostResolver_Hint& hint) { 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pp::HostResolver host_resolver(instance_); 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_SUBTEST_SUCCESS(SyncResolve(&host_resolver, host_, port_, hint)); 1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size_t size = host_resolver.GetNetAddressCount(); 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_TRUE(size >= 1); 1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pp::NetAddress address; 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (size_t i = 0; i < size; ++i) { 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) address = host_resolver.GetNetAddress(i); 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_NE(0, address.pp_resource()); 1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pp::TCPSocket socket(instance_); 1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_SUBTEST_SUCCESS(SyncConnect(&socket, address)); 1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_SUBTEST_SUCCESS(CheckHTTPResponse(&socket, 1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "GET / HTTP/1.0\r\n\r\n", 1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "HTTP")); 1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) socket.Close(); 1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) address = host_resolver.GetNetAddress(size); 1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_EQ(0, address.pp_resource()); 1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) pp::Var canonical_name = host_resolver.GetCanonicalName(); 1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_TRUE(canonical_name.is_string()); 1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_SUBTEST_SUCCESS(SyncResolve(&host_resolver, canonical_name.AsString(), 1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) port_, hint)); 1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) size = host_resolver.GetNetAddressCount(); 1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_TRUE(size >= 1); 1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PASS(); 1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)std::string TestHostResolver::TestEmpty() { 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pp::HostResolver host_resolver(instance_); 1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_EQ(0, host_resolver.GetNetAddressCount()); 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pp::NetAddress address = host_resolver.GetNetAddress(0); 1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_EQ(0, address.pp_resource()); 1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PASS(); 1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)std::string TestHostResolver::TestResolve() { 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PP_HostResolver_Hint hint; 1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) hint.family = PP_NETADDRESS_FAMILY_UNSPECIFIED; 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch hint.flags = PP_HOSTRESOLVER_FLAG_CANONNAME; 1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return ParameterizedTestResolve(hint); 1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)std::string TestHostResolver::TestResolveIPv4() { 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PP_HostResolver_Hint hint; 1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) hint.family = PP_NETADDRESS_FAMILY_IPV4; 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch hint.flags = PP_HOSTRESOLVER_FLAG_CANONNAME; 1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return ParameterizedTestResolve(hint); 1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 170