1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker // This file defines MockFileStream, a test class for FileStream. 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #ifndef NET_BASE_MOCK_FILE_STREAM_H_ 8*6777b538SAndroid Build Coastguard Worker #define NET_BASE_MOCK_FILE_STREAM_H_ 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #include "base/compiler_specific.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h" 15*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h" 16*6777b538SAndroid Build Coastguard Worker #include "net/base/file_stream.h" 17*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h" 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker namespace net { 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker class IOBuffer; 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker namespace testing { 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker class MockFileStream : public FileStream { 26*6777b538SAndroid Build Coastguard Worker public: 27*6777b538SAndroid Build Coastguard Worker explicit MockFileStream(const scoped_refptr<base::TaskRunner>& task_runner); 28*6777b538SAndroid Build Coastguard Worker MockFileStream(base::File file, 29*6777b538SAndroid Build Coastguard Worker const scoped_refptr<base::TaskRunner>& task_runner); 30*6777b538SAndroid Build Coastguard Worker ~MockFileStream() override; 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker // FileStream methods. 33*6777b538SAndroid Build Coastguard Worker int Seek(int64_t offset, Int64CompletionOnceCallback callback) override; 34*6777b538SAndroid Build Coastguard Worker int Read(IOBuffer* buf, 35*6777b538SAndroid Build Coastguard Worker int buf_len, 36*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) override; 37*6777b538SAndroid Build Coastguard Worker int Write(IOBuffer* buf, 38*6777b538SAndroid Build Coastguard Worker int buf_len, 39*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback) override; 40*6777b538SAndroid Build Coastguard Worker int Flush(CompletionOnceCallback callback) override; 41*6777b538SAndroid Build Coastguard Worker set_forced_error_async(int error)42*6777b538SAndroid Build Coastguard Worker void set_forced_error_async(int error) { 43*6777b538SAndroid Build Coastguard Worker forced_error_ = error; 44*6777b538SAndroid Build Coastguard Worker async_error_ = true; 45*6777b538SAndroid Build Coastguard Worker } set_forced_error(int error)46*6777b538SAndroid Build Coastguard Worker void set_forced_error(int error) { 47*6777b538SAndroid Build Coastguard Worker forced_error_ = error; 48*6777b538SAndroid Build Coastguard Worker async_error_ = false; 49*6777b538SAndroid Build Coastguard Worker } clear_forced_error()50*6777b538SAndroid Build Coastguard Worker void clear_forced_error() { 51*6777b538SAndroid Build Coastguard Worker forced_error_ = OK; 52*6777b538SAndroid Build Coastguard Worker async_error_ = false; 53*6777b538SAndroid Build Coastguard Worker } forced_error()54*6777b538SAndroid Build Coastguard Worker int forced_error() const { return forced_error_; } get_path()55*6777b538SAndroid Build Coastguard Worker const base::FilePath& get_path() const { return path_; } 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker // Throttles all asynchronous callbacks, including forced errors, until a 58*6777b538SAndroid Build Coastguard Worker // matching ReleaseCallbacks call. 59*6777b538SAndroid Build Coastguard Worker void ThrottleCallbacks(); 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Worker // Resumes running asynchronous callbacks and runs any throttled callbacks. 62*6777b538SAndroid Build Coastguard Worker void ReleaseCallbacks(); 63*6777b538SAndroid Build Coastguard Worker 64*6777b538SAndroid Build Coastguard Worker private: ReturnError(int function_error)65*6777b538SAndroid Build Coastguard Worker int ReturnError(int function_error) { 66*6777b538SAndroid Build Coastguard Worker if (forced_error_ != OK) { 67*6777b538SAndroid Build Coastguard Worker int ret = forced_error_; 68*6777b538SAndroid Build Coastguard Worker clear_forced_error(); 69*6777b538SAndroid Build Coastguard Worker return ret; 70*6777b538SAndroid Build Coastguard Worker } 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker return function_error; 73*6777b538SAndroid Build Coastguard Worker } 74*6777b538SAndroid Build Coastguard Worker ReturnError64(int64_t function_error)75*6777b538SAndroid Build Coastguard Worker int64_t ReturnError64(int64_t function_error) { 76*6777b538SAndroid Build Coastguard Worker if (forced_error_ != OK) { 77*6777b538SAndroid Build Coastguard Worker int64_t ret = forced_error_; 78*6777b538SAndroid Build Coastguard Worker clear_forced_error(); 79*6777b538SAndroid Build Coastguard Worker return ret; 80*6777b538SAndroid Build Coastguard Worker } 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker return function_error; 83*6777b538SAndroid Build Coastguard Worker } 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker // Wrappers for callbacks to make them honor ThrottleCallbacks and 86*6777b538SAndroid Build Coastguard Worker // ReleaseCallbacks. 87*6777b538SAndroid Build Coastguard Worker void DoCallback(CompletionOnceCallback callback, int result); 88*6777b538SAndroid Build Coastguard Worker void DoCallback64(Int64CompletionOnceCallback callback, int64_t result); 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Worker // Depending on |async_error_|, either synchronously returns |forced_error_| 91*6777b538SAndroid Build Coastguard Worker // asynchronously calls |callback| with |async_error_|. 92*6777b538SAndroid Build Coastguard Worker int ErrorCallback(CompletionOnceCallback callback); 93*6777b538SAndroid Build Coastguard Worker int64_t ErrorCallback64(Int64CompletionOnceCallback callback); 94*6777b538SAndroid Build Coastguard Worker 95*6777b538SAndroid Build Coastguard Worker int forced_error_ = OK; 96*6777b538SAndroid Build Coastguard Worker bool async_error_ = false; 97*6777b538SAndroid Build Coastguard Worker bool throttled_ = false; 98*6777b538SAndroid Build Coastguard Worker base::OnceClosure throttled_task_; 99*6777b538SAndroid Build Coastguard Worker base::FilePath path_; 100*6777b538SAndroid Build Coastguard Worker 101*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<MockFileStream> weak_factory_{this}; 102*6777b538SAndroid Build Coastguard Worker }; 103*6777b538SAndroid Build Coastguard Worker 104*6777b538SAndroid Build Coastguard Worker } // namespace testing 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard Worker } // namespace net 107*6777b538SAndroid Build Coastguard Worker 108*6777b538SAndroid Build Coastguard Worker #endif // NET_BASE_MOCK_FILE_STREAM_H_ 109