15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/spdy_stream_test_util.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <cstddef> 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/stl_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/completion_callback.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/spdy_stream.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ClosingDelegate::ClosingDelegate( 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::WeakPtr<SpdyStream>& stream) : stream_(stream) { 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(stream_); 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ClosingDelegate::~ClosingDelegate() {} 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ClosingDelegate::OnRequestHeadersSent() {} 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSpdyResponseHeadersStatus ClosingDelegate::OnResponseHeadersUpdated( 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const SpdyHeaderBlock& response_headers) { 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return RESPONSE_HEADERS_ARE_COMPLETE; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ClosingDelegate::OnDataReceived(scoped_ptr<SpdyBuffer> buffer) {} 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void ClosingDelegate::OnDataSent() {} 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ClosingDelegate::OnClose(int status) { 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(stream_); 38a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) stream_->Close(); 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The |stream_| may still be alive (if it is our delegate). 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StreamDelegateBase::StreamDelegateBase( 43a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const base::WeakPtr<SpdyStream>& stream) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : stream_(stream), 45a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) stream_id_(0), 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) send_headers_completed_(false) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StreamDelegateBase::~StreamDelegateBase() { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void StreamDelegateBase::OnRequestHeadersSent() { 53a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) stream_id_ = stream_->stream_id(); 54a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_NE(stream_id_, 0u); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_headers_completed_ = true; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSpdyResponseHeadersStatus StreamDelegateBase::OnResponseHeadersUpdated( 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const SpdyHeaderBlock& response_headers) { 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(stream_->type() != SPDY_PUSH_STREAM, send_headers_completed_); 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch response_headers_ = response_headers; 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return RESPONSE_HEADERS_ARE_COMPLETE; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid StreamDelegateBase::OnDataReceived(scoped_ptr<SpdyBuffer> buffer) { 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (buffer) 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) received_data_queue_.Enqueue(buffer.Pass()); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void StreamDelegateBase::OnDataSent() {} 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void StreamDelegateBase::OnClose(int status) { 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!stream_.get()) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 75a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) stream_id_ = stream_->stream_id(); 76a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) stream_.reset(); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback_.callback().Run(status); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int StreamDelegateBase::WaitForClose() { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result = callback_.WaitForResult(); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(!stream_.get()); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string StreamDelegateBase::TakeReceivedData() { 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t len = received_data_queue_.GetTotalSize(); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string received_data(len, '\0'); 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (len > 0) { 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ( 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) len, 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) received_data_queue_.Dequeue(string_as_array(&received_data), len)); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return received_data; 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string StreamDelegateBase::GetResponseHeaderValue( 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& name) const { 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SpdyHeaderBlock::const_iterator it = response_headers_.find(name); 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return (it == response_headers_.end()) ? std::string() : it->second; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 103a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)StreamDelegateDoNothing::StreamDelegateDoNothing( 104a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const base::WeakPtr<SpdyStream>& stream) 105a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) : StreamDelegateBase(stream) {} 106a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 107a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)StreamDelegateDoNothing::~StreamDelegateDoNothing() { 108a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 109a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StreamDelegateSendImmediate::StreamDelegateSendImmediate( 111a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const base::WeakPtr<SpdyStream>& stream, 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPiece data) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : StreamDelegateBase(stream), 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_(data) {} 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StreamDelegateSendImmediate::~StreamDelegateSendImmediate() { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochSpdyResponseHeadersStatus StreamDelegateSendImmediate::OnResponseHeadersUpdated( 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const SpdyHeaderBlock& response_headers) { 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SpdyResponseHeadersStatus status = 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch StreamDelegateBase::OnResponseHeadersUpdated(response_headers); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (data_.data()) { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<StringIOBuffer> buf(new StringIOBuffer(data_.as_string())); 125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) stream()->SendData(buf.get(), buf->size(), MORE_DATA_TO_SEND); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return status; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StreamDelegateWithBody::StreamDelegateWithBody( 131a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const base::WeakPtr<SpdyStream>& stream, 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPiece data) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : StreamDelegateBase(stream), 13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) buf_(new StringIOBuffer(data.as_string())) {} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StreamDelegateWithBody::~StreamDelegateWithBody() { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void StreamDelegateWithBody::OnRequestHeadersSent() { 14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) StreamDelegateBase::OnRequestHeadersSent(); 14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) stream()->SendData(buf_.get(), buf_->size(), NO_MORE_DATA_TO_SEND); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 144116680a4aac90f2aa7413d9095a592090648e557Ben MurdochStreamDelegateCloseOnHeaders::StreamDelegateCloseOnHeaders( 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::WeakPtr<SpdyStream>& stream) 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : StreamDelegateBase(stream) { 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 149116680a4aac90f2aa7413d9095a592090648e557Ben MurdochStreamDelegateCloseOnHeaders::~StreamDelegateCloseOnHeaders() { 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 152116680a4aac90f2aa7413d9095a592090648e557Ben MurdochSpdyResponseHeadersStatus 153116680a4aac90f2aa7413d9095a592090648e557Ben MurdochStreamDelegateCloseOnHeaders::OnResponseHeadersUpdated( 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const SpdyHeaderBlock& response_headers) { 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch stream()->Cancel(); 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return RESPONSE_HEADERS_ARE_COMPLETE; 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace test 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 162