Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(647)

Side by Side Diff: net/socket_stream/socket_stream_unittest.cc

Issue 6474012: Create a path to deliver SocketStream errors to the renderer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add unit test and test_shell code Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <string> 5 #include <string>
6 #include <vector> 6 #include <vector>
7 7
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/utf_string_conversions.h" 9 #include "base/utf_string_conversions.h"
10 #include "net/base/auth.h" 10 #include "net/base/auth.h"
11 #include "net/base/mock_host_resolver.h" 11 #include "net/base/mock_host_resolver.h"
12 #include "net/base/net_errors.h"
12 #include "net/base/net_log.h" 13 #include "net/base/net_log.h"
13 #include "net/base/net_log_unittest.h" 14 #include "net/base/net_log_unittest.h"
14 #include "net/base/test_completion_callback.h" 15 #include "net/base/test_completion_callback.h"
15 #include "net/socket/socket_test_util.h" 16 #include "net/socket/socket_test_util.h"
16 #include "net/socket_stream/socket_stream.h" 17 #include "net/socket_stream/socket_stream.h"
17 #include "net/url_request/url_request_test_util.h" 18 #include "net/url_request/url_request_test_util.h"
18 #include "testing/gtest/include/gtest/gtest.h" 19 #include "testing/gtest/include/gtest/gtest.h"
19 #include "testing/platform_test.h" 20 #include "testing/platform_test.h"
20 21
21 struct SocketStreamEvent { 22 struct SocketStreamEvent {
22 enum EventType { 23 enum EventType {
23 EVENT_CONNECTED, EVENT_SENT_DATA, EVENT_RECEIVED_DATA, EVENT_CLOSE, 24 EVENT_CONNECTED, EVENT_SENT_DATA, EVENT_RECEIVED_DATA, EVENT_CLOSE,
24 EVENT_AUTH_REQUIRED, 25 EVENT_AUTH_REQUIRED, EVENT_ERROR,
25 }; 26 };
26 27
27 SocketStreamEvent(EventType type, net::SocketStream* socket_stream, 28 SocketStreamEvent(EventType type, net::SocketStream* socket_stream,
28 int num, const std::string& str, 29 int num, const std::string& str,
29 net::AuthChallengeInfo* auth_challenge_info) 30 net::AuthChallengeInfo* auth_challenge_info)
30 : event_type(type), socket(socket_stream), number(num), data(str), 31 : event_type(type), socket(socket_stream), number(num), data(str),
31 auth_info(auth_challenge_info) {} 32 auth_info(auth_challenge_info) {}
32 33
33 EventType event_type; 34 EventType event_type;
34 net::SocketStream* socket; 35 net::SocketStream* socket;
35 int number; 36 int number;
36 std::string data; 37 std::string data;
37 scoped_refptr<net::AuthChallengeInfo> auth_info; 38 scoped_refptr<net::AuthChallengeInfo> auth_info;
38 }; 39 };
39 40
40 class SocketStreamEventRecorder : public net::SocketStream::Delegate { 41 class SocketStreamEventRecorder : public net::SocketStream::Delegate {
41 public: 42 public:
42 explicit SocketStreamEventRecorder(net::CompletionCallback* callback) 43 explicit SocketStreamEventRecorder(net::CompletionCallback* callback)
43 : on_connected_(NULL), 44 : on_connected_(NULL),
44 on_sent_data_(NULL), 45 on_sent_data_(NULL),
45 on_received_data_(NULL), 46 on_received_data_(NULL),
46 on_close_(NULL), 47 on_close_(NULL),
47 on_auth_required_(NULL), 48 on_auth_required_(NULL),
49 on_error_(NULL),
48 callback_(callback) {} 50 callback_(callback) {}
49 virtual ~SocketStreamEventRecorder() { 51 virtual ~SocketStreamEventRecorder() {
50 delete on_connected_; 52 delete on_connected_;
51 delete on_sent_data_; 53 delete on_sent_data_;
52 delete on_received_data_; 54 delete on_received_data_;
53 delete on_close_; 55 delete on_close_;
54 delete on_auth_required_; 56 delete on_auth_required_;
57 delete on_error_;
55 } 58 }
56 59
57 void SetOnConnected(Callback1<SocketStreamEvent*>::Type* callback) { 60 void SetOnConnected(Callback1<SocketStreamEvent*>::Type* callback) {
58 on_connected_ = callback; 61 on_connected_ = callback;
59 } 62 }
60 void SetOnSentData(Callback1<SocketStreamEvent*>::Type* callback) { 63 void SetOnSentData(Callback1<SocketStreamEvent*>::Type* callback) {
61 on_sent_data_ = callback; 64 on_sent_data_ = callback;
62 } 65 }
63 void SetOnReceivedData(Callback1<SocketStreamEvent*>::Type* callback) { 66 void SetOnReceivedData(Callback1<SocketStreamEvent*>::Type* callback) {
64 on_received_data_ = callback; 67 on_received_data_ = callback;
65 } 68 }
66 void SetOnClose(Callback1<SocketStreamEvent*>::Type* callback) { 69 void SetOnClose(Callback1<SocketStreamEvent*>::Type* callback) {
67 on_close_ = callback; 70 on_close_ = callback;
68 } 71 }
69 void SetOnAuthRequired(Callback1<SocketStreamEvent*>::Type* callback) { 72 void SetOnAuthRequired(Callback1<SocketStreamEvent*>::Type* callback) {
70 on_auth_required_ = callback; 73 on_auth_required_ = callback;
71 } 74 }
75 void SetOnError(Callback1<SocketStreamEvent*>::Type* callback) {
76 on_error_ = callback;
77 }
72 78
73 virtual void OnConnected(net::SocketStream* socket, 79 virtual void OnConnected(net::SocketStream* socket,
74 int num_pending_send_allowed) { 80 int num_pending_send_allowed) {
75 events_.push_back( 81 events_.push_back(
76 SocketStreamEvent(SocketStreamEvent::EVENT_CONNECTED, 82 SocketStreamEvent(SocketStreamEvent::EVENT_CONNECTED,
77 socket, num_pending_send_allowed, std::string(), 83 socket, num_pending_send_allowed, std::string(),
78 NULL)); 84 NULL));
79 if (on_connected_) 85 if (on_connected_)
80 on_connected_->Run(&events_.back()); 86 on_connected_->Run(&events_.back());
81 } 87 }
(...skipping 23 matching lines...) Expand all
105 callback_->Run(net::OK); 111 callback_->Run(net::OK);
106 } 112 }
107 virtual void OnAuthRequired(net::SocketStream* socket, 113 virtual void OnAuthRequired(net::SocketStream* socket,
108 net::AuthChallengeInfo* auth_info) { 114 net::AuthChallengeInfo* auth_info) {
109 events_.push_back( 115 events_.push_back(
110 SocketStreamEvent(SocketStreamEvent::EVENT_AUTH_REQUIRED, 116 SocketStreamEvent(SocketStreamEvent::EVENT_AUTH_REQUIRED,
111 socket, 0, std::string(), auth_info)); 117 socket, 0, std::string(), auth_info));
112 if (on_auth_required_) 118 if (on_auth_required_)
113 on_auth_required_->Run(&events_.back()); 119 on_auth_required_->Run(&events_.back());
114 } 120 }
121 virtual void OnError(const net::SocketStream* const_socket, int error) {
122 // TODO(yutak): Need to figure out a way to create SocketStreamEvent
ukai 2011/05/10 08:10:39 can't we const net::SocketStream* socket in Socket
Yuta Kitamura 2011/05/10 09:01:22 No, because there are several uses of non-const me
ukai 2011/05/10 10:00:29 Hmm. then I think SocketStreamEvent should have ne
123 // with |const net::SocketStream*|.
124 net::SocketStream* socket = const_cast<net::SocketStream*>(const_socket);
125 events_.push_back(
126 SocketStreamEvent(SocketStreamEvent::EVENT_ERROR,
127 socket, error, std::string(), NULL));
128 if (on_error_)
129 on_error_->Run(&events_.back());
130 }
115 131
116 void DoClose(SocketStreamEvent* event) { 132 void DoClose(SocketStreamEvent* event) {
117 event->socket->Close(); 133 event->socket->Close();
118 } 134 }
119 void DoRestartWithAuth(SocketStreamEvent* event) { 135 void DoRestartWithAuth(SocketStreamEvent* event) {
120 VLOG(1) << "RestartWithAuth username=" << username_ 136 VLOG(1) << "RestartWithAuth username=" << username_
121 << " password=" << password_; 137 << " password=" << password_;
122 event->socket->RestartWithAuth(username_, password_); 138 event->socket->RestartWithAuth(username_, password_);
123 } 139 }
124 void SetAuthInfo(const string16& username, 140 void SetAuthInfo(const string16& username,
125 const string16& password) { 141 const string16& password) {
126 username_ = username; 142 username_ = username;
127 password_ = password; 143 password_ = password;
128 } 144 }
129 145
130 const std::vector<SocketStreamEvent>& GetSeenEvents() const { 146 const std::vector<SocketStreamEvent>& GetSeenEvents() const {
131 return events_; 147 return events_;
132 } 148 }
133 149
134 private: 150 private:
135 std::vector<SocketStreamEvent> events_; 151 std::vector<SocketStreamEvent> events_;
136 Callback1<SocketStreamEvent*>::Type* on_connected_; 152 Callback1<SocketStreamEvent*>::Type* on_connected_;
137 Callback1<SocketStreamEvent*>::Type* on_sent_data_; 153 Callback1<SocketStreamEvent*>::Type* on_sent_data_;
138 Callback1<SocketStreamEvent*>::Type* on_received_data_; 154 Callback1<SocketStreamEvent*>::Type* on_received_data_;
139 Callback1<SocketStreamEvent*>::Type* on_close_; 155 Callback1<SocketStreamEvent*>::Type* on_close_;
140 Callback1<SocketStreamEvent*>::Type* on_auth_required_; 156 Callback1<SocketStreamEvent*>::Type* on_auth_required_;
157 Callback1<SocketStreamEvent*>::Type* on_error_;
141 net::CompletionCallback* callback_; 158 net::CompletionCallback* callback_;
142 159
143 string16 username_; 160 string16 username_;
144 string16 password_; 161 string16 password_;
145 162
146 DISALLOW_COPY_AND_ASSIGN(SocketStreamEventRecorder); 163 DISALLOW_COPY_AND_ASSIGN(SocketStreamEventRecorder);
147 }; 164 };
148 165
149 namespace net { 166 namespace net {
150 167
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 GetMockClientSocketFactory(); 285 GetMockClientSocketFactory();
269 mock_socket_factory->AddSocketDataProvider(data_provider.get()); 286 mock_socket_factory->AddSocketDataProvider(data_provider.get());
270 287
271 socket_stream->SetClientSocketFactory(mock_socket_factory); 288 socket_stream->SetClientSocketFactory(mock_socket_factory);
272 289
273 socket_stream->Connect(); 290 socket_stream->Connect();
274 291
275 callback.WaitForResult(); 292 callback.WaitForResult();
276 293
277 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); 294 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents();
278 EXPECT_EQ(6U, events.size()); 295 EXPECT_EQ(7U, events.size());
279 296
280 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[0].event_type); 297 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[0].event_type);
281 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[1].event_type); 298 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[1].event_type);
282 EXPECT_EQ(SocketStreamEvent::EVENT_RECEIVED_DATA, events[2].event_type); 299 EXPECT_EQ(SocketStreamEvent::EVENT_RECEIVED_DATA, events[2].event_type);
283 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[3].event_type); 300 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[3].event_type);
284 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[4].event_type); 301 EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[4].event_type);
285 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[5].event_type); 302 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[5].event_type);
303 EXPECT_EQ(ERR_CONNECTION_CLOSED, events[5].number);
304 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[6].event_type);
286 } 305 }
287 306
288 TEST_F(SocketStreamTest, BasicAuthProxy) { 307 TEST_F(SocketStreamTest, BasicAuthProxy) {
289 MockClientSocketFactory mock_socket_factory; 308 MockClientSocketFactory mock_socket_factory;
290 MockWrite data_writes1[] = { 309 MockWrite data_writes1[] = {
291 MockWrite("CONNECT example.com:80 HTTP/1.1\r\n" 310 MockWrite("CONNECT example.com:80 HTTP/1.1\r\n"
292 "Host: example.com\r\n" 311 "Host: example.com\r\n"
293 "Proxy-Connection: keep-alive\r\n\r\n"), 312 "Proxy-Connection: keep-alive\r\n\r\n"),
294 }; 313 };
295 MockRead data_reads1[] = { 314 MockRead data_reads1[] = {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 socket_stream->set_context(new TestURLRequestContext("myproxy:70")); 356 socket_stream->set_context(new TestURLRequestContext("myproxy:70"));
338 MockHostResolver host_resolver; 357 MockHostResolver host_resolver;
339 socket_stream->SetHostResolver(&host_resolver); 358 socket_stream->SetHostResolver(&host_resolver);
340 socket_stream->SetClientSocketFactory(&mock_socket_factory); 359 socket_stream->SetClientSocketFactory(&mock_socket_factory);
341 360
342 socket_stream->Connect(); 361 socket_stream->Connect();
343 362
344 callback.WaitForResult(); 363 callback.WaitForResult();
345 364
346 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); 365 const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents();
347 EXPECT_EQ(3U, events.size()); 366 EXPECT_EQ(4U, events.size());
348 367
349 EXPECT_EQ(SocketStreamEvent::EVENT_AUTH_REQUIRED, events[0].event_type); 368 EXPECT_EQ(SocketStreamEvent::EVENT_AUTH_REQUIRED, events[0].event_type);
350 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); 369 EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type);
351 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[2].event_type); 370 EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[2].event_type);
371 EXPECT_EQ(ERR_ABORTED, events[2].number);
372 EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[3].event_type);
352 373
353 // TODO(eroman): Add back NetLogTest here... 374 // TODO(eroman): Add back NetLogTest here...
354 } 375 }
355 376
356 } // namespace net 377 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698