blob: 97b1e519399d05690488c9831fa41dbba8753d63 [file] [log] [blame]
[email protected]fe57eb22012-02-09 05:59:401// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]47a881b2011-08-29 22:59:212// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/base/mock_file_stream.h"
6
dchengc7eeda422015-12-26 03:56:487#include <utility>
8
[email protected]52c41b42014-03-14 17:56:489#include "base/bind.h"
skyostil4891b25b2015-06-11 11:43:4510#include "base/location.h"
Patrick Monette643cdf62021-10-15 19:13:4211#include "base/task/single_thread_task_runner.h"
gabf767595f2016-05-11 18:50:3512#include "base/threading/thread_task_runner_handle.h"
[email protected]52c41b42014-03-14 17:56:4813
[email protected]47a881b2011-08-29 22:59:2114namespace net {
15
16namespace testing {
17
[email protected]671e95fd2014-04-30 11:21:3618MockFileStream::MockFileStream(
19 const scoped_refptr<base::TaskRunner>& task_runner)
Tsuyoshi Horo432981d52022-06-09 09:50:1320 : FileStream(task_runner) {}
[email protected]52c41b42014-03-14 17:56:4821
22MockFileStream::MockFileStream(
[email protected]be6fb60b2014-04-03 18:33:5823 base::File file,
[email protected]52c41b42014-03-14 17:56:4824 const scoped_refptr<base::TaskRunner>& task_runner)
Tsuyoshi Horo432981d52022-06-09 09:50:1325 : FileStream(std::move(file), task_runner) {}
[email protected]52c41b42014-03-14 17:56:4826
Chris Watkins68b15032017-12-01 03:07:1327MockFileStream::~MockFileStream() = default;
[email protected]52c41b42014-03-14 17:56:4828
Matt Menkedadd6c72018-01-30 23:07:2529int MockFileStream::Seek(int64_t offset, Int64CompletionOnceCallback callback) {
30 Int64CompletionOnceCallback wrapped_callback =
31 base::BindOnce(&MockFileStream::DoCallback64, weak_factory_.GetWeakPtr(),
32 std::move(callback));
ttuttle859dc7a2015-04-23 19:42:2933 if (forced_error_ == OK)
Matt Menkedadd6c72018-01-30 23:07:2534 return FileStream::Seek(offset, std::move(wrapped_callback));
35 return ErrorCallback64(std::move(wrapped_callback));
[email protected]cf02541b2012-04-11 08:02:1736}
37
[email protected]9f49afb2012-02-16 09:59:2038int MockFileStream::Read(IOBuffer* buf,
[email protected]5eb431e22011-10-12 08:51:3839 int buf_len,
Matt Menkedadd6c72018-01-30 23:07:2540 CompletionOnceCallback callback) {
41 CompletionOnceCallback wrapped_callback =
42 base::BindOnce(&MockFileStream::DoCallback, weak_factory_.GetWeakPtr(),
43 std::move(callback));
ttuttle859dc7a2015-04-23 19:42:2944 if (forced_error_ == OK)
Matt Menkedadd6c72018-01-30 23:07:2545 return FileStream::Read(buf, buf_len, std::move(wrapped_callback));
46 return ErrorCallback(std::move(wrapped_callback));
[email protected]47a881b2011-08-29 22:59:2147}
48
[email protected]9f49afb2012-02-16 09:59:2049int MockFileStream::Write(IOBuffer* buf,
[email protected]5eb431e22011-10-12 08:51:3850 int buf_len,
Matt Menkedadd6c72018-01-30 23:07:2551 CompletionOnceCallback callback) {
52 CompletionOnceCallback wrapped_callback =
53 base::BindOnce(&MockFileStream::DoCallback, weak_factory_.GetWeakPtr(),
54 std::move(callback));
ttuttle859dc7a2015-04-23 19:42:2955 if (forced_error_ == OK)
Matt Menkedadd6c72018-01-30 23:07:2556 return FileStream::Write(buf, buf_len, std::move(wrapped_callback));
57 return ErrorCallback(std::move(wrapped_callback));
[email protected]47a881b2011-08-29 22:59:2158}
59
Matt Menkedadd6c72018-01-30 23:07:2560int MockFileStream::Flush(CompletionOnceCallback callback) {
61 CompletionOnceCallback wrapped_callback =
62 base::BindOnce(&MockFileStream::DoCallback, weak_factory_.GetWeakPtr(),
63 std::move(callback));
ttuttle859dc7a2015-04-23 19:42:2964 if (forced_error_ == OK)
Matt Menkedadd6c72018-01-30 23:07:2565 return FileStream::Flush(std::move(wrapped_callback));
66 return ErrorCallback(std::move(wrapped_callback));
[email protected]a95ce0762012-10-01 05:54:2667}
68
[email protected]52c41b42014-03-14 17:56:4869void MockFileStream::ThrottleCallbacks() {
70 CHECK(!throttled_);
71 throttled_ = true;
72}
73
74void MockFileStream::ReleaseCallbacks() {
75 CHECK(throttled_);
76 throttled_ = false;
77
78 if (!throttled_task_.is_null()) {
Matt Menkedadd6c72018-01-30 23:07:2579 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
80 std::move(throttled_task_));
[email protected]52c41b42014-03-14 17:56:4881 }
82}
83
Matt Menkedadd6c72018-01-30 23:07:2584void MockFileStream::DoCallback(CompletionOnceCallback callback, int result) {
[email protected]52c41b42014-03-14 17:56:4885 if (!throttled_) {
Matt Menkedadd6c72018-01-30 23:07:2586 std::move(callback).Run(result);
[email protected]52c41b42014-03-14 17:56:4887 return;
88 }
89 CHECK(throttled_task_.is_null());
Matt Menkedadd6c72018-01-30 23:07:2590 throttled_task_ = base::BindOnce(std::move(callback), result);
[email protected]52c41b42014-03-14 17:56:4891}
92
Matt Menkedadd6c72018-01-30 23:07:2593void MockFileStream::DoCallback64(Int64CompletionOnceCallback callback,
wtc69f8ea82015-06-04 00:08:1394 int64_t result) {
[email protected]52c41b42014-03-14 17:56:4895 if (!throttled_) {
Matt Menkedadd6c72018-01-30 23:07:2596 std::move(callback).Run(result);
[email protected]52c41b42014-03-14 17:56:4897 return;
98 }
99 CHECK(throttled_task_.is_null());
Matt Menkedadd6c72018-01-30 23:07:25100 throttled_task_ = base::BindOnce(std::move(callback), result);
[email protected]52c41b42014-03-14 17:56:48101}
102
Matt Menkedadd6c72018-01-30 23:07:25103int MockFileStream::ErrorCallback(CompletionOnceCallback callback) {
ttuttle859dc7a2015-04-23 19:42:29104 CHECK_NE(OK, forced_error_);
[email protected]52c41b42014-03-14 17:56:48105 if (async_error_) {
skyostil4891b25b2015-06-11 11:43:45106 base::ThreadTaskRunnerHandle::Get()->PostTask(
Matt Menkedadd6c72018-01-30 23:07:25107 FROM_HERE, base::BindOnce(std::move(callback), forced_error_));
[email protected]52c41b42014-03-14 17:56:48108 clear_forced_error();
ttuttle859dc7a2015-04-23 19:42:29109 return ERR_IO_PENDING;
[email protected]52c41b42014-03-14 17:56:48110 }
111 int ret = forced_error_;
112 clear_forced_error();
113 return ret;
114}
115
Matt Menkedadd6c72018-01-30 23:07:25116int64_t MockFileStream::ErrorCallback64(Int64CompletionOnceCallback callback) {
ttuttle859dc7a2015-04-23 19:42:29117 CHECK_NE(OK, forced_error_);
[email protected]52c41b42014-03-14 17:56:48118 if (async_error_) {
skyostil4891b25b2015-06-11 11:43:45119 base::ThreadTaskRunnerHandle::Get()->PostTask(
Matt Menkedadd6c72018-01-30 23:07:25120 FROM_HERE, base::BindOnce(std::move(callback), forced_error_));
[email protected]52c41b42014-03-14 17:56:48121 clear_forced_error();
ttuttle859dc7a2015-04-23 19:42:29122 return ERR_IO_PENDING;
[email protected]52c41b42014-03-14 17:56:48123 }
wtc69f8ea82015-06-04 00:08:13124 int64_t ret = forced_error_;
[email protected]52c41b42014-03-14 17:56:48125 clear_forced_error();
126 return ret;
127}
128
[email protected]47a881b2011-08-29 22:59:21129} // namespace testing
130
131} // namespace net