blob: 740d6e0070fe77bb091d9296940847d1070378b4 [file] [log] [blame]
license.botbf09a502008-08-24 00:55:551// Copyright (c) 2006-2008 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.
initial.commit586acc5fe2008-07-26 22:42:524
5#include "net/base/address_list.h"
initial.commit586acc5fe2008-07-26 22:42:526#include "net/base/host_resolver.h"
[email protected]7b822b2b2008-08-05 00:15:457#include "net/base/net_errors.h"
initial.commit586acc5fe2008-07-26 22:42:528#include "net/base/ssl_client_socket.h"
9#include "net/base/tcp_client_socket.h"
10#include "net/base/test_completion_callback.h"
11#include "testing/gtest/include/gtest/gtest.h"
12
13//-----------------------------------------------------------------------------
14
15namespace {
16
17class SSLClientSocketTest : public testing::Test {
18};
19
20} // namespace
21
22//-----------------------------------------------------------------------------
23
24TEST_F(SSLClientSocketTest, Connect) {
25 net::AddressList addr;
26 net::HostResolver resolver;
27 TestCompletionCallback callback;
28
[email protected]4628a2a2008-08-14 20:33:2529 std::string hostname = "bugs.webkit.org";
initial.commit586acc5fe2008-07-26 22:42:5230 int rv = resolver.Resolve(hostname, 443, &addr, NULL);
31 EXPECT_EQ(net::OK, rv);
32
33 net::SSLClientSocket sock(new net::TCPClientSocket(addr), hostname);
34
35 EXPECT_FALSE(sock.IsConnected());
36
37 rv = sock.Connect(&callback);
[email protected]7b822b2b2008-08-05 00:15:4538 if (rv != net::OK) {
39 ASSERT_EQ(net::ERR_IO_PENDING, rv);
initial.commit586acc5fe2008-07-26 22:42:5240
[email protected]7b822b2b2008-08-05 00:15:4541 rv = callback.WaitForResult();
42 EXPECT_EQ(net::OK, rv);
43 }
initial.commit586acc5fe2008-07-26 22:42:5244
45 EXPECT_TRUE(sock.IsConnected());
46
47 sock.Disconnect();
48 EXPECT_FALSE(sock.IsConnected());
49}
50
initial.commit586acc5fe2008-07-26 22:42:5251TEST_F(SSLClientSocketTest, Read) {
52 net::AddressList addr;
53 net::HostResolver resolver;
54 TestCompletionCallback callback;
55
[email protected]4628a2a2008-08-14 20:33:2556 std::string hostname = "bugs.webkit.org";
initial.commit586acc5fe2008-07-26 22:42:5257 int rv = resolver.Resolve(hostname, 443, &addr, &callback);
58 EXPECT_EQ(rv, net::ERR_IO_PENDING);
59
60 rv = callback.WaitForResult();
61 EXPECT_EQ(rv, net::OK);
62
63 net::SSLClientSocket sock(new net::TCPClientSocket(addr), hostname);
64
65 rv = sock.Connect(&callback);
[email protected]7b822b2b2008-08-05 00:15:4566 if (rv != net::OK) {
67 ASSERT_EQ(rv, net::ERR_IO_PENDING);
initial.commit586acc5fe2008-07-26 22:42:5268
[email protected]7b822b2b2008-08-05 00:15:4569 rv = callback.WaitForResult();
70 EXPECT_EQ(rv, net::OK);
71 }
initial.commit586acc5fe2008-07-26 22:42:5272
73 const char request_text[] = "GET / HTTP/1.0\r\n\r\n";
[email protected]7b822b2b2008-08-05 00:15:4574 rv = sock.Write(request_text, arraysize(request_text) - 1, &callback);
initial.commit586acc5fe2008-07-26 22:42:5275 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING);
76
77 if (rv == net::ERR_IO_PENDING) {
78 rv = callback.WaitForResult();
[email protected]7b822b2b2008-08-05 00:15:4579 EXPECT_EQ(rv, arraysize(request_text) - 1);
initial.commit586acc5fe2008-07-26 22:42:5280 }
81
82 char buf[4096];
83 for (;;) {
84 rv = sock.Read(buf, sizeof(buf), &callback);
85 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING);
86
87 if (rv == net::ERR_IO_PENDING)
88 rv = callback.WaitForResult();
89
[email protected]7b822b2b2008-08-05 00:15:4590 EXPECT_GE(rv, 0);
91 if (rv <= 0)
initial.commit586acc5fe2008-07-26 22:42:5292 break;
93 }
94}
95
[email protected]7b822b2b2008-08-05 00:15:4596TEST_F(SSLClientSocketTest, Read_SmallChunks) {
initial.commit586acc5fe2008-07-26 22:42:5297 net::AddressList addr;
98 net::HostResolver resolver;
99 TestCompletionCallback callback;
100
[email protected]4628a2a2008-08-14 20:33:25101 std::string hostname = "bugs.webkit.org";
102 int rv = resolver.Resolve(hostname, 443, &addr, NULL);
initial.commit586acc5fe2008-07-26 22:42:52103 EXPECT_EQ(rv, net::OK);
104
[email protected]4628a2a2008-08-14 20:33:25105 net::SSLClientSocket sock(new net::TCPClientSocket(addr), hostname);
initial.commit586acc5fe2008-07-26 22:42:52106
107 rv = sock.Connect(&callback);
[email protected]7b822b2b2008-08-05 00:15:45108 if (rv != net::OK) {
109 ASSERT_EQ(rv, net::ERR_IO_PENDING);
initial.commit586acc5fe2008-07-26 22:42:52110
[email protected]7b822b2b2008-08-05 00:15:45111 rv = callback.WaitForResult();
112 EXPECT_EQ(rv, net::OK);
113 }
initial.commit586acc5fe2008-07-26 22:42:52114
115 const char request_text[] = "GET / HTTP/1.0\r\n\r\n";
[email protected]7b822b2b2008-08-05 00:15:45116 rv = sock.Write(request_text, arraysize(request_text) - 1, &callback);
initial.commit586acc5fe2008-07-26 22:42:52117 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING);
118
119 if (rv == net::ERR_IO_PENDING) {
120 rv = callback.WaitForResult();
[email protected]7b822b2b2008-08-05 00:15:45121 EXPECT_EQ(rv, arraysize(request_text) - 1);
initial.commit586acc5fe2008-07-26 22:42:52122 }
123
124 char buf[1];
125 for (;;) {
126 rv = sock.Read(buf, sizeof(buf), &callback);
127 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING);
128
129 if (rv == net::ERR_IO_PENDING)
130 rv = callback.WaitForResult();
131
[email protected]7b822b2b2008-08-05 00:15:45132 EXPECT_GE(rv, 0);
133 if (rv <= 0)
initial.commit586acc5fe2008-07-26 22:42:52134 break;
135 }
136}
137
[email protected]7b822b2b2008-08-05 00:15:45138TEST_F(SSLClientSocketTest, Read_Interrupted) {
initial.commit586acc5fe2008-07-26 22:42:52139 net::AddressList addr;
140 net::HostResolver resolver;
141 TestCompletionCallback callback;
142
[email protected]4628a2a2008-08-14 20:33:25143 std::string hostname = "bugs.webkit.org";
144 int rv = resolver.Resolve(hostname, 443, &addr, NULL);
initial.commit586acc5fe2008-07-26 22:42:52145 EXPECT_EQ(rv, net::OK);
146
[email protected]4628a2a2008-08-14 20:33:25147 net::SSLClientSocket sock(new net::TCPClientSocket(addr), hostname);
initial.commit586acc5fe2008-07-26 22:42:52148
149 rv = sock.Connect(&callback);
[email protected]7b822b2b2008-08-05 00:15:45150 if (rv != net::OK) {
151 ASSERT_EQ(rv, net::ERR_IO_PENDING);
initial.commit586acc5fe2008-07-26 22:42:52152
[email protected]7b822b2b2008-08-05 00:15:45153 rv = callback.WaitForResult();
154 EXPECT_EQ(rv, net::OK);
155 }
initial.commit586acc5fe2008-07-26 22:42:52156
157 const char request_text[] = "GET / HTTP/1.0\r\n\r\n";
[email protected]7b822b2b2008-08-05 00:15:45158 rv = sock.Write(request_text, arraysize(request_text) - 1, &callback);
initial.commit586acc5fe2008-07-26 22:42:52159 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING);
160
161 if (rv == net::ERR_IO_PENDING) {
162 rv = callback.WaitForResult();
[email protected]7b822b2b2008-08-05 00:15:45163 EXPECT_EQ(rv, arraysize(request_text) - 1);
initial.commit586acc5fe2008-07-26 22:42:52164 }
165
166 // Do a partial read and then exit. This test should not crash!
167 char buf[512];
168 rv = sock.Read(buf, sizeof(buf), &callback);
169 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING);
170
171 if (rv == net::ERR_IO_PENDING)
172 rv = callback.WaitForResult();
173
[email protected]7b822b2b2008-08-05 00:15:45174 EXPECT_NE(rv, 0);
initial.commit586acc5fe2008-07-26 22:42:52175}
license.botbf09a502008-08-24 00:55:55176