1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "mock_url_request_delegate.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/run_loop.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/base/io_buffer.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kBufferSize = 1024;
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace content {
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)MockURLRequestDelegate::MockURLRequestDelegate()
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : io_buffer_(new net::IOBuffer(kBufferSize)) {
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)MockURLRequestDelegate::~MockURLRequestDelegate() {
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void MockURLRequestDelegate::OnResponseStarted(net::URLRequest* request) {
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (request->status().is_success()) {
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_TRUE(request->response_headers());
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ReadSome(request);
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else {
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    RequestComplete();
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void MockURLRequestDelegate::OnReadCompleted(net::URLRequest* request,
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                             int bytes_read) {
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (bytes_read > 0)
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ReceiveData(request, bytes_read);
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  else
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    RequestComplete();
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void MockURLRequestDelegate::ReadSome(net::URLRequest* request) {
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!request->is_pending()) {
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    RequestComplete();
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int bytes_read = 0;
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!request->Read(io_buffer_.get(), kBufferSize, &bytes_read)) {
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!request->status().is_io_pending())
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      RequestComplete();
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ReceiveData(request, bytes_read);
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void MockURLRequestDelegate::ReceiveData(net::URLRequest* request,
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                         int bytes_read) {
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (bytes_read) {
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    response_data_.append(io_buffer_->data(),
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          static_cast<size_t>(bytes_read));
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ReadSome(request);
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else {
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    RequestComplete();
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void MockURLRequestDelegate::RequestComplete() {
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::MessageLoop::current()->Quit();
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
73