OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |