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