| 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
|
|
|