xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/common/test_tools/mock_streams.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright (c) 2023 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 
5 #ifndef QUICHE_COMMON_TEST_TOOLS_MOCK_STREAMS_H_
6 #define QUICHE_COMMON_TEST_TOOLS_MOCK_STREAMS_H_
7 
8 #include <algorithm>
9 #include <cstddef>
10 #include <string>
11 #include <utility>
12 
13 #include "absl/status/status.h"
14 #include "absl/strings/string_view.h"
15 #include "absl/types/span.h"
16 #include "quiche/common/platform/api/quiche_test.h"
17 #include "quiche/common/quiche_stream.h"
18 
19 namespace quiche::test {
20 
21 // Mockable stream that stores all of the data into an std::string by default.
22 class MockWriteStream : public quiche::WriteStream {
23  public:
MockWriteStream()24   MockWriteStream() {
25     ON_CALL(*this, CanWrite()).WillByDefault(testing::Return(true));
26     ON_CALL(*this, Writev(testing::_, testing::_))
27         .WillByDefault([&](absl::Span<const absl::string_view> data,
28                            const StreamWriteOptions& options) {
29           return AppendToData(data, options);
30         });
31   }
32 
33   MOCK_METHOD(absl::Status, Writev,
34               (absl::Span<const absl::string_view> data,
35                const StreamWriteOptions& options),
36               (override));
37   MOCK_METHOD(bool, CanWrite, (), (const, override));
38 
AppendToData(absl::Span<const absl::string_view> data,const StreamWriteOptions & options)39   absl::Status AppendToData(absl::Span<const absl::string_view> data,
40                             const StreamWriteOptions& options) {
41     for (absl::string_view fragment : data) {
42       data_.append(fragment.data(), fragment.size());
43     }
44     ProcessOptions(options);
45     return absl::OkStatus();
46   }
ProcessOptions(const StreamWriteOptions & options)47   void ProcessOptions(const StreamWriteOptions& options) {
48     fin_written_ |= options.send_fin();
49   }
50 
data()51   std::string& data() { return data_; }
fin_written()52   bool fin_written() { return fin_written_; }
53 
54  private:
55   std::string data_;
56   bool fin_written_ = false;
57 };
58 
59 // Reads stream data from an std::string buffer.
60 class ReadStreamFromString : public ReadStream {
61  public:
ReadStreamFromString(std::string * data)62   explicit ReadStreamFromString(std::string* data) : data_(data) {}
63 
Read(absl::Span<char> buffer)64   ReadResult Read(absl::Span<char> buffer) override {
65     size_t data_to_copy = std::min(buffer.size(), data_->size());
66     std::copy(data_->begin(), data_->begin() + data_to_copy, buffer.begin());
67     *data_ = data_->substr(data_to_copy);
68     return ReadResult{data_to_copy, data_->empty() && fin_};
69   }
Read(std::string * output)70   ReadResult Read(std::string* output) override {
71     size_t bytes = data_->size();
72     output->append(std::move(*data_));
73     data_->clear();
74     return ReadResult{bytes, fin_};
75   }
76 
ReadableBytes()77   size_t ReadableBytes() const override { return data_->size(); }
78 
PeekNextReadableRegion()79   virtual PeekResult PeekNextReadableRegion() const override {
80     PeekResult result;
81     result.peeked_data = *data_;
82     result.fin_next = data_->empty() && fin_;
83     result.all_data_received = fin_;
84     return result;
85   }
86 
SkipBytes(size_t bytes)87   bool SkipBytes(size_t bytes) override {
88     *data_ = data_->substr(bytes);
89     return data_->empty() && fin_;
90   }
91 
set_fin()92   void set_fin() { fin_ = true; }
93 
94  private:
95   std::string* data_;
96   bool fin_ = false;
97 };
98 
99 }  // namespace quiche::test
100 
101 #endif  // QUICHE_COMMON_TEST_TOOLS_MOCK_STREAMS_H_
102