| Index: ppapi/tests/test_host_resolver_private.cc
|
| diff --git a/ppapi/tests/test_host_resolver_private.cc b/ppapi/tests/test_host_resolver_private.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..efba09e695815e2a33663ba30a5dba6b06e2ba08
|
| --- /dev/null
|
| +++ b/ppapi/tests/test_host_resolver_private.cc
|
| @@ -0,0 +1,238 @@
|
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "ppapi/tests/test_host_resolver_private.h"
|
| +
|
| +#include "ppapi/c/private/ppb_net_address_private.h"
|
| +#include "ppapi/cpp/module.h"
|
| +#include "ppapi/cpp/pass_ref.h"
|
| +#include "ppapi/cpp/private/tcp_socket_private.h"
|
| +#include "ppapi/cpp/var.h"
|
| +#include "ppapi/tests/test_utils.h"
|
| +#include "ppapi/tests/testing_instance.h"
|
| +
|
| +REGISTER_TEST_CASE(HostResolverPrivate);
|
| +
|
| +TestHostResolverPrivate::TestHostResolverPrivate(TestingInstance* instance)
|
| + : TestCase(instance) {
|
| +}
|
| +
|
| +bool TestHostResolverPrivate::Init() {
|
| + core_interface_ = static_cast<const PPB_Core*>(
|
| + pp::Module::Get()->GetBrowserInterface(PPB_CORE_INTERFACE));
|
| + if (!core_interface_)
|
| + instance_->AppendError("PPB_Core interface not available");
|
| + host_resolver_private_interface_ =
|
| + static_cast<const PPB_HostResolver_Private*>(
|
| + pp::Module::Get()->GetBrowserInterface(
|
| + PPB_HOSTRESOLVER_PRIVATE_INTERFACE));
|
| + bool tcp_socket_private_is_available = pp::TCPSocketPrivate::IsAvailable();
|
| + if (!tcp_socket_private_is_available)
|
| + instance_->AppendError("PPB_TCPSocket_Private interface not available");
|
| + if (!host_resolver_private_interface_)
|
| + instance_->AppendError("PPB_HostResolver_Private interface not available");
|
| +
|
| + bool init_host_port = GetLocalHostPort(
|
| + instance_->pp_instance(), &host_, &port_);
|
| + if (!init_host_port)
|
| + instance_->AppendError("Can't init host and port");
|
| +
|
| + return core_interface_ &&
|
| + host_resolver_private_interface_ &&
|
| + tcp_socket_private_is_available &&
|
| + init_host_port &&
|
| + CheckTestingInterface() &&
|
| + EnsureRunningOverHTTP();
|
| +}
|
| +
|
| +void TestHostResolverPrivate::RunTests(const std::string& filter) {
|
| + RUN_TEST(Create, filter);
|
| + RUN_TEST_FORCEASYNC_AND_NOT(Resolve, filter);
|
| + RUN_TEST_FORCEASYNC_AND_NOT(ResolveIPv4, filter);
|
| +}
|
| +
|
| +std::string TestHostResolverPrivate::SyncConnect(pp::TCPSocketPrivate* socket,
|
| + const std::string& host,
|
| + uint16_t port) {
|
| + TestCompletionCallback callback(instance_->pp_instance(), force_async_);
|
| + int32_t rv = socket->Connect(host.c_str(), port, callback);
|
| + if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
|
| + return ReportError("PPB_TCPSocket_Private::Connect force_async", rv);
|
| + if (rv == PP_OK_COMPLETIONPENDING)
|
| + rv = callback.WaitForResult();
|
| + ASSERT_EQ(PP_OK, rv);
|
| + PASS();
|
| +}
|
| +
|
| +std::string TestHostResolverPrivate::SyncConnect(
|
| + pp::TCPSocketPrivate* socket,
|
| + const PP_NetAddress_Private& address) {
|
| + TestCompletionCallback callback(instance_->pp_instance(), force_async_);
|
| + int32_t rv = socket->ConnectWithNetAddress(&address, callback);
|
| + if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
|
| + return ReportError("PPB_TCPSocket_Private::Connect force_async", rv);
|
| + if (rv == PP_OK_COMPLETIONPENDING)
|
| + rv = callback.WaitForResult();
|
| + ASSERT_EQ(PP_OK, rv);
|
| + PASS();
|
| +}
|
| +
|
| +std::string TestHostResolverPrivate::SyncRead(pp::TCPSocketPrivate* socket,
|
| + char* buffer,
|
| + int32_t num_bytes,
|
| + int32_t* bytes_read) {
|
| + TestCompletionCallback callback(instance_->pp_instance(), force_async_);
|
| + int32_t rv = socket->Read(buffer, num_bytes, callback);
|
| + if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
|
| + return ReportError("PPB_TCPSocket_Private::Read force_async", rv);
|
| + if (rv == PP_OK_COMPLETIONPENDING)
|
| + rv = callback.WaitForResult();
|
| + if (num_bytes != rv)
|
| + return ReportError("PPB_TCPSocket_Private::Read", rv);
|
| + *bytes_read = rv;
|
| + PASS();
|
| +}
|
| +
|
| +std::string TestHostResolverPrivate::SyncWrite(pp::TCPSocketPrivate* socket,
|
| + const char* buffer,
|
| + int32_t num_bytes,
|
| + int32_t* bytes_written) {
|
| + TestCompletionCallback callback(instance_->pp_instance(), force_async_);
|
| + int32_t rv = socket->Write(buffer, num_bytes, callback);
|
| + if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
|
| + return ReportError("PPB_TCPSocket_Private::Write force_async", rv);
|
| + if (rv == PP_OK_COMPLETIONPENDING)
|
| + rv = callback.WaitForResult();
|
| + if (num_bytes != rv)
|
| + return ReportError("PPB_TCPSocket_Private::Write", rv);
|
| + *bytes_written = rv;
|
| + PASS();
|
| +}
|
| +
|
| +std::string TestHostResolverPrivate::CheckHTTPResponse(
|
| + pp::TCPSocketPrivate* socket,
|
| + const std::string& request,
|
| + const std::string& response) {
|
| + int32_t rv = 0;
|
| + std::string error_message;
|
| +
|
| + error_message = SyncWrite(socket, request.c_str(), request.size(), &rv);
|
| + if (!error_message.empty())
|
| + return error_message;
|
| +
|
| + std::vector<char> response_buffer(response.size());
|
| + error_message = SyncRead(socket, &response_buffer[0], response.size(), &rv);
|
| + if (!error_message.empty())
|
| + return error_message;
|
| + std::string actual_response(&response_buffer[0], rv);
|
| + if (response != actual_response) {
|
| + return "CheckHTTPResponse failed, expected: " + response +
|
| + ", actual: " + actual_response;
|
| + }
|
| + PASS();
|
| +}
|
| +
|
| +std::string TestHostResolverPrivate::SyncResolve(
|
| + PP_Resource host_resolver,
|
| + const std::string& host,
|
| + uint16_t port,
|
| + const PP_HostResolver_Private_Hint& hint) {
|
| + TestCompletionCallback callback(instance_->pp_instance(), force_async_);
|
| + int32_t rv = host_resolver_private_interface_->Resolve(
|
| + host_resolver,
|
| + host.c_str(),
|
| + port,
|
| + &hint,
|
| + static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
|
| + if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
|
| + return ReportError("PPB_HostResolver_Private::Resolve force_async", rv);
|
| + if (rv == PP_OK_COMPLETIONPENDING)
|
| + rv = callback.WaitForResult();
|
| + if (rv != PP_OK)
|
| + return ReportError("PPB_HostResolver_Private::Resolve", rv);
|
| + PASS();
|
| +}
|
| +
|
| +std::string TestHostResolverPrivate::TestCreate() {
|
| + PP_Resource host_resolver = host_resolver_private_interface_->Create(0);
|
| + ASSERT_EQ(0, host_resolver);
|
| +
|
| + host_resolver =
|
| + host_resolver_private_interface_->Create(instance_->pp_instance());
|
| + ASSERT_NE(0, host_resolver);
|
| + ASSERT_TRUE(host_resolver_private_interface_->IsHostResolver(host_resolver));
|
| + ASSERT_EQ(0, host_resolver_private_interface_->GetSize(host_resolver));
|
| +
|
| + PP_NetAddress_Private address;
|
| + ASSERT_FALSE(host_resolver_private_interface_->GetNetAddress(host_resolver,
|
| + 0,
|
| + &address));
|
| + core_interface_->ReleaseResource(host_resolver);
|
| + PASS();
|
| +}
|
| +
|
| +std::string TestHostResolverPrivate::ParametrizedTestResolve(
|
| + const PP_HostResolver_Private_Hint &hint) {
|
| + PP_Resource host_resolver =
|
| + host_resolver_private_interface_->Create(instance_->pp_instance());
|
| + ASSERT_NE(0, host_resolver);
|
| + ASSERT_TRUE(host_resolver_private_interface_->IsHostResolver(host_resolver));
|
| +
|
| + std::string error_message = SyncResolve(host_resolver, host_, port_, hint);
|
| + if (!error_message.empty())
|
| + return error_message;
|
| +
|
| + const size_t size = host_resolver_private_interface_->GetSize(host_resolver);
|
| + ASSERT_TRUE(size >= 1);
|
| +
|
| + PP_NetAddress_Private address;
|
| + for (size_t i = 0; i < size; ++i) {
|
| + ASSERT_TRUE(host_resolver_private_interface_->GetNetAddress(host_resolver,
|
| + i,
|
| + &address));
|
| + pp::TCPSocketPrivate socket(instance_);
|
| + error_message = SyncConnect(&socket, address);
|
| + error_message =
|
| + CheckHTTPResponse(&socket, "GET / HTTP/1.0\r\n\r\n", "HTTP/1.0");
|
| + if (!error_message.empty())
|
| + return error_message;
|
| + socket.Disconnect();
|
| + }
|
| +
|
| + ASSERT_FALSE(host_resolver_private_interface_->GetNetAddress(host_resolver,
|
| + size,
|
| + &address));
|
| + PP_Var pp_var =
|
| + host_resolver_private_interface_->GetCanonicalName(host_resolver);
|
| + pp::Var canonical_name(pp::PassRef(), pp_var);
|
| + ASSERT_TRUE(canonical_name.is_string());
|
| + pp::TCPSocketPrivate socket(instance_);
|
| + error_message = SyncConnect(&socket,
|
| + canonical_name.AsString().c_str(),
|
| + port_);
|
| + if (!error_message.empty())
|
| + return error_message;
|
| + error_message = CheckHTTPResponse(&socket,
|
| + "GET / HTTP/1.0\r\n\r\n", "HTTP");
|
| + if (!error_message.empty())
|
| + return error_message;
|
| + socket.Disconnect();
|
| +
|
| + core_interface_->ReleaseResource(host_resolver);
|
| + PASS();
|
| +}
|
| +
|
| +std::string TestHostResolverPrivate::TestResolve() {
|
| + PP_HostResolver_Private_Hint hint;
|
| + hint.family = PP_NETADDRESSFAMILY_UNSPECIFIED;
|
| + hint.flags = PP_HOST_RESOLVER_FLAGS_CANONNAME;
|
| + return ParametrizedTestResolve(hint);
|
| +}
|
| +
|
| +std::string TestHostResolverPrivate::TestResolveIPv4() {
|
| + PP_HostResolver_Private_Hint hint;
|
| + hint.family = PP_NETADDRESSFAMILY_IPV4;
|
| + hint.flags = PP_HOST_RESOLVER_FLAGS_CANONNAME;
|
| + return ParametrizedTestResolve(hint);
|
| +}
|
|
|