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