spdy_stream_test_util.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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( 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<SpdyStream>& stream) : stream_(stream) {} 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ClosingDelegate::~ClosingDelegate() {} 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SpdySendStatus ClosingDelegate::OnSendHeadersComplete() { 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NO_MORE_DATA_TO_SEND; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ClosingDelegate::OnSendBody() { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return OK; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SpdySendStatus ClosingDelegate::OnSendBodyComplete(size_t /*bytes_sent*/) { 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NO_MORE_DATA_TO_SEND; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ClosingDelegate::OnResponseReceived(const SpdyHeaderBlock& response, 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time response_time, 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int status) { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return OK; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ClosingDelegate::OnHeadersSent() {} 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int ClosingDelegate::OnDataReceived(scoped_ptr<SpdyBuffer> buffer) { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return OK; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ClosingDelegate::OnDataSent(size_t bytes_sent) {} 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ClosingDelegate::OnClose(int status) { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (stream_) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stream_->Close(); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stream_ = NULL; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StreamDelegateBase::StreamDelegateBase( 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<SpdyStream>& stream) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : stream_(stream), 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_headers_completed_(false), 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers_sent_(0), 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_sent_(0) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StreamDelegateBase::~StreamDelegateBase() { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SpdySendStatus StreamDelegateBase::OnSendHeadersComplete() { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_headers_completed_ = true; 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NO_MORE_DATA_TO_SEND; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int StreamDelegateBase::OnResponseReceived(const SpdyHeaderBlock& response, 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time response_time, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int status) { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(send_headers_completed_); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) response_ = response; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return status; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void StreamDelegateBase::OnHeadersSent() { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) headers_sent_++; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int StreamDelegateBase::OnDataReceived(scoped_ptr<SpdyBuffer> buffer) { 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (buffer) 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) received_data_queue_.Enqueue(buffer.Pass()); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return OK; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void StreamDelegateBase::OnDataSent(size_t bytes_sent) { 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data_sent_ += bytes_sent; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void StreamDelegateBase::OnClose(int status) { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!stream_) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stream_ = NULL; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback_.callback().Run(status); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int StreamDelegateBase::WaitForClose() { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int result = callback_.WaitForResult(); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(!stream_.get()); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string StreamDelegateBase::TakeReceivedData() { 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t len = received_data_queue_.GetTotalSize(); 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string received_data(len, '\0'); 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (len > 0) { 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ( 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) len, 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) received_data_queue_.Dequeue(string_as_array(&received_data), len)); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return received_data; 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string StreamDelegateBase::GetResponseHeaderValue( 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& name) const { 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyHeaderBlock::const_iterator it = response_.find(name); 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return (it == response_.end()) ? std::string() : it->second; 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StreamDelegateSendImmediate::StreamDelegateSendImmediate( 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<SpdyStream>& stream, 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<SpdyHeaderBlock> headers, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPiece data) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : StreamDelegateBase(stream), 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) headers_(headers.Pass()), 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data_(data) {} 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StreamDelegateSendImmediate::~StreamDelegateSendImmediate() { 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int StreamDelegateSendImmediate::OnSendBody() { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "OnSendBody should not be called"; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ERR_UNEXPECTED; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SpdySendStatus StreamDelegateSendImmediate::OnSendBodyComplete( 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t /*bytes_sent*/) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "OnSendBodyComplete should not be called"; 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NO_MORE_DATA_TO_SEND; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int StreamDelegateSendImmediate::OnResponseReceived( 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SpdyHeaderBlock& response, 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time response_time, 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int status) { 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status = 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StreamDelegateBase::OnResponseReceived(response, response_time, status); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (headers_.get()) { 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stream()->QueueHeaders(headers_.Pass()); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (data_.data()) { 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<StringIOBuffer> buf(new StringIOBuffer(data_.as_string())); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stream()->QueueStreamData(buf, buf->size(), DATA_FLAG_NONE); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return status; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StreamDelegateWithBody::StreamDelegateWithBody( 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<SpdyStream>& stream, 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPiece data) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : StreamDelegateBase(stream), 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buf_(new DrainableIOBuffer(new StringIOBuffer(data.as_string()), 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data.size())), 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) body_data_sent_(0) {} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StreamDelegateWithBody::~StreamDelegateWithBody() { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int StreamDelegateWithBody::OnSendBody() { 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stream()->QueueStreamData(buf_.get(), buf_->BytesRemaining(), 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DATA_FLAG_NONE); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ERR_IO_PENDING; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SpdySendStatus StreamDelegateWithBody::OnSendBodyComplete(size_t bytes_sent) { 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_GT(bytes_sent, 0u); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) buf_->DidConsume(bytes_sent); 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) body_data_sent_ += bytes_sent; 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (buf_->BytesRemaining() > 0) { 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Go back to OnSendBody() to send the remaining data. 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return MORE_DATA_TO_SEND; 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NO_MORE_DATA_TO_SEND; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace test 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 193