172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string.h>
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <algorithm>
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/filter.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/io_buffer.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request_job.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request_job_tracker.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/url_request/url_request_status.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "net/url_request/url_request_test_util.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gmock/include/gmock/gmock.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/platform_test.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::Eq;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::InSequence;
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::NotNull;
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::StrictMock;
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace net {
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kBasic[] = "Hello\n";
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The above string "Hello\n", gzip compressed.
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst unsigned char kCompressed[] = {
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  0x1f, 0x8b, 0x08, 0x08, 0x38, 0x18, 0x2e, 0x4c, 0x00, 0x03, 0x63,
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x2e, 0x68,
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  0x74, 0x6d, 0x6c, 0x00, 0xf3, 0x48, 0xcd, 0xc9, 0xc9, 0xe7, 0x02,
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  0x00, 0x16, 0x35, 0x96, 0x31, 0x06, 0x00, 0x00, 0x00
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool GetResponseBody(const GURL& url, std::string* out_body) {
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (url.spec() == "test:basic") {
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *out_body = kBasic;
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (url.spec() == "test:compressed") {
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    out_body->assign(reinterpret_cast<const char*>(kCompressed),
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     sizeof(kCompressed));
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass MockJobObserver : public URLRequestJobTracker::JobObserver {
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MOCK_METHOD1(OnJobAdded, void(URLRequestJob* job));
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MOCK_METHOD1(OnJobRemoved, void(URLRequestJob* job));
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MOCK_METHOD2(OnJobDone, void(URLRequestJob* job,
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               const URLRequestStatus& status));
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MOCK_METHOD3(OnJobRedirect, void(URLRequestJob* job,
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   const GURL& location,
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   int status_code));
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MOCK_METHOD3(OnBytesRead, void(URLRequestJob* job,
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const char* buf,
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 int byte_count));
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// A URLRequestJob that returns static content for given URLs. We do
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// not use URLRequestTestJob here because URLRequestTestJob fakes
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// async operations by calling ReadRawData synchronously in an async
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// callback. This test requires a URLRequestJob that returns false for
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// async reads, in order to exercise the real async read codepath.
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass URLRequestJobTrackerTestJob : public URLRequestJob {
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  URLRequestJobTrackerTestJob(URLRequest* request, bool async_reads)
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      : URLRequestJob(request), async_reads_(async_reads) {}
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Start() {
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(GetResponseBody(request_->url(), &response_data_));
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Start reading asynchronously so that all error reporting and data
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // callbacks happen as they would for network requests.
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod(
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        this, &URLRequestJobTrackerTestJob::NotifyHeadersComplete));
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool ReadRawData(IOBuffer* buf, int buf_size,
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   int *bytes_read) {
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const size_t bytes_to_read = std::min(
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        response_data_.size(), static_cast<size_t>(buf_size));
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Regardless of whether we're performing a sync or async read,
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // copy the data into the caller's buffer now. That way we don't
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // have to hold on to the buffers in the async case.
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    memcpy(buf->data(), response_data_.data(), bytes_to_read);
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    response_data_.erase(0, bytes_to_read);
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (async_reads_) {
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0));
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod(
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          this, &URLRequestJobTrackerTestJob::OnReadCompleted,
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          bytes_to_read));
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStatus(URLRequestStatus());
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *bytes_read = bytes_to_read;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return !async_reads_;
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnReadCompleted(int status) {
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (status == 0) {
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NotifyDone(URLRequestStatus());
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else if (status > 0) {
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      SetStatus(URLRequestStatus());
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ASSERT_FALSE(true) << "Unexpected OnReadCompleted callback.";
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotifyReadComplete(status);
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Filter* SetupFilter() const {
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return request_->url().spec() == "test:compressed"
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        ? Filter::GZipFactory() : NULL;
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The data to send, will be set in Start().
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string response_data_;
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Should reads be synchronous or asynchronous?
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const bool async_reads_;
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Google Mock Matcher to check two URLRequestStatus instances for
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// equality.
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochMATCHER_P(StatusEq, other, "") {
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return (arg.status() == other.status() &&
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg.os_error() == other.os_error());
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Google Mock Matcher to check that two blocks of memory are equal.
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochMATCHER_P2(MemEq, other, len, "") {
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return memcmp(arg, other, len) == 0;
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass URLRequestJobTrackerTest : public PlatformTest {
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void SetUpTestCase() {
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    URLRequest::RegisterProtocolFactory("test", &Factory);
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUp() {
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    g_async_reads = true;
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AssertJobTrackerCallbacks(const char* url) {
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    InSequence seq;
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    testing::StrictMock<MockJobObserver> observer;
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const GURL gurl(url);
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string body;
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(GetResponseBody(gurl, &body));
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // We expect to receive one call for each method on the JobObserver,
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // in the following order:
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_CALL(observer, OnJobAdded(NotNull()));
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_CALL(observer, OnBytesRead(NotNull(),
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      MemEq(body.data(), body.size()),
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      Eq(static_cast<int>(body.size()))));
16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_CALL(observer, OnJobDone(NotNull(),
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                StatusEq(URLRequestStatus())));
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_CALL(observer, OnJobRemoved(NotNull()));
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Attach our observer and perform the resource fetch.
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    g_url_request_job_tracker.AddObserver(&observer);
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Fetch(gurl);
176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    g_url_request_job_tracker.RemoveObserver(&observer);
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Fetch(const GURL& url) {
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    TestDelegate d;
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    {
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      URLRequest request(url, &d);
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      request.Start();
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      MessageLoop::current()->RunAllPending();
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // A few sanity checks to make sure that the delegate also
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // receives the expected callbacks.
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(1, d.response_started_count());
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_FALSE(d.received_data_before_response());
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_STREQ(kBasic, d.data_received().c_str());
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static URLRequest::ProtocolFactory Factory;
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool g_async_reads;
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenURLRequestJob* URLRequestJobTrackerTest::Factory(
200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    URLRequest* request,
20121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const std::string& scheme) {
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new URLRequestJobTrackerTestJob(request, g_async_reads);
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool URLRequestJobTrackerTest::g_async_reads = true;
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(URLRequestJobTrackerTest, BasicAsync) {
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_async_reads = true;
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AssertJobTrackerCallbacks("test:basic");
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(URLRequestJobTrackerTest, BasicSync) {
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_async_reads = false;
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AssertJobTrackerCallbacks("test:basic");
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(URLRequestJobTrackerTest, CompressedAsync) {
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_async_reads = true;
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AssertJobTrackerCallbacks("test:compressed");
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(URLRequestJobTrackerTest, CompressedSync) {
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  g_async_reads = false;
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AssertJobTrackerCallbacks("test:compressed");
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace net
230