[go: nahoru, domu]

blob: 174322133b9f04aad92e424523677136f1ff2075 [file] [log] [blame]
Avi Drissman64595482022-09-14 20:52:291// Copyright 2015 The Chromium Authors
xunjieli95ea25f52016-09-09 21:32:482// 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/filter/mock_source_stream.h"
6
David Benjamin80c8c952023-10-25 03:35:297#include <algorithm>
Bence Béky5f115482018-06-29 18:31:558#include <utility>
9
Hans Wennborg0924470b2020-04-27 21:08:0510#include "base/check_op.h"
xunjieli95ea25f52016-09-09 21:32:4811#include "net/base/io_buffer.h"
mmenkee66c81ae2017-01-03 20:07:5812#include "testing/gtest/include/gtest/gtest.h"
xunjieli95ea25f52016-09-09 21:32:4813
14namespace net {
15
Adrienne Walkerb8ed4772019-10-21 19:53:4016MockSourceStream::MockSourceStream() : SourceStream(SourceStream::TYPE_NONE) {}
xunjieli95ea25f52016-09-09 21:32:4817
18MockSourceStream::~MockSourceStream() {
19 DCHECK(!awaiting_completion_);
Nidhi Jaju5de5f8502023-07-24 18:05:4520 if (expect_all_input_consumed_) {
21 // All data should have been consumed.
22 EXPECT_TRUE(results_.empty());
23 }
xunjieli95ea25f52016-09-09 21:32:4824}
25
26int MockSourceStream::Read(IOBuffer* dest_buffer,
27 int buffer_size,
Bence Béky5f115482018-06-29 18:31:5528 CompletionOnceCallback callback) {
xunjieli95ea25f52016-09-09 21:32:4829 DCHECK(!awaiting_completion_);
30 DCHECK(!results_.empty());
31
32 if (results_.empty())
33 return ERR_UNEXPECTED;
34
35 QueuedResult r = results_.front();
36 DCHECK_GE(buffer_size, r.len);
37 if (r.mode == ASYNC) {
38 awaiting_completion_ = true;
39 dest_buffer_ = dest_buffer;
40 dest_buffer_size_ = buffer_size;
Bence Béky5f115482018-06-29 18:31:5541 callback_ = std::move(callback);
xunjieli95ea25f52016-09-09 21:32:4842 return ERR_IO_PENDING;
43 }
44
45 results_.pop();
David Benjamin80c8c952023-10-25 03:35:2946 std::copy(r.data, r.data + r.len, dest_buffer->data());
xunjieli95ea25f52016-09-09 21:32:4847 return r.error == OK ? r.len : r.error;
48}
49
50std::string MockSourceStream::Description() const {
51 return "";
52}
53
Adrienne Walkerb8ed4772019-10-21 19:53:4054bool MockSourceStream::MayHaveMoreBytes() const {
55 if (always_report_has_more_bytes_)
56 return true;
57 return !results_.empty();
58}
59
xunjieli95ea25f52016-09-09 21:32:4860MockSourceStream::QueuedResult::QueuedResult(const char* data,
61 int len,
62 Error error,
63 Mode mode)
64 : data(data), len(len), error(error), mode(mode) {}
65
66void MockSourceStream::AddReadResult(const char* data,
67 int len,
68 Error error,
69 Mode mode) {
mmenkee66c81ae2017-01-03 20:07:5870 if (error != OK) {
71 // Doesn't make any sense to have both an error and data.
72 DCHECK_EQ(len, 0);
73 } else {
74 // The read result must be between 0 and 32k (inclusive) because the read
75 // buffer used in FilterSourceStream is 32k.
76 DCHECK_GE(32 * 1024, len);
77 DCHECK_LE(0, len);
78 }
79
80 if (len > 0 && read_one_byte_at_a_time_) {
81 for (int i = 0; i < len; ++i) {
82 QueuedResult result(data + i, 1, OK, mode);
83 results_.push(result);
84 }
85 return;
86 }
87
xunjieli95ea25f52016-09-09 21:32:4888 QueuedResult result(data, len, error, mode);
89 results_.push(result);
90}
91
92void MockSourceStream::CompleteNextRead() {
93 DCHECK(awaiting_completion_);
94
95 awaiting_completion_ = false;
96 QueuedResult r = results_.front();
97 DCHECK_EQ(ASYNC, r.mode);
98 results_.pop();
99 DCHECK_GE(dest_buffer_size_, r.len);
David Benjamin80c8c952023-10-25 03:35:29100 std::copy(r.data, r.data + r.len, dest_buffer_->data());
xunjieli95ea25f52016-09-09 21:32:48101 dest_buffer_ = nullptr;
Bence Béky5f115482018-06-29 18:31:55102 std::move(callback_).Run(r.error == OK ? r.len : r.error);
xunjieli95ea25f52016-09-09 21:32:48103}
104
105} // namespace net