1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 // This class simulates a slow download. This used in a UI test to test the 5 // download manager. Requests to |kUnknownSizeUrl| and |kKnownSizeUrl| start 6 // downloads that pause after the first N bytes, to be completed by sending a 7 // request to |kFinishDownloadUrl|. 8 9 #ifndef CONTENT_TEST_NET_URL_REQUEST_SLOW_DOWNLOAD_JOB_H_ 10 #define CONTENT_TEST_NET_URL_REQUEST_SLOW_DOWNLOAD_JOB_H_ 11 12 #include <set> 13 #include <string> 14 15 #include "base/lazy_instance.h" 16 #include "base/memory/weak_ptr.h" 17 #include "net/url_request/url_request_job.h" 18 19 namespace content { 20 21 class URLRequestSlowDownloadJob : public net::URLRequestJob { 22 public: 23 // Test URLs. 24 static const char kUnknownSizeUrl[]; 25 static const char kKnownSizeUrl[]; 26 static const char kFinishDownloadUrl[]; 27 static const char kErrorDownloadUrl[]; 28 29 // Download sizes. 30 static const int kFirstDownloadSize; 31 static const int kSecondDownloadSize; 32 33 // Timer callback, used to check to see if we should finish our download and 34 // send the second chunk. 35 void CheckDoneStatus(); 36 37 // net::URLRequestJob methods 38 virtual void Start() OVERRIDE; 39 virtual bool GetMimeType(std::string* mime_type) const OVERRIDE; 40 virtual void GetResponseInfo(net::HttpResponseInfo* info) OVERRIDE; 41 virtual bool ReadRawData(net::IOBuffer* buf, 42 int buf_size, 43 int *bytes_read) OVERRIDE; 44 45 static net::URLRequestJob* Factory(net::URLRequest* request, 46 net::NetworkDelegate* network_delegate, 47 const std::string& scheme); 48 49 // Returns the current number of URLRequestSlowDownloadJobs that have 50 // not yet completed. 51 static size_t NumberOutstandingRequests(); 52 53 // Adds the testing URLs to the net::URLRequestFilter. 54 static void AddUrlHandler(); 55 56 private: 57 URLRequestSlowDownloadJob(net::URLRequest* request, 58 net::NetworkDelegate* network_delegate); 59 virtual ~URLRequestSlowDownloadJob(); 60 61 // Enum indicating where we are in the read after a call to 62 // FillBufferHelper. 63 enum ReadStatus { 64 // The buffer was filled with data and may be returned. 65 BUFFER_FILLED, 66 67 // No data was added to the buffer because kFinishDownloadUrl has 68 // not yet been seen and we've already returned the first chunk. 69 REQUEST_BLOCKED, 70 71 // No data was added to the buffer because we've already returned 72 // all the data. 73 REQUEST_COMPLETE 74 }; 75 ReadStatus FillBufferHelper( 76 net::IOBuffer* buf, 77 int buf_size, 78 int* bytes_written); 79 80 void GetResponseInfoConst(net::HttpResponseInfo* info) const; 81 82 // Mark all pending requests to be finished. We keep track of pending 83 // requests in |pending_requests_|. 84 static void FinishPendingRequests(); 85 static void ErrorPendingRequests(); 86 typedef std::set<URLRequestSlowDownloadJob*> SlowJobsSet; 87 static base::LazyInstance<SlowJobsSet>::Leaky pending_requests_; 88 89 void StartAsync(); 90 91 void set_should_finish_download() { should_finish_download_ = true; } 92 void set_should_error_download() { should_error_download_ = true; } 93 94 int bytes_already_sent_; 95 bool should_error_download_; 96 bool should_finish_download_; 97 scoped_refptr<net::IOBuffer> buffer_; 98 int buffer_size_; 99 100 base::WeakPtrFactory<URLRequestSlowDownloadJob> weak_factory_; 101 }; 102 103 } // namespace content 104 105 #endif // CONTENT_TEST_NET_URL_REQUEST_SLOW_DOWNLOAD_JOB_H_ 106