X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fnet%2Fspdy%2Fspdy_websocket_stream_unittest.cc;h=1813947dc1925737d84a190f143e88bdc36bbfeb;hb=ff3e2503a20db9193d323c1d19c38c68004dec4a;hp=3c1b3cb76261d20a63f60e0389eda6b25d30a36e;hpb=7338fba38ba696536d1cc9d389afd716a6ab2fe6;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/net/spdy/spdy_websocket_stream_unittest.cc b/src/net/spdy/spdy_websocket_stream_unittest.cc index 3c1b3cb..1813947 100644 --- a/src/net/spdy/spdy_websocket_stream_unittest.cc +++ b/src/net/spdy/spdy_websocket_stream_unittest.cc @@ -235,6 +235,12 @@ class SpdyWebSocketStreamTest kClosingFrameLength, stream_id_, false)); + + closing_frame_fin_.reset(spdy_util_.ConstructSpdyWebSocketDataFrame( + kClosingFrame, + kClosingFrameLength, + stream_id_, + true)); } void InitSession(MockRead* reads, size_t reads_count, @@ -273,6 +279,7 @@ class SpdyWebSocketStreamTest scoped_ptr response_frame_; scoped_ptr message_frame_; scoped_ptr closing_frame_; + scoped_ptr closing_frame_fin_; HostPortPair host_port_pair_; SpdySessionKey spdy_session_key_; TestCompletionCallback completion_callback_; @@ -375,6 +382,62 @@ TEST_P(SpdyWebSocketStreamTest, Basic) { EXPECT_TRUE(data()->at_write_eof()); } +// A SPDY websocket may still send it's close frame after +// recieving a close with SPDY stream FIN. +TEST_P(SpdyWebSocketStreamTest, RemoteCloseWithFin) { + Prepare(1); + MockWrite writes[] = { + CreateMockWrite(*request_frame_.get(), 1), + CreateMockWrite(*closing_frame_.get(), 4), + }; + MockRead reads[] = { + CreateMockRead(*response_frame_.get(), 2), + CreateMockRead(*closing_frame_fin_.get(), 3), + MockRead(SYNCHRONOUS, 0, 5) // EOF cause OnCloseSpdyStream event. + }; + InitSession(reads, arraysize(reads), writes, arraysize(writes)); + + SpdyWebSocketStreamEventRecorder delegate(completion_callback_.callback()); + delegate.SetOnReceivedData( + base::Bind(&SpdyWebSocketStreamTest::DoSendClosingFrame, + base::Unretained(this))); + + websocket_stream_.reset(new SpdyWebSocketStream(session_, &delegate)); + BoundNetLog net_log; + GURL url("ws://example.com/echo"); + ASSERT_EQ(OK, websocket_stream_->InitializeStream(url, HIGHEST, net_log)); + + SendRequest(); + completion_callback_.WaitForResult(); + websocket_stream_.reset(); + + const std::vector& events = + delegate.GetSeenEvents(); + EXPECT_EQ(5U, events.size()); + + EXPECT_EQ(SpdyWebSocketStreamEvent::EVENT_SENT_HEADERS, + events[0].event_type); + EXPECT_EQ(OK, events[0].result); + EXPECT_EQ(SpdyWebSocketStreamEvent::EVENT_RECEIVED_HEADER, + events[1].event_type); + EXPECT_EQ(OK, events[1].result); + EXPECT_EQ(SpdyWebSocketStreamEvent::EVENT_RECEIVED_DATA, + events[2].event_type); + EXPECT_EQ(static_cast(kClosingFrameLength), events[2].result); + EXPECT_EQ(SpdyWebSocketStreamEvent::EVENT_SENT_DATA, + events[3].event_type); + EXPECT_EQ(static_cast(kClosingFrameLength), events[3].result); + EXPECT_EQ(SpdyWebSocketStreamEvent::EVENT_CLOSE, + events[4].event_type); + EXPECT_EQ(OK, events[4].result); + + // EOF closes SPDY session. + EXPECT_FALSE( + HasSpdySession(http_session_->spdy_session_pool(), spdy_session_key_)); + EXPECT_TRUE(data()->at_read_eof()); + EXPECT_TRUE(data()->at_write_eof()); +} + TEST_P(SpdyWebSocketStreamTest, DestructionBeforeClose) { Prepare(1); MockWrite writes[] = {