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