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/url_request/url_request_job_factory_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "net/base/request_priority.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockURLRequestJob : public URLRequestJob {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockURLRequestJob(URLRequest* request,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    NetworkDelegate* network_delegate,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const URLRequestStatus& status)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : URLRequestJob(request, network_delegate),
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        status_(status),
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        weak_factory_(this) {}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Start() OVERRIDE {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Start reading asynchronously so that all error reporting and data
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // callbacks happen as they would for network requests.
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base::Bind(&MockURLRequestJob::StartAsync, weak_factory_.GetWeakPtr()));
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockURLRequestJob() {}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartAsync() {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetStatus(status_);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyHeadersComplete();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestStatus status_;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<MockURLRequestJob> weak_factory_;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DummyProtocolHandler : public URLRequestJobFactory::ProtocolHandler {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual URLRequestJob* MaybeCreateJob(
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      URLRequest* request, NetworkDelegate* network_delegate) const OVERRIDE {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new MockURLRequestJob(
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        network_delegate,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLRequestStatus(URLRequestStatus::SUCCESS, OK));
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(URLRequestJobFactoryTest, NoProtocolHandler) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate delegate;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext request_context;
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<URLRequest> request(request_context.CreateRequest(
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GURL("foo://bar"), DEFAULT_PRIORITY, &delegate, NULL));
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  request->Start();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(URLRequestStatus::FAILED, request->status().status());
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(ERR_UNKNOWN_URL_SCHEME, request->status().error());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(URLRequestJobFactoryTest, BasicProtocolHandler) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestDelegate delegate;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestJobFactoryImpl job_factory;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext request_context;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_context.set_job_factory(&job_factory);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job_factory.SetProtocolHandler("foo", new DummyProtocolHandler);
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<URLRequest> request(request_context.CreateRequest(
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GURL("foo://bar"), DEFAULT_PRIORITY, &delegate, NULL));
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  request->Start();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Run();
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(URLRequestStatus::SUCCESS, request->status().status());
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(OK, request->status().error());
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(URLRequestJobFactoryTest, DeleteProtocolHandler) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLRequestJobFactoryImpl job_factory;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestURLRequestContext request_context;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request_context.set_job_factory(&job_factory);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job_factory.SetProtocolHandler("foo", new DummyProtocolHandler);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  job_factory.SetProtocolHandler("foo", NULL);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
99