blob: e13cb99214231b63320f382003bfe1cc9290241e [file] [log] [blame]
[email protected]24931102012-03-15 01:21:271// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ppapi/tests/test_host_resolver_private.h"
6
7#include "ppapi/c/private/ppb_net_address_private.h"
[email protected]0f8a16cf2012-03-21 10:08:378#include "ppapi/cpp/module_impl.h"
9#include "ppapi/cpp/private/host_resolver_private.h"
[email protected]24931102012-03-15 01:21:2710#include "ppapi/cpp/private/tcp_socket_private.h"
11#include "ppapi/cpp/var.h"
12#include "ppapi/tests/test_utils.h"
13#include "ppapi/tests/testing_instance.h"
14
15REGISTER_TEST_CASE(HostResolverPrivate);
16
17TestHostResolverPrivate::TestHostResolverPrivate(TestingInstance* instance)
18 : TestCase(instance) {
19}
20
21bool TestHostResolverPrivate::Init() {
[email protected]0f8a16cf2012-03-21 10:08:3722 bool host_resolver_private_is_available =
23 pp::HostResolverPrivate::IsAvailable();
24 if (!host_resolver_private_is_available)
25 instance_->AppendError("PPB_HostResolver_Private interface not available");
26
[email protected]24931102012-03-15 01:21:2727 bool tcp_socket_private_is_available = pp::TCPSocketPrivate::IsAvailable();
28 if (!tcp_socket_private_is_available)
29 instance_->AppendError("PPB_TCPSocket_Private interface not available");
[email protected]24931102012-03-15 01:21:2730
[email protected]0f8a16cf2012-03-21 10:08:3731 bool init_host_port =
32 GetLocalHostPort(instance_->pp_instance(), &host_, &port_);
[email protected]24931102012-03-15 01:21:2733 if (!init_host_port)
34 instance_->AppendError("Can't init host and port");
35
[email protected]0f8a16cf2012-03-21 10:08:3736 return host_resolver_private_is_available &&
[email protected]24931102012-03-15 01:21:2737 tcp_socket_private_is_available &&
38 init_host_port &&
39 CheckTestingInterface() &&
40 EnsureRunningOverHTTP();
41}
42
43void TestHostResolverPrivate::RunTests(const std::string& filter) {
[email protected]0f8a16cf2012-03-21 10:08:3744 RUN_TEST(Empty, filter);
[email protected]d1674cc42013-04-16 15:06:2645 RUN_CALLBACK_TEST(TestHostResolverPrivate, Resolve, filter);
46 RUN_CALLBACK_TEST(TestHostResolverPrivate, ResolveIPv4, filter);
[email protected]24931102012-03-15 01:21:2747}
48
49std::string TestHostResolverPrivate::SyncConnect(pp::TCPSocketPrivate* socket,
50 const std::string& host,
51 uint16_t port) {
[email protected]d1674cc42013-04-16 15:06:2652 TestCompletionCallback callback(instance_->pp_instance(), callback_type());
53 callback.WaitForResult(
54 socket->Connect(host.c_str(), port, callback.GetCallback()));
55 CHECK_CALLBACK_BEHAVIOR(callback);
56 ASSERT_EQ(PP_OK, callback.result());
[email protected]24931102012-03-15 01:21:2757 PASS();
58}
59
60std::string TestHostResolverPrivate::SyncConnect(
61 pp::TCPSocketPrivate* socket,
62 const PP_NetAddress_Private& address) {
[email protected]d1674cc42013-04-16 15:06:2663 TestCompletionCallback callback(instance_->pp_instance(), callback_type());
64 callback.WaitForResult(
65 socket->ConnectWithNetAddress(&address, callback.GetCallback()));
66 CHECK_CALLBACK_BEHAVIOR(callback);
67 ASSERT_EQ(PP_OK, callback.result());
[email protected]24931102012-03-15 01:21:2768 PASS();
69}
70
71std::string TestHostResolverPrivate::SyncRead(pp::TCPSocketPrivate* socket,
72 char* buffer,
73 int32_t num_bytes,
74 int32_t* bytes_read) {
[email protected]d1674cc42013-04-16 15:06:2675 TestCompletionCallback callback(instance_->pp_instance(), callback_type());
76 callback.WaitForResult(
77 socket->Read(buffer, num_bytes, callback.GetCallback()));
78 CHECK_CALLBACK_BEHAVIOR(callback);
79 ASSERT_EQ(num_bytes, callback.result());
80 *bytes_read = callback.result();
[email protected]24931102012-03-15 01:21:2781 PASS();
82}
83
84std::string TestHostResolverPrivate::SyncWrite(pp::TCPSocketPrivate* socket,
85 const char* buffer,
86 int32_t num_bytes,
87 int32_t* bytes_written) {
[email protected]d1674cc42013-04-16 15:06:2688 TestCompletionCallback callback(instance_->pp_instance(), callback_type());
89 callback.WaitForResult(
90 socket->Write(buffer, num_bytes, callback.GetCallback()));
91 CHECK_CALLBACK_BEHAVIOR(callback);
92 ASSERT_EQ(num_bytes, callback.result());
93 *bytes_written = callback.result();
[email protected]24931102012-03-15 01:21:2794 PASS();
95}
96
97std::string TestHostResolverPrivate::CheckHTTPResponse(
98 pp::TCPSocketPrivate* socket,
99 const std::string& request,
100 const std::string& response) {
101 int32_t rv = 0;
[email protected]0f8a16cf2012-03-21 10:08:37102 ASSERT_SUBTEST_SUCCESS(
brettw669d47b12015-02-13 21:17:38103 SyncWrite(socket, request.c_str(), static_cast<int32_t>(request.size()),
104 &rv));
[email protected]24931102012-03-15 01:21:27105 std::vector<char> response_buffer(response.size());
[email protected]0f8a16cf2012-03-21 10:08:37106 ASSERT_SUBTEST_SUCCESS(
brettw669d47b12015-02-13 21:17:38107 SyncRead(socket, &response_buffer[0],
108 static_cast<int32_t>(response.size()), &rv));
[email protected]24931102012-03-15 01:21:27109 std::string actual_response(&response_buffer[0], rv);
110 if (response != actual_response) {
111 return "CheckHTTPResponse failed, expected: " + response +
112 ", actual: " + actual_response;
113 }
114 PASS();
115}
116
117std::string TestHostResolverPrivate::SyncResolve(
[email protected]0f8a16cf2012-03-21 10:08:37118 pp::HostResolverPrivate* host_resolver,
[email protected]24931102012-03-15 01:21:27119 const std::string& host,
120 uint16_t port,
121 const PP_HostResolver_Private_Hint& hint) {
[email protected]d1674cc42013-04-16 15:06:26122 TestCompletionCallback callback(instance_->pp_instance(), callback_type());
123 callback.WaitForResult(
124 host_resolver->Resolve(host, port, hint, callback.GetCallback()));
125 CHECK_CALLBACK_BEHAVIOR(callback);
[email protected]24931102012-03-15 01:21:27126 PASS();
127}
128
[email protected]0f8a16cf2012-03-21 10:08:37129std::string TestHostResolverPrivate::TestEmpty() {
130 pp::HostResolverPrivate host_resolver(instance_);
131 ASSERT_EQ(0, host_resolver.GetSize());
[email protected]24931102012-03-15 01:21:27132 PP_NetAddress_Private address;
[email protected]0f8a16cf2012-03-21 10:08:37133 ASSERT_FALSE(host_resolver.GetNetAddress(0, &address));
134
[email protected]24931102012-03-15 01:21:27135 PASS();
136}
137
138std::string TestHostResolverPrivate::ParametrizedTestResolve(
139 const PP_HostResolver_Private_Hint &hint) {
[email protected]0f8a16cf2012-03-21 10:08:37140 pp::HostResolverPrivate host_resolver(instance_);
[email protected]24931102012-03-15 01:21:27141
[email protected]0f8a16cf2012-03-21 10:08:37142 ASSERT_SUBTEST_SUCCESS(SyncResolve(&host_resolver, host_, port_, hint));
[email protected]24931102012-03-15 01:21:27143
[email protected]0f8a16cf2012-03-21 10:08:37144 const size_t size = host_resolver.GetSize();
[email protected]24931102012-03-15 01:21:27145 ASSERT_TRUE(size >= 1);
146
147 PP_NetAddress_Private address;
148 for (size_t i = 0; i < size; ++i) {
brettw669d47b12015-02-13 21:17:38149 ASSERT_TRUE(host_resolver.GetNetAddress(
150 static_cast<uint32_t>(i), &address));
[email protected]0f8a16cf2012-03-21 10:08:37151
[email protected]24931102012-03-15 01:21:27152 pp::TCPSocketPrivate socket(instance_);
[email protected]0f8a16cf2012-03-21 10:08:37153 ASSERT_SUBTEST_SUCCESS(SyncConnect(&socket, address));
154 ASSERT_SUBTEST_SUCCESS(CheckHTTPResponse(&socket,
155 "GET / HTTP/1.0\r\n\r\n",
156 "HTTP"));
[email protected]24931102012-03-15 01:21:27157 socket.Disconnect();
158 }
159
brettw669d47b12015-02-13 21:17:38160 ASSERT_FALSE(host_resolver.GetNetAddress(
161 static_cast<uint32_t>(size), &address));
[email protected]0f8a16cf2012-03-21 10:08:37162 pp::Var canonical_name = host_resolver.GetCanonicalName();
[email protected]24931102012-03-15 01:21:27163 ASSERT_TRUE(canonical_name.is_string());
164 pp::TCPSocketPrivate socket(instance_);
[email protected]0f8a16cf2012-03-21 10:08:37165 ASSERT_SUBTEST_SUCCESS(SyncConnect(&socket,
166 canonical_name.AsString(),
167 port_));
168 ASSERT_SUBTEST_SUCCESS(CheckHTTPResponse(&socket,
169 "GET / HTTP/1.0\r\n\r\n",
170 "HTTP"));
[email protected]24931102012-03-15 01:21:27171 socket.Disconnect();
172
[email protected]24931102012-03-15 01:21:27173 PASS();
174}
175
176std::string TestHostResolverPrivate::TestResolve() {
177 PP_HostResolver_Private_Hint hint;
[email protected]ddecdae2013-06-24 23:17:46178 hint.family = PP_NETADDRESSFAMILY_PRIVATE_UNSPECIFIED;
179 hint.flags = PP_HOST_RESOLVER_PRIVATE_FLAGS_CANONNAME;
[email protected]24931102012-03-15 01:21:27180 return ParametrizedTestResolve(hint);
181}
182
183std::string TestHostResolverPrivate::TestResolveIPv4() {
184 PP_HostResolver_Private_Hint hint;
[email protected]ddecdae2013-06-24 23:17:46185 hint.family = PP_NETADDRESSFAMILY_PRIVATE_IPV4;
186 hint.flags = PP_HOST_RESOLVER_PRIVATE_FLAGS_CANONNAME;
[email protected]24931102012-03-15 01:21:27187 return ParametrizedTestResolve(hint);
188}