spdy_stream_test_util.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/spdy/spdy_stream_test_util.h"
6
7#include <cstddef>
8
9#include "base/stl_util.h"
10#include "net/base/completion_callback.h"
11#include "net/spdy/spdy_stream.h"
12#include "testing/gtest/include/gtest/gtest.h"
13
14namespace net {
15
16namespace test {
17
18ClosingDelegate::ClosingDelegate(
19    const scoped_refptr<SpdyStream>& stream) : stream_(stream) {}
20
21ClosingDelegate::~ClosingDelegate() {}
22
23SpdySendStatus ClosingDelegate::OnSendHeadersComplete() {
24  return NO_MORE_DATA_TO_SEND;
25}
26
27int ClosingDelegate::OnSendBody() {
28  return OK;
29}
30
31SpdySendStatus ClosingDelegate::OnSendBodyComplete(size_t /*bytes_sent*/) {
32  return NO_MORE_DATA_TO_SEND;
33}
34
35int ClosingDelegate::OnResponseReceived(const SpdyHeaderBlock& response,
36                                        base::Time response_time,
37                                        int status) {
38  return OK;
39}
40
41void ClosingDelegate::OnHeadersSent() {}
42
43int ClosingDelegate::OnDataReceived(scoped_ptr<SpdyBuffer> buffer) {
44  return OK;
45}
46
47void ClosingDelegate::OnDataSent(size_t bytes_sent) {}
48
49void ClosingDelegate::OnClose(int status) {
50  if (stream_)
51    stream_->Close();
52  stream_ = NULL;
53}
54
55StreamDelegateBase::StreamDelegateBase(
56    const scoped_refptr<SpdyStream>& stream)
57    : stream_(stream),
58      send_headers_completed_(false),
59      headers_sent_(0),
60      data_sent_(0) {
61}
62
63StreamDelegateBase::~StreamDelegateBase() {
64}
65
66SpdySendStatus StreamDelegateBase::OnSendHeadersComplete() {
67  send_headers_completed_ = true;
68  return NO_MORE_DATA_TO_SEND;
69}
70
71int StreamDelegateBase::OnResponseReceived(const SpdyHeaderBlock& response,
72                                           base::Time response_time,
73                                           int status) {
74  EXPECT_TRUE(send_headers_completed_);
75  response_ = response;
76  return status;
77}
78
79void StreamDelegateBase::OnHeadersSent() {
80  headers_sent_++;
81}
82
83int StreamDelegateBase::OnDataReceived(scoped_ptr<SpdyBuffer> buffer) {
84  if (buffer)
85    received_data_queue_.Enqueue(buffer.Pass());
86  return OK;
87}
88
89void StreamDelegateBase::OnDataSent(size_t bytes_sent) {
90  data_sent_ += bytes_sent;
91}
92
93void StreamDelegateBase::OnClose(int status) {
94  if (!stream_)
95    return;
96  stream_ = NULL;
97  callback_.callback().Run(status);
98}
99
100int StreamDelegateBase::WaitForClose() {
101  int result = callback_.WaitForResult();
102  EXPECT_TRUE(!stream_.get());
103  return result;
104}
105
106std::string StreamDelegateBase::TakeReceivedData() {
107  size_t len = received_data_queue_.GetTotalSize();
108  std::string received_data(len, '\0');
109  if (len > 0) {
110    EXPECT_EQ(
111        len,
112        received_data_queue_.Dequeue(string_as_array(&received_data), len));
113  }
114  return received_data;
115}
116
117std::string StreamDelegateBase::GetResponseHeaderValue(
118    const std::string& name) const {
119  SpdyHeaderBlock::const_iterator it = response_.find(name);
120  return (it == response_.end()) ? std::string() : it->second;
121}
122
123StreamDelegateSendImmediate::StreamDelegateSendImmediate(
124    const scoped_refptr<SpdyStream>& stream,
125    scoped_ptr<SpdyHeaderBlock> headers,
126    base::StringPiece data)
127    : StreamDelegateBase(stream),
128      headers_(headers.Pass()),
129      data_(data) {}
130
131StreamDelegateSendImmediate::~StreamDelegateSendImmediate() {
132}
133
134int StreamDelegateSendImmediate::OnSendBody() {
135  ADD_FAILURE() << "OnSendBody should not be called";
136  return ERR_UNEXPECTED;
137}
138SpdySendStatus StreamDelegateSendImmediate::OnSendBodyComplete(
139    size_t /*bytes_sent*/) {
140  ADD_FAILURE() << "OnSendBodyComplete should not be called";
141  return NO_MORE_DATA_TO_SEND;
142}
143
144int StreamDelegateSendImmediate::OnResponseReceived(
145    const SpdyHeaderBlock& response,
146    base::Time response_time,
147    int status) {
148  status =
149      StreamDelegateBase::OnResponseReceived(response, response_time, status);
150  if (headers_.get()) {
151    stream()->QueueHeaders(headers_.Pass());
152  }
153  if (data_.data()) {
154    scoped_refptr<StringIOBuffer> buf(new StringIOBuffer(data_.as_string()));
155    stream()->QueueStreamData(buf, buf->size(), DATA_FLAG_NONE);
156  }
157  return status;
158}
159
160StreamDelegateWithBody::StreamDelegateWithBody(
161    const scoped_refptr<SpdyStream>& stream,
162    base::StringPiece data)
163    : StreamDelegateBase(stream),
164      buf_(new DrainableIOBuffer(new StringIOBuffer(data.as_string()),
165                                 data.size())),
166      body_data_sent_(0) {}
167
168StreamDelegateWithBody::~StreamDelegateWithBody() {
169}
170
171int StreamDelegateWithBody::OnSendBody() {
172  stream()->QueueStreamData(buf_.get(), buf_->BytesRemaining(),
173                            DATA_FLAG_NONE);
174  return ERR_IO_PENDING;
175}
176
177SpdySendStatus StreamDelegateWithBody::OnSendBodyComplete(size_t bytes_sent) {
178  EXPECT_GT(bytes_sent, 0u);
179
180  buf_->DidConsume(bytes_sent);
181  body_data_sent_ += bytes_sent;
182  if (buf_->BytesRemaining() > 0) {
183    // Go back to OnSendBody() to send the remaining data.
184    return MORE_DATA_TO_SEND;
185  }
186
187  return NO_MORE_DATA_TO_SEND;
188}
189
190} // namespace test
191
192} // namespace net
193