// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This class simulates a slow download. This used in a UI test to test the // download manager. Requests to |kUnknownSizeUrl| and |kKnownSizeUrl| start // downloads that pause after the first N bytes, to be completed by sending a // request to |kFinishDownloadUrl|. #ifndef CONTENT_TEST_NET_URL_REQUEST_SLOW_DOWNLOAD_JOB_H_ #define CONTENT_TEST_NET_URL_REQUEST_SLOW_DOWNLOAD_JOB_H_ #include <set> #include <string> #include "base/lazy_instance.h" #include "base/memory/weak_ptr.h" #include "net/url_request/url_request_job.h" namespace content { class URLRequestSlowDownloadJob : public net::URLRequestJob { public: // Test URLs. static const char kUnknownSizeUrl[]; static const char kKnownSizeUrl[]; static const char kFinishDownloadUrl[]; static const char kErrorDownloadUrl[]; // Download sizes. static const int kFirstDownloadSize; static const int kSecondDownloadSize; // Timer callback, used to check to see if we should finish our download and // send the second chunk. void CheckDoneStatus(); // net::URLRequestJob methods virtual void Start() OVERRIDE; virtual bool GetMimeType(std::string* mime_type) const OVERRIDE; virtual void GetResponseInfo(net::HttpResponseInfo* info) OVERRIDE; virtual bool ReadRawData(net::IOBuffer* buf, int buf_size, int *bytes_read) OVERRIDE; static net::URLRequestJob* Factory(net::URLRequest* request, net::NetworkDelegate* network_delegate, const std::string& scheme); // Returns the current number of URLRequestSlowDownloadJobs that have // not yet completed. static size_t NumberOutstandingRequests(); // Adds the testing URLs to the net::URLRequestFilter. static void AddUrlHandler(); private: URLRequestSlowDownloadJob(net::URLRequest* request, net::NetworkDelegate* network_delegate); virtual ~URLRequestSlowDownloadJob(); // Enum indicating where we are in the read after a call to // FillBufferHelper. enum ReadStatus { // The buffer was filled with data and may be returned. BUFFER_FILLED, // No data was added to the buffer because kFinishDownloadUrl has // not yet been seen and we've already returned the first chunk. REQUEST_BLOCKED, // No data was added to the buffer because we've already returned // all the data. REQUEST_COMPLETE }; ReadStatus FillBufferHelper( net::IOBuffer* buf, int buf_size, int* bytes_written); void GetResponseInfoConst(net::HttpResponseInfo* info) const; // Mark all pending requests to be finished. We keep track of pending // requests in |pending_requests_|. static void FinishPendingRequests(); static void ErrorPendingRequests(); typedef std::set<URLRequestSlowDownloadJob*> SlowJobsSet; static base::LazyInstance<SlowJobsSet>::Leaky pending_requests_; void StartAsync(); void set_should_finish_download() { should_finish_download_ = true; } void set_should_error_download() { should_error_download_ = true; } int bytes_already_sent_; bool should_error_download_; bool should_finish_download_; scoped_refptr<net::IOBuffer> buffer_; int buffer_size_; base::WeakPtrFactory<URLRequestSlowDownloadJob> weak_factory_; }; } // namespace content #endif // CONTENT_TEST_NET_URL_REQUEST_SLOW_DOWNLOAD_JOB_H_