1 // Copyright 2013 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.
5 #include "ppapi/tests/test_host_resolver.h"
7 #include "ppapi/cpp/host_resolver.h"
8 #include "ppapi/cpp/net_address.h"
9 #include "ppapi/cpp/tcp_socket.h"
10 #include "ppapi/cpp/var.h"
11 #include "ppapi/tests/test_utils.h"
12 #include "ppapi/tests/testing_instance.h"
14 REGISTER_TEST_CASE(HostResolver
);
16 TestHostResolver::TestHostResolver(TestingInstance
* instance
)
17 : TestCase(instance
) {
20 bool TestHostResolver::Init() {
21 bool host_resolver_is_available
= pp::HostResolver::IsAvailable();
22 if (!host_resolver_is_available
)
23 instance_
->AppendError("PPB_HostResolver interface not available");
25 bool tcp_socket_is_available
= pp::TCPSocket::IsAvailable();
26 if (!tcp_socket_is_available
)
27 instance_
->AppendError("PPB_TCPSocket interface not available");
30 GetLocalHostPort(instance_
->pp_instance(), &host_
, &port_
);
32 instance_
->AppendError("Can't init host and port");
34 return host_resolver_is_available
&&
35 tcp_socket_is_available
&&
37 CheckTestingInterface() &&
38 EnsureRunningOverHTTP();
41 void TestHostResolver::RunTests(const std::string
& filter
) {
42 RUN_TEST(Empty
, filter
);
43 RUN_CALLBACK_TEST(TestHostResolver
, Resolve
, filter
);
44 RUN_CALLBACK_TEST(TestHostResolver
, ResolveIPv4
, filter
);
47 std::string
TestHostResolver::SyncConnect(
48 pp::TCPSocket
* socket
,
49 const pp::NetAddress
& address
) {
50 TestCompletionCallback
callback(instance_
->pp_instance(), callback_type());
51 callback
.WaitForResult(socket
->Connect(address
, callback
.GetCallback()));
52 CHECK_CALLBACK_BEHAVIOR(callback
);
53 ASSERT_EQ(PP_OK
, callback
.result());
57 std::string
TestHostResolver::SyncRead(pp::TCPSocket
* socket
,
60 int32_t* bytes_read
) {
61 TestCompletionCallback
callback(instance_
->pp_instance(), callback_type());
62 callback
.WaitForResult(
63 socket
->Read(buffer
, num_bytes
, callback
.GetCallback()));
64 CHECK_CALLBACK_BEHAVIOR(callback
);
65 ASSERT_EQ(num_bytes
, callback
.result());
66 *bytes_read
= callback
.result();
70 std::string
TestHostResolver::SyncWrite(pp::TCPSocket
* socket
,
73 int32_t* bytes_written
) {
74 TestCompletionCallback
callback(instance_
->pp_instance(), callback_type());
75 callback
.WaitForResult(
76 socket
->Write(buffer
, num_bytes
, callback
.GetCallback()));
77 CHECK_CALLBACK_BEHAVIOR(callback
);
78 ASSERT_EQ(num_bytes
, callback
.result());
79 *bytes_written
= callback
.result();
83 std::string
TestHostResolver::CheckHTTPResponse(pp::TCPSocket
* socket
,
84 const std::string
& request
,
85 const std::string
& response
) {
87 ASSERT_SUBTEST_SUCCESS(
88 SyncWrite(socket
, request
.c_str(), request
.size(), &rv
));
89 std::vector
<char> response_buffer(response
.size());
90 ASSERT_SUBTEST_SUCCESS(
91 SyncRead(socket
, &response_buffer
[0], response
.size(), &rv
));
92 std::string
actual_response(&response_buffer
[0], rv
);
93 if (response
!= actual_response
) {
94 return "CheckHTTPResponse failed, expected: " + response
+
95 ", actual: " + actual_response
;
100 std::string
TestHostResolver::SyncResolve(
101 pp::HostResolver
* host_resolver
,
102 const std::string
& host
,
104 const PP_HostResolver_Hint
& hint
) {
105 TestCompletionCallback
callback(instance_
->pp_instance(), callback_type());
106 callback
.WaitForResult(
107 host_resolver
->Resolve(host
.c_str(), port
, hint
, callback
.GetCallback()));
108 CHECK_CALLBACK_BEHAVIOR(callback
);
109 ASSERT_EQ(PP_OK
, callback
.result());
113 std::string
TestHostResolver::ParameterizedTestResolve(
114 const PP_HostResolver_Hint
& hint
) {
115 pp::HostResolver
host_resolver(instance_
);
117 ASSERT_SUBTEST_SUCCESS(SyncResolve(&host_resolver
, host_
, port_
, hint
));
119 size_t size
= host_resolver
.GetNetAddressCount();
120 ASSERT_TRUE(size
>= 1);
122 pp::NetAddress address
;
123 for (size_t i
= 0; i
< size
; ++i
) {
124 address
= host_resolver
.GetNetAddress(i
);
125 ASSERT_NE(0, address
.pp_resource());
127 pp::TCPSocket
socket(instance_
);
128 ASSERT_SUBTEST_SUCCESS(SyncConnect(&socket
, address
));
129 ASSERT_SUBTEST_SUCCESS(CheckHTTPResponse(&socket
,
130 "GET / HTTP/1.0\r\n\r\n",
135 address
= host_resolver
.GetNetAddress(size
);
136 ASSERT_EQ(0, address
.pp_resource());
137 pp::Var canonical_name
= host_resolver
.GetCanonicalName();
138 ASSERT_TRUE(canonical_name
.is_string());
140 ASSERT_SUBTEST_SUCCESS(SyncResolve(&host_resolver
, canonical_name
.AsString(),
142 size
= host_resolver
.GetNetAddressCount();
143 ASSERT_TRUE(size
>= 1);
148 std::string
TestHostResolver::TestEmpty() {
149 pp::HostResolver
host_resolver(instance_
);
150 ASSERT_EQ(0, host_resolver
.GetNetAddressCount());
151 pp::NetAddress address
= host_resolver
.GetNetAddress(0);
152 ASSERT_EQ(0, address
.pp_resource());
157 std::string
TestHostResolver::TestResolve() {
158 PP_HostResolver_Hint hint
;
159 hint
.family
= PP_NETADDRESS_FAMILY_UNSPECIFIED
;
160 hint
.flags
= PP_HOSTRESOLVER_FLAG_CANONNAME
;
161 return ParameterizedTestResolve(hint
);
164 std::string
TestHostResolver::TestResolveIPv4() {
165 PP_HostResolver_Hint hint
;
166 hint
.family
= PP_NETADDRESS_FAMILY_IPV4
;
167 hint
.flags
= PP_HOSTRESOLVER_FLAG_CANONNAME
;
168 return ParameterizedTestResolve(hint
);