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