Chromium Code Reviews| 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 |