blob: a1d47d040b990e6b6051296a81242189ef97f44c [file] [log] [blame]
Peter Qiuc0beca52015-09-03 11:25:46 -07001//
2// Copyright (C) 2012 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
Paul Stewart188a84a2012-01-20 16:28:15 -080016
17#include "shill/http_request.h"
18
19#include <netinet/in.h>
20
Ben Chancd477322014-10-17 14:19:30 -070021#include <memory>
Paul Stewart188a84a2012-01-20 16:28:15 -080022#include <string>
23#include <vector>
24
Eric Shienbrood3e20a232012-02-16 11:35:56 -050025#include <base/bind.h>
Ben Chana0ddf462014-02-06 11:32:42 -080026#include <base/strings/stringprintf.h>
Paul Stewart188a84a2012-01-20 16:28:15 -080027#include <gtest/gtest.h>
28
Paul Stewart188a84a2012-01-20 16:28:15 -080029#include "shill/http_url.h"
30#include "shill/mock_async_connection.h"
31#include "shill/mock_connection.h"
32#include "shill/mock_control.h"
33#include "shill/mock_device_info.h"
34#include "shill/mock_dns_client.h"
35#include "shill/mock_event_dispatcher.h"
Peter Qiu8d6b5972014-10-28 15:33:34 -070036#include "shill/net/ip_address.h"
37#include "shill/net/mock_sockets.h"
Paul Stewart188a84a2012-01-20 16:28:15 -080038
Eric Shienbrood3e20a232012-02-16 11:35:56 -050039using base::Bind;
40using base::Callback;
Paul Stewart188a84a2012-01-20 16:28:15 -080041using base::StringPrintf;
Eric Shienbrood3e20a232012-02-16 11:35:56 -050042using base::Unretained;
Paul Stewart188a84a2012-01-20 16:28:15 -080043using std::string;
44using std::vector;
45using ::testing::_;
46using ::testing::AtLeast;
47using ::testing::DoAll;
48using ::testing::Invoke;
49using ::testing::NiceMock;
50using ::testing::Return;
51using ::testing::ReturnArg;
52using ::testing::ReturnNew;
53using ::testing::ReturnRef;
54using ::testing::SetArgumentPointee;
55using ::testing::StrEq;
56using ::testing::StrictMock;
57using ::testing::Test;
58
59namespace shill {
60
61namespace {
62const char kTextSiteName[] = "www.chromium.org";
63const char kTextURL[] = "http://www.chromium.org/path/to/resource";
64const char kNumericURL[] = "http://10.1.1.1";
65const char kPath[] = "/path/to/resource";
Paul Stewart188a84a2012-01-20 16:28:15 -080066const char kInterfaceName[] = "int0";
67const char kDNSServer0[] = "8.8.8.8";
68const char kDNSServer1[] = "8.8.4.4";
Paul Stewart3b30ca52015-06-16 13:13:10 -070069const char* kDNSServers[] = { kDNSServer0, kDNSServer1 };
Paul Stewart188a84a2012-01-20 16:28:15 -080070const char kServerAddress[] = "10.1.1.1";
71const int kServerFD = 10203;
72const int kServerPort = 80;
Alex Vakulenko8a532292014-06-16 17:18:44 -070073} // namespace
Paul Stewart188a84a2012-01-20 16:28:15 -080074
75MATCHER_P(IsIPAddress, address, "") {
76 IPAddress ip_address(IPAddress::kFamilyIPv4);
77 EXPECT_TRUE(ip_address.SetAddressFromString(address));
78 return ip_address.Equals(arg);
79}
80
Paul Stewartbdb02e62012-02-22 16:24:33 -080081MATCHER_P(ByteStringMatches, byte_string, "") {
82 return byte_string.Equals(arg);
83}
84
Eric Shienbrood3e20a232012-02-16 11:35:56 -050085MATCHER_P(CallbackEq, callback, "") {
86 return arg.Equals(callback);
87}
88
Paul Stewart188a84a2012-01-20 16:28:15 -080089class HTTPRequestTest : public Test {
90 public:
91 HTTPRequestTest()
92 : interface_name_(kInterfaceName),
93 server_async_connection_(new StrictMock<MockAsyncConnection>()),
94 dns_servers_(kDNSServers, kDNSServers + 2),
95 dns_client_(new StrictMock<MockDNSClient>()),
Ben Chancc225ef2014-09-30 13:26:51 -070096 device_info_(
97 new NiceMock<MockDeviceInfo>(&control_, nullptr, nullptr, nullptr)),
98 connection_(new StrictMock<MockConnection>(device_info_.get())) {}
Alex Vakulenko8a532292014-06-16 17:18:44 -070099
Paul Stewart188a84a2012-01-20 16:28:15 -0800100 protected:
101 class CallbackTarget {
102 public:
103 CallbackTarget()
104 : read_event_callback_(
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500105 Bind(&CallbackTarget::ReadEventCallTarget, Unretained(this))),
Paul Stewart188a84a2012-01-20 16:28:15 -0800106 result_callback_(
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500107 Bind(&CallbackTarget::ResultCallTarget, Unretained(this))) {}
Paul Stewart188a84a2012-01-20 16:28:15 -0800108
Paul Stewart3b30ca52015-06-16 13:13:10 -0700109 MOCK_METHOD1(ReadEventCallTarget, void(const ByteString& response_data));
Paul Stewartbdb02e62012-02-22 16:24:33 -0800110 MOCK_METHOD2(ResultCallTarget, void(HTTPRequest::Result result,
Paul Stewart3b30ca52015-06-16 13:13:10 -0700111 const ByteString& response_data));
112 const Callback<void(const ByteString&)>& read_event_callback() {
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500113 return read_event_callback_;
Paul Stewart188a84a2012-01-20 16:28:15 -0800114 }
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500115 const Callback<void(HTTPRequest::Result,
Paul Stewart3b30ca52015-06-16 13:13:10 -0700116 const ByteString&)>& result_callback() {
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500117 return result_callback_;
Paul Stewart188a84a2012-01-20 16:28:15 -0800118 }
119
120 private:
Paul Stewart3b30ca52015-06-16 13:13:10 -0700121 Callback<void(const ByteString&)> read_event_callback_;
122 Callback<void(HTTPRequest::Result, const ByteString&)> result_callback_;
Paul Stewart188a84a2012-01-20 16:28:15 -0800123 };
124
125 virtual void SetUp() {
Peter Qiuf3a8f902014-08-20 10:05:42 -0700126 EXPECT_CALL(*connection_.get(), IsIPv6())
127 .WillRepeatedly(Return(false));
Paul Stewart188a84a2012-01-20 16:28:15 -0800128 EXPECT_CALL(*connection_.get(), interface_name())
129 .WillRepeatedly(ReturnRef(interface_name_));
130 EXPECT_CALL(*connection_.get(), dns_servers())
131 .WillRepeatedly(ReturnRef(dns_servers_));
132
133 request_.reset(new HTTPRequest(connection_, &dispatcher_, &sockets_));
134 // Passes ownership.
135 request_->dns_client_.reset(dns_client_);
136 // Passes ownership.
137 request_->server_async_connection_.reset(server_async_connection_);
138 }
139 virtual void TearDown() {
140 if (request_->is_running_) {
141 ExpectStop();
142
143 // Subtle: Make sure the finalization of the request happens while our
144 // expectations are still active.
145 request_.reset();
146 }
147 }
Paul Stewart3b30ca52015-06-16 13:13:10 -0700148 size_t FindInRequestData(const string& find_string) {
Paul Stewart188a84a2012-01-20 16:28:15 -0800149 string request_string(
Paul Stewart3b30ca52015-06-16 13:13:10 -0700150 reinterpret_cast<char*>(request_->request_data_.GetData()),
Paul Stewart188a84a2012-01-20 16:28:15 -0800151 request_->request_data_.GetLength());
152 return request_string.find(find_string);
153 }
154 // Accessors
Paul Stewart3b30ca52015-06-16 13:13:10 -0700155 const ByteString& GetRequestData() {
Paul Stewart188a84a2012-01-20 16:28:15 -0800156 return request_->request_data_;
157 }
Paul Stewart3b30ca52015-06-16 13:13:10 -0700158 HTTPRequest* request() { return request_.get(); }
159 MockSockets& sockets() { return sockets_; }
Paul Stewart188a84a2012-01-20 16:28:15 -0800160
161 // Expectations
162 void ExpectReset() {
163 EXPECT_EQ(connection_.get(), request_->connection_.get());
164 EXPECT_EQ(&dispatcher_, request_->dispatcher_);
165 EXPECT_EQ(&sockets_, request_->sockets_);
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500166 EXPECT_TRUE(request_->result_callback_.is_null());
167 EXPECT_TRUE(request_->read_event_callback_.is_null());
Eric Shienbrood9a245532012-03-07 14:20:39 -0500168 EXPECT_FALSE(request_->connect_completion_callback_.is_null());
169 EXPECT_FALSE(request_->dns_client_callback_.is_null());
170 EXPECT_FALSE(request_->read_server_callback_.is_null());
171 EXPECT_FALSE(request_->write_server_callback_.is_null());
Paul Stewart188a84a2012-01-20 16:28:15 -0800172 EXPECT_FALSE(request_->read_server_handler_.get());
173 EXPECT_FALSE(request_->write_server_handler_.get());
174 EXPECT_EQ(dns_client_, request_->dns_client_.get());
175 EXPECT_EQ(server_async_connection_,
176 request_->server_async_connection_.get());
177 EXPECT_TRUE(request_->server_hostname_.empty());
178 EXPECT_EQ(-1, request_->server_port_);
179 EXPECT_EQ(-1, request_->server_socket_);
180 EXPECT_EQ(HTTPRequest::kResultUnknown, request_->timeout_result_);
181 EXPECT_TRUE(request_->request_data_.IsEmpty());
182 EXPECT_TRUE(request_->response_data_.IsEmpty());
183 EXPECT_FALSE(request_->is_running_);
184 }
185 void ExpectStop() {
186 if (request_->server_socket_ != -1) {
187 EXPECT_CALL(sockets(), Close(kServerFD))
188 .WillOnce(Return(0));
189 }
190 EXPECT_CALL(*dns_client_, Stop())
191 .Times(AtLeast(1));
192 EXPECT_CALL(*server_async_connection_, Stop())
193 .Times(AtLeast(1));
194 EXPECT_CALL(*connection_.get(), ReleaseRouting());
195 }
196 void ExpectSetTimeout(int timeout) {
Alex Vakulenko3a62e232016-01-20 07:47:40 -0800197 EXPECT_CALL(dispatcher_, PostDelayedTask(_, timeout * 1000));
Paul Stewart188a84a2012-01-20 16:28:15 -0800198 }
199 void ExpectSetConnectTimeout() {
200 ExpectSetTimeout(HTTPRequest::kConnectTimeoutSeconds);
201 }
202 void ExpectSetInputTimeout() {
203 ExpectSetTimeout(HTTPRequest::kInputTimeoutSeconds);
204 }
Paul Stewart3b30ca52015-06-16 13:13:10 -0700205 void ExpectInResponse(const string& expected_response_data) {
Paul Stewart188a84a2012-01-20 16:28:15 -0800206 string response_string(
Paul Stewart3b30ca52015-06-16 13:13:10 -0700207 reinterpret_cast<char*>(request_->response_data_.GetData()),
Paul Stewart188a84a2012-01-20 16:28:15 -0800208 request_->response_data_.GetLength());
209 EXPECT_NE(string::npos, response_string.find(expected_response_data));
210 }
Paul Stewart3b30ca52015-06-16 13:13:10 -0700211 void ExpectDNSRequest(const string& host, bool return_value) {
Paul Stewartbdb02e62012-02-22 16:24:33 -0800212 EXPECT_CALL(*dns_client_, Start(StrEq(host), _))
Paul Stewart188a84a2012-01-20 16:28:15 -0800213 .WillOnce(Return(return_value));
214 }
Paul Stewart3b30ca52015-06-16 13:13:10 -0700215 void ExpectAsyncConnect(const string& address, int port,
Paul Stewart188a84a2012-01-20 16:28:15 -0800216 bool return_value) {
217 EXPECT_CALL(*server_async_connection_, Start(IsIPAddress(address), port))
218 .WillOnce(Return(return_value));
219 if (return_value) {
220 ExpectSetConnectTimeout();
221 }
222 }
Paul Stewart3b30ca52015-06-16 13:13:10 -0700223 void InvokeSyncConnect(const IPAddress& /*address*/, int /*port*/) {
Paul Stewart188a84a2012-01-20 16:28:15 -0800224 CallConnectCompletion(true, kServerFD);
225 }
226 void CallConnectCompletion(bool success, int fd) {
227 request_->OnConnectCompletion(success, fd);
228 }
Paul Stewart3b30ca52015-06-16 13:13:10 -0700229 void ExpectSyncConnect(const string& address, int port) {
Paul Stewart188a84a2012-01-20 16:28:15 -0800230 EXPECT_CALL(*server_async_connection_, Start(IsIPAddress(address), port))
231 .WillOnce(DoAll(Invoke(this, &HTTPRequestTest::InvokeSyncConnect),
232 Return(true)));
233 }
234 void ExpectConnectFailure() {
235 EXPECT_CALL(*server_async_connection_, Start(_, _))
236 .WillOnce(Return(false));
237 }
238 void ExpectMonitorServerInput() {
239 EXPECT_CALL(dispatcher_,
240 CreateInputHandler(kServerFD,
Paul Stewart5f06a0e2012-12-20 11:11:33 -0800241 CallbackEq(request_->read_server_callback_),
242 _))
Paul Stewart188a84a2012-01-20 16:28:15 -0800243 .WillOnce(ReturnNew<IOHandler>());
244 ExpectSetInputTimeout();
245 }
246 void ExpectMonitorServerOutput() {
247 EXPECT_CALL(dispatcher_,
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500248 CreateReadyHandler(
249 kServerFD, IOHandler::kModeOutput,
250 CallbackEq(request_->write_server_callback_)))
Paul Stewart188a84a2012-01-20 16:28:15 -0800251 .WillOnce(ReturnNew<IOHandler>());
252 ExpectSetInputTimeout();
253 }
254 void ExpectRouteRequest() {
255 EXPECT_CALL(*connection_.get(), RequestRouting());
256 }
257 void ExpectRouteRelease() {
258 EXPECT_CALL(*connection_.get(), ReleaseRouting());
259 }
260 void ExpectResultCallback(HTTPRequest::Result result) {
Paul Stewartbdb02e62012-02-22 16:24:33 -0800261 EXPECT_CALL(target_, ResultCallTarget(result, _));
Paul Stewart188a84a2012-01-20 16:28:15 -0800262 }
Paul Stewartbdb02e62012-02-22 16:24:33 -0800263 void InvokeResultVerify(HTTPRequest::Result result,
Paul Stewart3b30ca52015-06-16 13:13:10 -0700264 const ByteString& response_data) {
Paul Stewart188a84a2012-01-20 16:28:15 -0800265 EXPECT_EQ(HTTPRequest::kResultSuccess, result);
Paul Stewartbdb02e62012-02-22 16:24:33 -0800266 EXPECT_TRUE(expected_response_.Equals(response_data));
Paul Stewart188a84a2012-01-20 16:28:15 -0800267 }
Paul Stewart3b30ca52015-06-16 13:13:10 -0700268 void ExpectResultCallbackWithResponse(const string& response) {
Paul Stewart188a84a2012-01-20 16:28:15 -0800269 expected_response_ = ByteString(response, false);
Paul Stewartbdb02e62012-02-22 16:24:33 -0800270 EXPECT_CALL(target_, ResultCallTarget(HTTPRequest::kResultSuccess, _))
Paul Stewart188a84a2012-01-20 16:28:15 -0800271 .WillOnce(Invoke(this, &HTTPRequestTest::InvokeResultVerify));
272 }
Paul Stewart3b30ca52015-06-16 13:13:10 -0700273 void ExpectReadEventCallback(const string& response) {
Paul Stewartbdb02e62012-02-22 16:24:33 -0800274 ByteString response_data(response, false);
275 EXPECT_CALL(target_, ReadEventCallTarget(ByteStringMatches(response_data)));
Paul Stewart188a84a2012-01-20 16:28:15 -0800276 }
Paul Stewart3b30ca52015-06-16 13:13:10 -0700277 void GetDNSResultFailure(const string& error_msg) {
Paul Stewartbdb02e62012-02-22 16:24:33 -0800278 Error error(Error::kOperationFailed, error_msg);
279 IPAddress address(IPAddress::kFamilyUnknown);
280 request_->GetDNSResult(error, address);
281 }
Paul Stewart3b30ca52015-06-16 13:13:10 -0700282 void GetDNSResultSuccess(const IPAddress& address) {
Paul Stewartbdb02e62012-02-22 16:24:33 -0800283 Error error;
284 request_->GetDNSResult(error, address);
Paul Stewart188a84a2012-01-20 16:28:15 -0800285 }
286 void OnConnectCompletion(bool result, int sockfd) {
287 request_->OnConnectCompletion(result, sockfd);
288 }
Paul Stewart3b30ca52015-06-16 13:13:10 -0700289 void ReadFromServer(const string& data) {
290 const unsigned char* ptr =
291 reinterpret_cast<const unsigned char*>(data.c_str());
Paul Stewart188a84a2012-01-20 16:28:15 -0800292 vector<unsigned char> data_writable(ptr, ptr + data.length());
293 InputData server_data(data_writable.data(), data_writable.size());
294 request_->ReadFromServer(&server_data);
295 }
296 void WriteToServer(int fd) {
297 request_->WriteToServer(fd);
298 }
Paul Stewart3b30ca52015-06-16 13:13:10 -0700299 HTTPRequest::Result StartRequest(const string& url) {
Paul Stewart188a84a2012-01-20 16:28:15 -0800300 HTTPURL http_url;
301 EXPECT_TRUE(http_url.ParseFromString(url));
302 return request_->Start(http_url,
303 target_.read_event_callback(),
304 target_.result_callback());
305 }
Paul Stewart3b30ca52015-06-16 13:13:10 -0700306 void SetupConnectWithURL(const string& url, const string& expected_hostname) {
Paul Stewart188a84a2012-01-20 16:28:15 -0800307 ExpectRouteRequest();
308 ExpectDNSRequest(expected_hostname, true);
309 EXPECT_EQ(HTTPRequest::kResultInProgress, StartRequest(url));
310 IPAddress addr(IPAddress::kFamilyIPv4);
311 EXPECT_TRUE(addr.SetAddressFromString(kServerAddress));
Paul Stewartbdb02e62012-02-22 16:24:33 -0800312 GetDNSResultSuccess(addr);
Paul Stewart188a84a2012-01-20 16:28:15 -0800313 }
314 void SetupConnect() {
315 SetupConnectWithURL(kTextURL, kTextSiteName);
316 }
317 void SetupConnectAsync() {
318 ExpectAsyncConnect(kServerAddress, kServerPort, true);
319 SetupConnect();
320 }
321 void SetupConnectComplete() {
322 SetupConnectAsync();
323 ExpectMonitorServerOutput();
324 OnConnectCompletion(true, kServerFD);
325 }
326 void CallTimeoutTask() {
327 request_->TimeoutTask();
328 }
Paul Stewart5f06a0e2012-12-20 11:11:33 -0800329 void CallServerErrorCallback() {
Peter Qiu3161caa2014-10-29 09:47:22 -0700330 request_->OnServerReadError(string());
Paul Stewart5f06a0e2012-12-20 11:11:33 -0800331 }
Paul Stewart188a84a2012-01-20 16:28:15 -0800332
333 private:
334 const string interface_name_;
335 // Owned by the HTTPRequest, but tracked here for EXPECT().
Paul Stewart3b30ca52015-06-16 13:13:10 -0700336 StrictMock<MockAsyncConnection>* server_async_connection_;
Paul Stewart188a84a2012-01-20 16:28:15 -0800337 vector<string> dns_servers_;
338 // Owned by the HTTPRequest, but tracked here for EXPECT().
Paul Stewart3b30ca52015-06-16 13:13:10 -0700339 StrictMock<MockDNSClient>* dns_client_;
Paul Stewart188a84a2012-01-20 16:28:15 -0800340 StrictMock<MockEventDispatcher> dispatcher_;
341 MockControl control_;
Ben Chancd477322014-10-17 14:19:30 -0700342 std::unique_ptr<MockDeviceInfo> device_info_;
Paul Stewart188a84a2012-01-20 16:28:15 -0800343 scoped_refptr<MockConnection> connection_;
Ben Chancd477322014-10-17 14:19:30 -0700344 std::unique_ptr<HTTPRequest> request_;
Paul Stewart188a84a2012-01-20 16:28:15 -0800345 StrictMock<MockSockets> sockets_;
346 StrictMock<CallbackTarget> target_;
347 ByteString expected_response_;
348};
349
350TEST_F(HTTPRequestTest, Constructor) {
351 ExpectReset();
352}
353
354
355TEST_F(HTTPRequestTest, FailConnectNumericSynchronous) {
356 ExpectRouteRequest();
357 ExpectConnectFailure();
358 ExpectStop();
359 EXPECT_EQ(HTTPRequest::kResultConnectionFailure, StartRequest(kNumericURL));
360 ExpectReset();
361}
362
363TEST_F(HTTPRequestTest, FailConnectNumericAsynchronous) {
364 ExpectRouteRequest();
365 ExpectAsyncConnect(kServerAddress, HTTPURL::kDefaultHTTPPort, true);
366 EXPECT_EQ(HTTPRequest::kResultInProgress, StartRequest(kNumericURL));
367 ExpectResultCallback(HTTPRequest::kResultConnectionFailure);
368 ExpectStop();
369 CallConnectCompletion(false, -1);
370 ExpectReset();
371}
372
373TEST_F(HTTPRequestTest, FailConnectNumericTimeout) {
374 ExpectRouteRequest();
375 ExpectAsyncConnect(kServerAddress, HTTPURL::kDefaultHTTPPort, true);
376 EXPECT_EQ(HTTPRequest::kResultInProgress, StartRequest(kNumericURL));
377 ExpectResultCallback(HTTPRequest::kResultConnectionTimeout);
378 ExpectStop();
379 CallTimeoutTask();
380 ExpectReset();
381}
382
383TEST_F(HTTPRequestTest, SyncConnectNumeric) {
384 ExpectRouteRequest();
385 ExpectSyncConnect(kServerAddress, HTTPURL::kDefaultHTTPPort);
386 ExpectMonitorServerOutput();
387 EXPECT_EQ(HTTPRequest::kResultInProgress, StartRequest(kNumericURL));
388}
389
390TEST_F(HTTPRequestTest, FailDNSStart) {
391 ExpectRouteRequest();
392 ExpectDNSRequest(kTextSiteName, false);
393 ExpectStop();
394 EXPECT_EQ(HTTPRequest::kResultDNSFailure, StartRequest(kTextURL));
395 ExpectReset();
396}
397
398TEST_F(HTTPRequestTest, FailDNSFailure) {
399 ExpectRouteRequest();
400 ExpectDNSRequest(kTextSiteName, true);
401 EXPECT_EQ(HTTPRequest::kResultInProgress, StartRequest(kTextURL));
Paul Stewart188a84a2012-01-20 16:28:15 -0800402 ExpectResultCallback(HTTPRequest::kResultDNSFailure);
403 ExpectStop();
Paul Stewartbdb02e62012-02-22 16:24:33 -0800404 GetDNSResultFailure(DNSClient::kErrorNoData);
Paul Stewart188a84a2012-01-20 16:28:15 -0800405 ExpectReset();
406}
407
408TEST_F(HTTPRequestTest, FailDNSTimeout) {
409 ExpectRouteRequest();
410 ExpectDNSRequest(kTextSiteName, true);
411 EXPECT_EQ(HTTPRequest::kResultInProgress, StartRequest(kTextURL));
Paul Stewart188a84a2012-01-20 16:28:15 -0800412 ExpectResultCallback(HTTPRequest::kResultDNSTimeout);
413 ExpectStop();
Paul Stewartbdb02e62012-02-22 16:24:33 -0800414 const string error(DNSClient::kErrorTimedOut);
415 GetDNSResultFailure(error);
Paul Stewart188a84a2012-01-20 16:28:15 -0800416 ExpectReset();
417}
418
419TEST_F(HTTPRequestTest, FailConnectText) {
420 ExpectConnectFailure();
421 ExpectResultCallback(HTTPRequest::kResultConnectionFailure);
422 ExpectStop();
423 SetupConnect();
424 ExpectReset();
425}
426
427TEST_F(HTTPRequestTest, ConnectComplete) {
428 SetupConnectComplete();
429}
430
431TEST_F(HTTPRequestTest, RequestTimeout) {
432 SetupConnectComplete();
433 ExpectResultCallback(HTTPRequest::kResultRequestTimeout);
434 ExpectStop();
435 CallTimeoutTask();
436}
437
438TEST_F(HTTPRequestTest, RequestData) {
439 SetupConnectComplete();
440 EXPECT_EQ(0, FindInRequestData(string("GET ") + kPath));
441 EXPECT_NE(string::npos,
442 FindInRequestData(string("\r\nHost: ") + kTextSiteName));
443 ByteString request_data = GetRequestData();
444 EXPECT_CALL(sockets(), Send(kServerFD, _, request_data.GetLength(), 0))
445 .WillOnce(Return(request_data.GetLength() - 1));
446 ExpectSetInputTimeout();
447 WriteToServer(kServerFD);
448 EXPECT_CALL(sockets(), Send(kServerFD, _, 1, 0))
449 .WillOnce(Return(1));
450 ExpectMonitorServerInput();
451 WriteToServer(kServerFD);
452}
453
454TEST_F(HTTPRequestTest, ResponseTimeout) {
455 SetupConnectComplete();
456 ByteString request_data = GetRequestData();
457 EXPECT_CALL(sockets(), Send(kServerFD, _, request_data.GetLength(), 0))
458 .WillOnce(Return(request_data.GetLength()));
459 ExpectMonitorServerInput();
460 WriteToServer(kServerFD);
461 ExpectResultCallback(HTTPRequest::kResultResponseTimeout);
462 ExpectStop();
463 CallTimeoutTask();
464}
465
Paul Stewart5f06a0e2012-12-20 11:11:33 -0800466TEST_F(HTTPRequestTest, ResponseInputError) {
467 SetupConnectComplete();
468 ByteString request_data = GetRequestData();
469 EXPECT_CALL(sockets(), Send(kServerFD, _, request_data.GetLength(), 0))
470 .WillOnce(Return(request_data.GetLength()));
471 ExpectMonitorServerInput();
472 WriteToServer(kServerFD);
473 ExpectResultCallback(HTTPRequest::kResultResponseFailure);
474 ExpectStop();
475 CallServerErrorCallback();
476}
477
Paul Stewart188a84a2012-01-20 16:28:15 -0800478TEST_F(HTTPRequestTest, ResponseData) {
479 SetupConnectComplete();
480 const string response0("hello");
Paul Stewartbdb02e62012-02-22 16:24:33 -0800481 ExpectReadEventCallback(response0);
Paul Stewart188a84a2012-01-20 16:28:15 -0800482 ExpectSetInputTimeout();
483 ReadFromServer(response0);
484 ExpectInResponse(response0);
485
486 const string response1(" to you");
Paul Stewartbdb02e62012-02-22 16:24:33 -0800487 ExpectReadEventCallback(response0 + response1);
Paul Stewart188a84a2012-01-20 16:28:15 -0800488 ExpectSetInputTimeout();
489 ReadFromServer(response1);
490 ExpectInResponse(response1);
491
492 ExpectResultCallbackWithResponse(response0 + response1);
493 ExpectStop();
494 ReadFromServer("");
Paul Stewartbdb02e62012-02-22 16:24:33 -0800495 ExpectReset();
Paul Stewart188a84a2012-01-20 16:28:15 -0800496}
497
498} // namespace shill