blob: 16cfd22dca82f59b628682104bd72c1cf77e063f [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
avie029c4132015-12-23 06:45:227#include <stddef.h>
8
[email protected]24931102012-03-15 01:21:279#include "ppapi/c/private/ppb_net_address_private.h"
[email protected]0f8a16cf2012-03-21 10:08:3710#include "ppapi/cpp/module_impl.h"
11#include "ppapi/cpp/private/host_resolver_private.h"
[email protected]24931102012-03-15 01:21:2712#include "ppapi/cpp/private/tcp_socket_private.h"
13#include "ppapi/cpp/var.h"
14#include "ppapi/tests/test_utils.h"
15#include "ppapi/tests/testing_instance.h"
16
17REGISTER_TEST_CASE(HostResolverPrivate);
18
19TestHostResolverPrivate::TestHostResolverPrivate(TestingInstance* instance)
20 : TestCase(instance) {
21}
22
23bool TestHostResolverPrivate::Init() {
[email protected]0f8a16cf2012-03-21 10:08:3724 bool host_resolver_private_is_available =
25 pp::HostResolverPrivate::IsAvailable();
26 if (!host_resolver_private_is_available)
27 instance_->AppendError("PPB_HostResolver_Private interface not available");
28
[email protected]24931102012-03-15 01:21:2729 bool tcp_socket_private_is_available = pp::TCPSocketPrivate::IsAvailable();
30 if (!tcp_socket_private_is_available)
31 instance_->AppendError("PPB_TCPSocket_Private interface not available");
[email protected]24931102012-03-15 01:21:2732
[email protected]0f8a16cf2012-03-21 10:08:3733 bool init_host_port =
34 GetLocalHostPort(instance_->pp_instance(), &host_, &port_);
[email protected]24931102012-03-15 01:21:2735 if (!init_host_port)
36 instance_->AppendError("Can't init host and port");
37
[email protected]0f8a16cf2012-03-21 10:08:3738 return host_resolver_private_is_available &&
[email protected]24931102012-03-15 01:21:2739 tcp_socket_private_is_available &&
40 init_host_port &&
41 CheckTestingInterface() &&
42 EnsureRunningOverHTTP();
43}
44
45void TestHostResolverPrivate::RunTests(const std::string& filter) {
[email protected]0f8a16cf2012-03-21 10:08:3746 RUN_TEST(Empty, filter);
[email protected]d1674cc42013-04-16 15:06:2647 RUN_CALLBACK_TEST(TestHostResolverPrivate, Resolve, filter);
48 RUN_CALLBACK_TEST(TestHostResolverPrivate, ResolveIPv4, filter);
[email protected]24931102012-03-15 01:21:2749}
50
51std::string TestHostResolverPrivate::SyncConnect(pp::TCPSocketPrivate* socket,
52 const std::string& host,
53 uint16_t port) {
[email protected]d1674cc42013-04-16 15:06:2654 TestCompletionCallback callback(instance_->pp_instance(), callback_type());
55 callback.WaitForResult(
56 socket->Connect(host.c_str(), port, callback.GetCallback()));
57 CHECK_CALLBACK_BEHAVIOR(callback);
58 ASSERT_EQ(PP_OK, callback.result());
[email protected]24931102012-03-15 01:21:2759 PASS();
60}
61
62std::string TestHostResolverPrivate::SyncConnect(
63 pp::TCPSocketPrivate* socket,
64 const PP_NetAddress_Private& address) {
[email protected]d1674cc42013-04-16 15:06:2665 TestCompletionCallback callback(instance_->pp_instance(), callback_type());
66 callback.WaitForResult(
67 socket->ConnectWithNetAddress(&address, callback.GetCallback()));
68 CHECK_CALLBACK_BEHAVIOR(callback);
69 ASSERT_EQ(PP_OK, callback.result());
[email protected]24931102012-03-15 01:21:2770 PASS();
71}
72
73std::string TestHostResolverPrivate::SyncRead(pp::TCPSocketPrivate* socket,
74 char* buffer,
75 int32_t num_bytes,
76 int32_t* bytes_read) {
[email protected]d1674cc42013-04-16 15:06:2677 TestCompletionCallback callback(instance_->pp_instance(), callback_type());
78 callback.WaitForResult(
79 socket->Read(buffer, num_bytes, callback.GetCallback()));
80 CHECK_CALLBACK_BEHAVIOR(callback);
81 ASSERT_EQ(num_bytes, callback.result());
82 *bytes_read = callback.result();
[email protected]24931102012-03-15 01:21:2783 PASS();
84}
85
86std::string TestHostResolverPrivate::SyncWrite(pp::TCPSocketPrivate* socket,
87 const char* buffer,
88 int32_t num_bytes,
89 int32_t* bytes_written) {
[email protected]d1674cc42013-04-16 15:06:2690 TestCompletionCallback callback(instance_->pp_instance(), callback_type());
91 callback.WaitForResult(
92 socket->Write(buffer, num_bytes, callback.GetCallback()));
93 CHECK_CALLBACK_BEHAVIOR(callback);
94 ASSERT_EQ(num_bytes, callback.result());
95 *bytes_written = callback.result();
[email protected]24931102012-03-15 01:21:2796 PASS();
97}
98
99std::string TestHostResolverPrivate::CheckHTTPResponse(
100 pp::TCPSocketPrivate* socket,
101 const std::string& request,
102 const std::string& response) {
103 int32_t rv = 0;
[email protected]0f8a16cf2012-03-21 10:08:37104 ASSERT_SUBTEST_SUCCESS(
brettw669d47b12015-02-13 21:17:38105 SyncWrite(socket, request.c_str(), static_cast<int32_t>(request.size()),
106 &rv));
[email protected]24931102012-03-15 01:21:27107 std::vector<char> response_buffer(response.size());
[email protected]0f8a16cf2012-03-21 10:08:37108 ASSERT_SUBTEST_SUCCESS(
brettw669d47b12015-02-13 21:17:38109 SyncRead(socket, &response_buffer[0],
110 static_cast<int32_t>(response.size()), &rv));
[email protected]24931102012-03-15 01:21:27111 std::string actual_response(&response_buffer[0], rv);
112 if (response != actual_response) {
113 return "CheckHTTPResponse failed, expected: " + response +
114 ", actual: " + actual_response;
115 }
116 PASS();
117}
118
119std::string TestHostResolverPrivate::SyncResolve(
[email protected]0f8a16cf2012-03-21 10:08:37120 pp::HostResolverPrivate* host_resolver,
[email protected]24931102012-03-15 01:21:27121 const std::string& host,
122 uint16_t port,
123 const PP_HostResolver_Private_Hint& hint) {
[email protected]d1674cc42013-04-16 15:06:26124 TestCompletionCallback callback(instance_->pp_instance(), callback_type());
125 callback.WaitForResult(
126 host_resolver->Resolve(host, port, hint, callback.GetCallback()));
127 CHECK_CALLBACK_BEHAVIOR(callback);
[email protected]24931102012-03-15 01:21:27128 PASS();
129}
130
[email protected]0f8a16cf2012-03-21 10:08:37131std::string TestHostResolverPrivate::TestEmpty() {
132 pp::HostResolverPrivate host_resolver(instance_);
133 ASSERT_EQ(0, host_resolver.GetSize());
[email protected]24931102012-03-15 01:21:27134 PP_NetAddress_Private address;
[email protected]0f8a16cf2012-03-21 10:08:37135 ASSERT_FALSE(host_resolver.GetNetAddress(0, &address));
136
[email protected]24931102012-03-15 01:21:27137 PASS();
138}
139
140std::string TestHostResolverPrivate::ParametrizedTestResolve(
141 const PP_HostResolver_Private_Hint &hint) {
[email protected]0f8a16cf2012-03-21 10:08:37142 pp::HostResolverPrivate host_resolver(instance_);
[email protected]24931102012-03-15 01:21:27143
[email protected]0f8a16cf2012-03-21 10:08:37144 ASSERT_SUBTEST_SUCCESS(SyncResolve(&host_resolver, host_, port_, hint));
[email protected]24931102012-03-15 01:21:27145
[email protected]0f8a16cf2012-03-21 10:08:37146 const size_t size = host_resolver.GetSize();
[email protected]24931102012-03-15 01:21:27147 ASSERT_TRUE(size >= 1);
148
149 PP_NetAddress_Private address;
150 for (size_t i = 0; i < size; ++i) {
brettw669d47b12015-02-13 21:17:38151 ASSERT_TRUE(host_resolver.GetNetAddress(
152 static_cast<uint32_t>(i), &address));
[email protected]0f8a16cf2012-03-21 10:08:37153
[email protected]24931102012-03-15 01:21:27154 pp::TCPSocketPrivate socket(instance_);
[email protected]0f8a16cf2012-03-21 10:08:37155 ASSERT_SUBTEST_SUCCESS(SyncConnect(&socket, address));
156 ASSERT_SUBTEST_SUCCESS(CheckHTTPResponse(&socket,
157 "GET / HTTP/1.0\r\n\r\n",
158 "HTTP"));
[email protected]24931102012-03-15 01:21:27159 socket.Disconnect();
160 }
161
brettw669d47b12015-02-13 21:17:38162 ASSERT_FALSE(host_resolver.GetNetAddress(
163 static_cast<uint32_t>(size), &address));
[email protected]0f8a16cf2012-03-21 10:08:37164 pp::Var canonical_name = host_resolver.GetCanonicalName();
[email protected]24931102012-03-15 01:21:27165 ASSERT_TRUE(canonical_name.is_string());
166 pp::TCPSocketPrivate socket(instance_);
[email protected]0f8a16cf2012-03-21 10:08:37167 ASSERT_SUBTEST_SUCCESS(SyncConnect(&socket,
168 canonical_name.AsString(),
169 port_));
170 ASSERT_SUBTEST_SUCCESS(CheckHTTPResponse(&socket,
171 "GET / HTTP/1.0\r\n\r\n",
172 "HTTP"));
[email protected]24931102012-03-15 01:21:27173 socket.Disconnect();
174
[email protected]24931102012-03-15 01:21:27175 PASS();
176}
177
178std::string TestHostResolverPrivate::TestResolve() {
179 PP_HostResolver_Private_Hint hint;
[email protected]ddecdae2013-06-24 23:17:46180 hint.family = PP_NETADDRESSFAMILY_PRIVATE_UNSPECIFIED;
181 hint.flags = PP_HOST_RESOLVER_PRIVATE_FLAGS_CANONNAME;
[email protected]24931102012-03-15 01:21:27182 return ParametrizedTestResolve(hint);
183}
184
185std::string TestHostResolverPrivate::TestResolveIPv4() {
186 PP_HostResolver_Private_Hint hint;
[email protected]ddecdae2013-06-24 23:17:46187 hint.family = PP_NETADDRESSFAMILY_PRIVATE_IPV4;
188 hint.flags = PP_HOST_RESOLVER_PRIVATE_FLAGS_CANONNAME;
[email protected]24931102012-03-15 01:21:27189 return ParametrizedTestResolve(hint);
190}