Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1393)

Unified Diff: ppapi/tests/test_host_resolver_private.cc

Issue 9455092: HostResolver is exposed to plugin. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Sync. Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
+}

Powered by Google App Engine
This is Rietveld 408576698