blob: 94bf1add1e7f560bacfa12abfa4dd31aa8d970ca [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2017 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_QUIC_QUARTC_QUARTC_FAKES_H_
6#define QUICHE_QUIC_QUARTC_QUARTC_FAKES_H_
7
vasilvv872e7a32019-03-12 16:42:44 -07008#include <string>
9
vasilvv89713d02020-02-11 14:33:26 -080010#include "net/third_party/quiche/src/quic/core/quic_clock.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050011#include "net/third_party/quiche/src/quic/core/quic_error_codes.h"
12#include "net/third_party/quiche/src/quic/core/quic_types.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050013#include "net/third_party/quiche/src/quic/quartc/quartc_endpoint.h"
14#include "net/third_party/quiche/src/quic/quartc/quartc_session.h"
15#include "net/third_party/quiche/src/quic/quartc/quartc_stream.h"
dmcardlec60e87a2019-12-12 09:43:19 -080016#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050017
18namespace quic {
19
20class FakeQuartcEndpointDelegate : public QuartcEndpoint::Delegate {
21 public:
QUICHE team6939de52019-05-15 12:05:21 -070022 explicit FakeQuartcEndpointDelegate(QuartcStream::Delegate* stream_delegate,
23 const QuicClock* clock)
24 : stream_delegate_(stream_delegate), clock_(clock) {}
QUICHE teama6ef0a62019-03-07 20:34:33 -050025
26 void OnSessionCreated(QuartcSession* session) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -050027 CHECK_NE(session, nullptr);
28 session_ = session;
QUICHE teama6ef0a62019-03-07 20:34:33 -050029 session_->StartCryptoHandshake();
QUICHE team6939de52019-05-15 12:05:21 -070030 ++num_sessions_created_;
QUICHE teama6ef0a62019-03-07 20:34:33 -050031 }
32
QUICHE teama6ef0a62019-03-07 20:34:33 -050033 void OnConnectionWritable() override {
dschinazi87c39c12019-05-07 21:01:12 -070034 QUIC_LOG(INFO) << "Connection writable!";
QUICHE teama6ef0a62019-03-07 20:34:33 -050035 if (!writable_time_.IsInitialized()) {
36 writable_time_ = clock_->Now();
37 }
38 }
39
40 // Called when peers have established forward-secure encryption
41 void OnCryptoHandshakeComplete() override {
dschinazi87c39c12019-05-07 21:01:12 -070042 QUIC_LOG(INFO) << "Crypto handshake complete!";
QUICHE teama6ef0a62019-03-07 20:34:33 -050043 crypto_handshake_time_ = clock_->Now();
44 }
45
46 // Called when connection closes locally, or remotely by peer.
fkastenholz5d880a92019-06-21 09:01:56 -070047 void OnConnectionClosed(const QuicConnectionCloseFrame& /*frame*/,
dschinazi17d42422019-06-18 16:35:07 -070048 ConnectionCloseSource /*source*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -050049 connected_ = false;
50 }
51
52 // Called when an incoming QUIC stream is created.
53 void OnIncomingStream(QuartcStream* quartc_stream) override {
54 last_incoming_stream_ = quartc_stream;
55 last_incoming_stream_->SetDelegate(stream_delegate_);
56 }
57
dmcardlec60e87a2019-12-12 09:43:19 -080058 void OnMessageReceived(quiche::QuicheStringPiece message) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -050059 incoming_messages_.emplace_back(message);
60 }
61
QUICHE team136e7852019-05-13 14:10:34 -070062 void OnMessageSent(int64_t datagram_id) override {
63 sent_datagram_ids_.push_back(datagram_id);
64 }
65
dschinazi61eb6432019-06-14 16:27:16 -070066 void OnMessageAcked(int64_t datagram_id,
67 QuicTime receive_timestamp) override {
QUICHE team68d15a82019-05-31 15:27:25 -070068 acked_datagram_id_to_receive_timestamp_.emplace(datagram_id,
69 receive_timestamp);
70 }
71
dschinazi61eb6432019-06-14 16:27:16 -070072 void OnMessageLost(int64_t datagram_id) override {
QUICHE team68d15a82019-05-31 15:27:25 -070073 lost_datagram_ids_.push_back(datagram_id);
QUICHE team34df5852019-05-29 16:27:22 -070074 }
75
dschinazi17d42422019-06-18 16:35:07 -070076 void OnCongestionControlChange(QuicBandwidth /*bandwidth_estimate*/,
77 QuicBandwidth /*pacing_rate*/,
78 QuicTime::Delta /*latest_rtt*/) override {}
QUICHE teama6ef0a62019-03-07 20:34:33 -050079
QUICHE team6939de52019-05-15 12:05:21 -070080 QuartcSession* session() { return session_; }
81
82 int num_sessions_created() const { return num_sessions_created_; }
83
QUICHE team136e7852019-05-13 14:10:34 -070084 QuartcStream* last_incoming_stream() const { return last_incoming_stream_; }
QUICHE teama6ef0a62019-03-07 20:34:33 -050085
86 // Returns all received messages.
QUICHE team136e7852019-05-13 14:10:34 -070087 const std::vector<std::string>& incoming_messages() const {
QUICHE teama6ef0a62019-03-07 20:34:33 -050088 return incoming_messages_;
89 }
90
QUICHE team136e7852019-05-13 14:10:34 -070091 // Returns all sent datagram ids in the order sent.
92 const std::vector<int64_t>& sent_datagram_ids() const {
93 return sent_datagram_ids_;
94 }
95
QUICHE team34df5852019-05-29 16:27:22 -070096 // Returns all ACKEd datagram ids in the order ACKs were received.
QUICHE team68d15a82019-05-31 15:27:25 -070097 const std::map<int64_t, QuicTime>& acked_datagram_id_to_receive_timestamp()
98 const {
99 return acked_datagram_id_to_receive_timestamp_;
100 }
101
102 const std::vector<int64_t>& lost_datagram_ids() const {
103 return lost_datagram_ids_;
QUICHE team34df5852019-05-29 16:27:22 -0700104 }
105
QUICHE team136e7852019-05-13 14:10:34 -0700106 bool connected() const { return connected_; }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500107 QuicTime writable_time() const { return writable_time_; }
108 QuicTime crypto_handshake_time() const { return crypto_handshake_time_; }
109
110 private:
QUICHE team6939de52019-05-15 12:05:21 -0700111 // Current session.
112 QuartcSession* session_ = nullptr;
113
114 // Number of new sessions created by the endpoint.
115 int num_sessions_created_ = 0;
116
QUICHE teama6ef0a62019-03-07 20:34:33 -0500117 QuartcStream* last_incoming_stream_;
vasilvvc48c8712019-03-11 13:38:16 -0700118 std::vector<std::string> incoming_messages_;
QUICHE team136e7852019-05-13 14:10:34 -0700119 std::vector<int64_t> sent_datagram_ids_;
QUICHE team68d15a82019-05-31 15:27:25 -0700120 std::map<int64_t, QuicTime> acked_datagram_id_to_receive_timestamp_;
121 std::vector<int64_t> lost_datagram_ids_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500122 bool connected_ = true;
123 QuartcStream::Delegate* stream_delegate_;
124 QuicTime writable_time_ = QuicTime::Zero();
125 QuicTime crypto_handshake_time_ = QuicTime::Zero();
126 const QuicClock* clock_;
127};
128
129class FakeQuartcStreamDelegate : public QuartcStream::Delegate {
130 public:
131 size_t OnReceived(QuartcStream* stream,
132 iovec* iov,
133 size_t iov_length,
dschinazi17d42422019-06-18 16:35:07 -0700134 bool /*fin*/) override {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500135 size_t bytes_consumed = 0;
136 for (size_t i = 0; i < iov_length; ++i) {
vasilvvc48c8712019-03-11 13:38:16 -0700137 received_data_[stream->id()] += std::string(
138 static_cast<const char*>(iov[i].iov_base), iov[i].iov_len);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500139 bytes_consumed += iov[i].iov_len;
140 }
141 return bytes_consumed;
142 }
143
144 void OnClose(QuartcStream* stream) override {
145 errors_[stream->id()] = stream->stream_error();
146 }
147
dschinazi17d42422019-06-18 16:35:07 -0700148 void OnBufferChanged(QuartcStream* /*stream*/) override {}
QUICHE teama6ef0a62019-03-07 20:34:33 -0500149
150 bool has_data() { return !received_data_.empty(); }
vasilvvc48c8712019-03-11 13:38:16 -0700151 std::map<QuicStreamId, std::string> data() { return received_data_; }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500152
153 QuicRstStreamErrorCode stream_error(QuicStreamId id) { return errors_[id]; }
154
155 private:
vasilvvc48c8712019-03-11 13:38:16 -0700156 std::map<QuicStreamId, std::string> received_data_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500157 std::map<QuicStreamId, QuicRstStreamErrorCode> errors_;
158};
159
160} // namespace quic
161
162#endif // QUICHE_QUIC_QUARTC_QUARTC_FAKES_H_