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 base::WeakPtr<SpdyStream>& stream) : stream_(stream) {
20  DCHECK(stream_);
21}
22
23ClosingDelegate::~ClosingDelegate() {}
24
25void ClosingDelegate::OnRequestHeadersSent() {}
26
27SpdyResponseHeadersStatus ClosingDelegate::OnResponseHeadersUpdated(
28    const SpdyHeaderBlock& response_headers) {
29  return RESPONSE_HEADERS_ARE_COMPLETE;
30}
31
32void ClosingDelegate::OnDataReceived(scoped_ptr<SpdyBuffer> buffer) {}
33
34void ClosingDelegate::OnDataSent() {}
35
36void ClosingDelegate::OnClose(int status) {
37  DCHECK(stream_);
38  stream_->Close();
39  // The |stream_| may still be alive (if it is our delegate).
40}
41
42StreamDelegateBase::StreamDelegateBase(
43    const base::WeakPtr<SpdyStream>& stream)
44    : stream_(stream),
45      stream_id_(0),
46      send_headers_completed_(false) {
47}
48
49StreamDelegateBase::~StreamDelegateBase() {
50}
51
52void StreamDelegateBase::OnRequestHeadersSent() {
53  stream_id_ = stream_->stream_id();
54  EXPECT_NE(stream_id_, 0u);
55  send_headers_completed_ = true;
56}
57
58SpdyResponseHeadersStatus StreamDelegateBase::OnResponseHeadersUpdated(
59    const SpdyHeaderBlock& response_headers) {
60  EXPECT_EQ(stream_->type() != SPDY_PUSH_STREAM, send_headers_completed_);
61  response_headers_ = response_headers;
62  return RESPONSE_HEADERS_ARE_COMPLETE;
63}
64
65void StreamDelegateBase::OnDataReceived(scoped_ptr<SpdyBuffer> buffer) {
66  if (buffer)
67    received_data_queue_.Enqueue(buffer.Pass());
68}
69
70void StreamDelegateBase::OnDataSent() {}
71
72void StreamDelegateBase::OnClose(int status) {
73  if (!stream_.get())
74    return;
75  stream_id_ = stream_->stream_id();
76  stream_.reset();
77  callback_.callback().Run(status);
78}
79
80int StreamDelegateBase::WaitForClose() {
81  int result = callback_.WaitForResult();
82  EXPECT_TRUE(!stream_.get());
83  return result;
84}
85
86std::string StreamDelegateBase::TakeReceivedData() {
87  size_t len = received_data_queue_.GetTotalSize();
88  std::string received_data(len, '\0');
89  if (len > 0) {
90    EXPECT_EQ(
91        len,
92        received_data_queue_.Dequeue(string_as_array(&received_data), len));
93  }
94  return received_data;
95}
96
97std::string StreamDelegateBase::GetResponseHeaderValue(
98    const std::string& name) const {
99  SpdyHeaderBlock::const_iterator it = response_headers_.find(name);
100  return (it == response_headers_.end()) ? std::string() : it->second;
101}
102
103StreamDelegateDoNothing::StreamDelegateDoNothing(
104    const base::WeakPtr<SpdyStream>& stream)
105    : StreamDelegateBase(stream) {}
106
107StreamDelegateDoNothing::~StreamDelegateDoNothing() {
108}
109
110StreamDelegateSendImmediate::StreamDelegateSendImmediate(
111    const base::WeakPtr<SpdyStream>& stream,
112    base::StringPiece data)
113    : StreamDelegateBase(stream),
114      data_(data) {}
115
116StreamDelegateSendImmediate::~StreamDelegateSendImmediate() {
117}
118
119SpdyResponseHeadersStatus StreamDelegateSendImmediate::OnResponseHeadersUpdated(
120    const SpdyHeaderBlock& response_headers) {
121  SpdyResponseHeadersStatus status =
122      StreamDelegateBase::OnResponseHeadersUpdated(response_headers);
123  if (data_.data()) {
124    scoped_refptr<StringIOBuffer> buf(new StringIOBuffer(data_.as_string()));
125    stream()->SendData(buf.get(), buf->size(), MORE_DATA_TO_SEND);
126  }
127  return status;
128}
129
130StreamDelegateWithBody::StreamDelegateWithBody(
131    const base::WeakPtr<SpdyStream>& stream,
132    base::StringPiece data)
133    : StreamDelegateBase(stream),
134      buf_(new StringIOBuffer(data.as_string())) {}
135
136StreamDelegateWithBody::~StreamDelegateWithBody() {
137}
138
139void StreamDelegateWithBody::OnRequestHeadersSent() {
140  StreamDelegateBase::OnRequestHeadersSent();
141  stream()->SendData(buf_.get(), buf_->size(), NO_MORE_DATA_TO_SEND);
142}
143
144} // namespace test
145
146} // namespace net
147