Index: net/socket_stream/socket_stream_unittest.cc |
diff --git a/net/socket_stream/socket_stream_unittest.cc b/net/socket_stream/socket_stream_unittest.cc |
index 090ecff3a9402fc2c4403f708e99007363d1f500..80bff3ca39f7886116c3998a0d3f47460ffe0e6d 100644 |
--- a/net/socket_stream/socket_stream_unittest.cc |
+++ b/net/socket_stream/socket_stream_unittest.cc |
@@ -535,4 +535,109 @@ TEST_F(SocketStreamTest, SwitchAfterPending) { |
EXPECT_EQ(net::ERR_PROTOCOL_SWITCHED, events[1].error_code); |
} |
+// Test a connection though a secure proxy. |
+TEST_F(SocketStreamTest, SecureProxyConnectError) { |
+ MockClientSocketFactory mock_socket_factory; |
+ MockWrite data_writes[] = { |
+ MockWrite("CONNECT example.com:80 HTTP/1.1\r\n" |
+ "Host: example.com\r\n" |
+ "Proxy-Connection: keep-alive\r\n\r\n") |
+ }; |
+ MockRead data_reads[] = { |
+ MockRead("HTTP/1.1 200 Connection Established\r\n"), |
+ MockRead("Proxy-agent: Apache/2.2.8\r\n"), |
+ MockRead("\r\n"), |
+ // SocketStream::DoClose is run asynchronously. Socket can be read after |
+ // "\r\n". We have to give ERR_IO_PENDING to SocketStream then to indicate |
+ // server doesn't close the connection. |
+ MockRead(true, ERR_IO_PENDING) |
+ }; |
+ StaticSocketDataProvider data(data_reads, arraysize(data_reads), |
+ data_writes, arraysize(data_writes)); |
+ mock_socket_factory.AddSocketDataProvider(&data); |
+ SSLSocketDataProvider ssl(false, ERR_SSL_PROTOCOL_ERROR); |
+ mock_socket_factory.AddSSLSocketDataProvider(&ssl); |
+ |
+ TestCompletionCallback callback; |
+ |
+ scoped_ptr<SocketStreamEventRecorder> delegate( |
+ new SocketStreamEventRecorder(&callback)); |
+ delegate->SetOnConnected(base::Bind(&SocketStreamEventRecorder::DoClose, |
+ base::Unretained(delegate.get()))); |
+ |
+ scoped_refptr<SocketStream> socket_stream( |
+ new SocketStream(GURL("ws://example.com/demo"), delegate.get())); |
+ |
+ socket_stream->set_context(new TestURLRequestContext("https://myproxy:70")); |
+ MockHostResolver host_resolver; |
+ socket_stream->SetHostResolver(&host_resolver); |
+ socket_stream->SetClientSocketFactory(&mock_socket_factory); |
+ |
+ socket_stream->Connect(); |
+ |
+ callback.WaitForResult(); |
+ |
+ const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
+ ASSERT_EQ(3U, events.size()); |
+ |
+ EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
+ events[0].event_type); |
+ EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[1].event_type); |
+ EXPECT_EQ(net::ERR_SSL_PROTOCOL_ERROR, events[1].error_code); |
+ EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[2].event_type); |
+} |
+ |
+// Test a connection though a secure proxy. |
+TEST_F(SocketStreamTest, SecureProxyConnect) { |
+ MockClientSocketFactory mock_socket_factory; |
+ MockWrite data_writes[] = { |
+ MockWrite("CONNECT example.com:80 HTTP/1.1\r\n" |
+ "Host: example.com\r\n" |
+ "Proxy-Connection: keep-alive\r\n\r\n") |
+ }; |
+ MockRead data_reads[] = { |
+ MockRead("HTTP/1.1 200 Connection Established\r\n"), |
+ MockRead("Proxy-agent: Apache/2.2.8\r\n"), |
+ MockRead("\r\n"), |
+ // SocketStream::DoClose is run asynchronously. Socket can be read after |
+ // "\r\n". We have to give ERR_IO_PENDING to SocketStream then to indicate |
+ // server doesn't close the connection. |
+ MockRead(true, ERR_IO_PENDING) |
+ }; |
+ StaticSocketDataProvider data(data_reads, arraysize(data_reads), |
+ data_writes, arraysize(data_writes)); |
+ mock_socket_factory.AddSocketDataProvider(&data); |
+ SSLSocketDataProvider ssl(false, OK); |
+ mock_socket_factory.AddSSLSocketDataProvider(&ssl); |
+ |
+ TestCompletionCallback callback; |
+ |
+ scoped_ptr<SocketStreamEventRecorder> delegate( |
+ new SocketStreamEventRecorder(&callback)); |
+ delegate->SetOnConnected(base::Bind(&SocketStreamEventRecorder::DoClose, |
+ base::Unretained(delegate.get()))); |
+ |
+ scoped_refptr<SocketStream> socket_stream( |
+ new SocketStream(GURL("ws://example.com/demo"), delegate.get())); |
+ |
+ socket_stream->set_context(new TestURLRequestContext("https://myproxy:70")); |
+ MockHostResolver host_resolver; |
+ socket_stream->SetHostResolver(&host_resolver); |
+ socket_stream->SetClientSocketFactory(&mock_socket_factory); |
+ |
+ socket_stream->Connect(); |
+ |
+ callback.WaitForResult(); |
+ |
+ const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents(); |
+ ASSERT_EQ(4U, events.size()); |
+ |
+ EXPECT_EQ(SocketStreamEvent::EVENT_START_OPEN_CONNECTION, |
+ events[0].event_type); |
+ EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[1].event_type); |
+ EXPECT_EQ(SocketStreamEvent::EVENT_ERROR, events[2].event_type); |
+ EXPECT_EQ(net::ERR_ABORTED, events[2].error_code); |
+ EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[3].event_type); |
+} |
+ |
} // namespace net |