summaryrefslogtreecommitdiffstats
path: root/net/socket_stream/socket_stream_unittest.cc
diff options
context:
space:
mode:
authorukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-21 03:11:47 +0000
committerukai@chromium.org <ukai@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-21 03:11:47 +0000
commitba1161fab422b5a0d35c715c6082e1a4c412e44d (patch)
tree0000488cfd994888d9c0300317323a918a622774 /net/socket_stream/socket_stream_unittest.cc
parente1791eb5f5b9043c8bad12509deb7db687073755 (diff)
downloadchromium_src-ba1161fab422b5a0d35c715c6082e1a4c412e44d.zip
chromium_src-ba1161fab422b5a0d35c715c6082e1a4c412e44d.tar.gz
chromium_src-ba1161fab422b5a0d35c715c6082e1a4c412e44d.tar.bz2
SocketStream::Close() disconnect the socket after all pending data sent.
SocketStream::Close() immediately disconnected the socket even if it has some data to be sent. It is not desired behavior. Change to that Close() just requests to close the socket, and when all pending data have been processed, close the socket. BUG=none TEST=net_unittests passes Review URL: http://codereview.chromium.org/2066011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@47880 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/socket_stream/socket_stream_unittest.cc')
-rw-r--r--net/socket_stream/socket_stream_unittest.cc132
1 files changed, 132 insertions, 0 deletions
diff --git a/net/socket_stream/socket_stream_unittest.cc b/net/socket_stream/socket_stream_unittest.cc
index b3bdbbe..d32654a 100644
--- a/net/socket_stream/socket_stream_unittest.cc
+++ b/net/socket_stream/socket_stream_unittest.cc
@@ -147,8 +147,140 @@ class SocketStreamEventRecorder : public net::SocketStream::Delegate {
namespace net {
class SocketStreamTest : public PlatformTest {
+ public:
+ virtual ~SocketStreamTest() {}
+ virtual void SetUp() {
+ mock_socket_factory_.reset();
+ handshake_request_ = kWebSocketHandshakeRequest;
+ handshake_response_ = kWebSocketHandshakeResponse;
+ }
+ virtual void TearDown() {
+ mock_socket_factory_.reset();
+ }
+
+ virtual void SetWebSocketHandshakeMessage(
+ const char* request, const char* response) {
+ handshake_request_ = request;
+ handshake_response_ = response;
+ }
+ virtual void AddWebSocketMessage(const std::string& message) {
+ messages_.push_back(message);
+ }
+
+ virtual MockClientSocketFactory* GetMockClientSocketFactory() {
+ mock_socket_factory_.reset(new MockClientSocketFactory);
+ return mock_socket_factory_.get();
+ }
+
+ virtual void DoSendWebSocketHandshake(SocketStreamEvent* event) {
+ event->socket->SendData(
+ handshake_request_.data(), handshake_request_.size());
+ }
+
+ virtual void DoCloseFlushPendingWriteTest(SocketStreamEvent* event) {
+ // handshake response received.
+ for (size_t i = 0; i < messages_.size(); i++) {
+ std::vector<char> frame;
+ frame.push_back('\0');
+ frame.insert(frame.end(), messages_[i].begin(), messages_[i].end());
+ frame.push_back('\xff');
+ EXPECT_TRUE(event->socket->SendData(&frame[0], frame.size()));
+ }
+ // Actual ClientSocket close must happen after all frames queued by
+ // SendData above are sent out.
+ event->socket->Close();
+ }
+
+ static const char* kWebSocketHandshakeRequest;
+ static const char* kWebSocketHandshakeResponse;
+
+ private:
+ std::string handshake_request_;
+ std::string handshake_response_;
+ std::vector<std::string> messages_;
+
+ scoped_ptr<MockClientSocketFactory> mock_socket_factory_;
};
+const char* SocketStreamTest::kWebSocketHandshakeRequest =
+ "GET /demo HTTP/1.1\r\n"
+ "Host: example.com\r\n"
+ "Connection: Upgrade\r\n"
+ "Sec-WebSocket-Key2: 12998 5 Y3 1 .P00\r\n"
+ "Sec-WebSocket-Protocol: sample\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5\r\n"
+ "Origin: http://example.com\r\n"
+ "\r\n"
+ "^n:ds[4U";
+
+const char* SocketStreamTest::kWebSocketHandshakeResponse =
+ "HTTP/1.1 101 WebSocket Protocol Handshake\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Connection: Upgrade\r\n"
+ "Sec-WebSocket-Origin: http://example.com\r\n"
+ "Sec-WebSocket-Location: ws://example.com/demo\r\n"
+ "Sec-WebSocket-Protocol: sample\r\n"
+ "\r\n"
+ "8jKS'y:G*Co,Wxa-";
+
+TEST_F(SocketStreamTest, CloseFlushPendingWrite) {
+ TestCompletionCallback callback;
+
+ scoped_ptr<SocketStreamEventRecorder> delegate(
+ new SocketStreamEventRecorder(&callback));
+ // Necessary for NewCallback.
+ SocketStreamTest* test = this;
+ delegate->SetOnConnected(NewCallback(
+ test, &SocketStreamTest::DoSendWebSocketHandshake));
+ delegate->SetOnReceivedData(NewCallback(
+ test, &SocketStreamTest::DoCloseFlushPendingWriteTest));
+
+ scoped_refptr<SocketStream> socket_stream =
+ new SocketStream(GURL("ws://example.com/demo"), delegate.get());
+
+ socket_stream->set_context(new TestURLRequestContext());
+ socket_stream->SetHostResolver(new MockHostResolver());
+
+ MockWrite data_writes[] = {
+ MockWrite(SocketStreamTest::kWebSocketHandshakeRequest),
+ MockWrite(true, "\0message1\xff", 10),
+ MockWrite(true, "\0message2\xff", 10)
+ };
+ MockRead data_reads[] = {
+ MockRead(SocketStreamTest::kWebSocketHandshakeResponse),
+ // Server doesn't close the connection after handshake.
+ MockRead(true, ERR_IO_PENDING)
+ };
+ AddWebSocketMessage("message1");
+ AddWebSocketMessage("message2");
+
+ scoped_refptr<DelayedSocketData> data_provider(
+ new DelayedSocketData(1,
+ data_reads, arraysize(data_reads),
+ data_writes, arraysize(data_writes)));
+
+ MockClientSocketFactory* mock_socket_factory =
+ GetMockClientSocketFactory();
+ mock_socket_factory->AddSocketDataProvider(data_provider.get());
+
+ socket_stream->SetClientSocketFactory(mock_socket_factory);
+
+ socket_stream->Connect();
+
+ callback.WaitForResult();
+
+ const std::vector<SocketStreamEvent>& events = delegate->GetSeenEvents();
+ EXPECT_EQ(6U, events.size());
+
+ EXPECT_EQ(SocketStreamEvent::EVENT_CONNECTED, events[0].event_type);
+ EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[1].event_type);
+ EXPECT_EQ(SocketStreamEvent::EVENT_RECEIVED_DATA, events[2].event_type);
+ EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[3].event_type);
+ EXPECT_EQ(SocketStreamEvent::EVENT_SENT_DATA, events[4].event_type);
+ EXPECT_EQ(SocketStreamEvent::EVENT_CLOSE, events[5].event_type);
+}
+
TEST_F(SocketStreamTest, BasicAuthProxy) {
MockClientSocketFactory mock_socket_factory;
MockWrite data_writes1[] = {