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