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