blob: 301e242874a86eac148b497464b972b184947886 [file] [log] [blame]
[email protected]1e2076be2012-03-05 01:16:331// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]57651a82011-12-13 03:54:282// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "remoting/protocol/connection_tester.h"
6
7#include "base/bind.h"
[email protected]57651a82011-12-13 03:54:288#include "net/base/io_buffer.h"
9#include "net/base/net_errors.h"
Ramin Halavatia621c1f2018-02-14 20:50:4610#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
sergeyu786463e2016-02-04 18:46:1011#include "remoting/proto/video.pb.h"
12#include "remoting/protocol/message_pipe.h"
13#include "remoting/protocol/message_serialization.h"
sergeyuaa22c082015-07-20 19:41:1314#include "remoting/protocol/p2p_datagram_socket.h"
15#include "remoting/protocol/p2p_stream_socket.h"
[email protected]57651a82011-12-13 03:54:2816#include "testing/gtest/include/gtest/gtest.h"
17
18namespace remoting {
19namespace protocol {
20
sergeyuaa22c082015-07-20 19:41:1321StreamConnectionTester::StreamConnectionTester(P2PStreamSocket* client_socket,
22 P2PStreamSocket* host_socket,
[email protected]57651a82011-12-13 03:54:2823 int message_size,
24 int message_count)
Gabriel Charetteb79557e2019-06-20 19:17:0025 : host_socket_(host_socket),
[email protected]57651a82011-12-13 03:54:2826 client_socket_(client_socket),
27 message_size_(message_size),
[email protected]57651a82011-12-13 03:54:2828 test_data_size_(message_size * message_count),
[email protected]57651a82011-12-13 03:54:2829 write_errors_(0),
fdoray6d056ff2016-07-04 21:56:4230 read_errors_(0) {}
[email protected]57651a82011-12-13 03:54:2831
Chris Watkins6fe52aa2017-11-28 03:24:0532StreamConnectionTester::~StreamConnectionTester() = default;
[email protected]57651a82011-12-13 03:54:2833
Gabriel Charetteb79557e2019-06-20 19:17:0034void StreamConnectionTester::Start(base::OnceClosure on_done) {
35 on_done_ = std::move(on_done);
[email protected]57651a82011-12-13 03:54:2836 InitBuffers();
37 DoRead();
38 DoWrite();
39}
40
41void StreamConnectionTester::CheckResults() {
42 EXPECT_EQ(0, write_errors_);
43 EXPECT_EQ(0, read_errors_);
44
45 ASSERT_EQ(test_data_size_, input_buffer_->offset());
46
47 output_buffer_->SetOffset(0);
48 ASSERT_EQ(test_data_size_, output_buffer_->size());
49
50 EXPECT_EQ(0, memcmp(output_buffer_->data(),
51 input_buffer_->StartOfBuffer(), test_data_size_));
52}
53
54void StreamConnectionTester::Done() {
Gabriel Charetteb79557e2019-06-20 19:17:0055 std::move(on_done_).Run();
[email protected]57651a82011-12-13 03:54:2856}
57
58void StreamConnectionTester::InitBuffers() {
Victor Costancd439782018-08-30 07:27:5759 output_buffer_ = base::MakeRefCounted<net::DrainableIOBuffer>(
60 base::MakeRefCounted<net::IOBuffer>(test_data_size_), test_data_size_);
[email protected]16934f32011-12-13 22:04:3861 for (int i = 0; i < test_data_size_; ++i) {
62 output_buffer_->data()[i] = static_cast<char>(i);
63 }
[email protected]57651a82011-12-13 03:54:2864
Victor Costan8a7a19a2018-09-10 21:57:1665 input_buffer_ = base::MakeRefCounted<net::GrowableIOBuffer>();
[email protected]57651a82011-12-13 03:54:2866}
67
68void StreamConnectionTester::DoWrite() {
69 int result = 1;
70 while (result > 0) {
71 if (output_buffer_->BytesRemaining() == 0)
72 break;
73
74 int bytes_to_write = std::min(output_buffer_->BytesRemaining(),
75 message_size_);
Jan Wilken Dörriea0e772a2020-04-01 18:28:1976 result =
77 client_socket_->Write(output_buffer_.get(), bytes_to_write,
78 base::BindOnce(&StreamConnectionTester::OnWritten,
79 base::Unretained(this)),
80 TRAFFIC_ANNOTATION_FOR_TESTS);
[email protected]57651a82011-12-13 03:54:2881 HandleWriteResult(result);
82 }
83}
84
85void StreamConnectionTester::OnWritten(int result) {
86 HandleWriteResult(result);
87 DoWrite();
88}
89
90void StreamConnectionTester::HandleWriteResult(int result) {
91 if (result <= 0 && result != net::ERR_IO_PENDING) {
92 LOG(ERROR) << "Received error " << result << " when trying to write";
93 write_errors_++;
94 Done();
95 } else if (result > 0) {
96 output_buffer_->DidConsume(result);
97 }
98}
99
100void StreamConnectionTester::DoRead() {
101 int result = 1;
102 while (result > 0) {
103 input_buffer_->SetCapacity(input_buffer_->offset() + message_size_);
Jan Wilken Dörriea0e772a2020-04-01 18:28:19104 result = host_socket_->Read(input_buffer_.get(), message_size_,
105 base::BindOnce(&StreamConnectionTester::OnRead,
106 base::Unretained(this)));
[email protected]57651a82011-12-13 03:54:28107 HandleReadResult(result);
108 };
109}
110
111void StreamConnectionTester::OnRead(int result) {
112 HandleReadResult(result);
Gabriel Charetteb79557e2019-06-20 19:17:00113 if (!on_done_.is_null())
[email protected]57651a82011-12-13 03:54:28114 DoRead(); // Don't try to read again when we are done reading.
115}
116
117void StreamConnectionTester::HandleReadResult(int result) {
118 if (result <= 0 && result != net::ERR_IO_PENDING) {
119 LOG(ERROR) << "Received error " << result << " when trying to read";
120 read_errors_++;
121 Done();
122 } else if (result > 0) {
123 // Allocate memory for the next read.
124 input_buffer_->set_offset(input_buffer_->offset() + result);
125 if (input_buffer_->offset() == test_data_size_)
126 Done();
127 }
128}
129
sergeyu5b4667b2017-03-17 19:12:48130class MessagePipeConnectionTester::MessageSender
131 : public MessagePipe::EventHandler {
132 public:
133 MessageSender(MessagePipe* pipe, int message_size, int message_count)
134 : pipe_(pipe),
135 message_size_(message_size),
136 message_count_(message_count) {}
137
138 void Start() { pipe_->Start(this); }
139
140 const std::vector<std::unique_ptr<VideoPacket>>& sent_messages() {
141 return sent_messages_;
142 }
143
144 // MessagePipe::EventHandler interface.
145 void OnMessagePipeOpen() override {
146 for (int i = 0; i < message_count_; ++i) {
147 std::unique_ptr<VideoPacket> message(new VideoPacket());
148 message->mutable_data()->resize(message_size_);
149 for (int p = 0; p < message_size_; ++p) {
150 message->mutable_data()[0] = static_cast<char>(i + p);
151 }
Evan Stade86dadf152020-03-16 20:06:33152 pipe_->Send(message.get(), {});
sergeyu5b4667b2017-03-17 19:12:48153 sent_messages_.push_back(std::move(message));
154 }
155 }
156 void OnMessageReceived(std::unique_ptr<CompoundBuffer> message) override {
157 NOTREACHED();
158 }
159 void OnMessagePipeClosed() override { NOTREACHED(); }
160
161 private:
162 MessagePipe* pipe_;
163 int message_size_;
164 int message_count_;
165
166 std::vector<std::unique_ptr<VideoPacket>> sent_messages_;
167};
168
sergeyu786463e2016-02-04 18:46:10169MessagePipeConnectionTester::MessagePipeConnectionTester(
sergeyu786463e2016-02-04 18:46:10170 MessagePipe* host_pipe,
sergeyu5b4667b2017-03-17 19:12:48171 MessagePipe* client_pipe,
sergeyu786463e2016-02-04 18:46:10172 int message_size,
173 int message_count)
sergeyu5b4667b2017-03-17 19:12:48174 : client_pipe_(client_pipe),
175 sender_(new MessageSender(host_pipe, message_size, message_count)) {}
176
Chris Watkins6fe52aa2017-11-28 03:24:05177MessagePipeConnectionTester::~MessagePipeConnectionTester() = default;
sergeyu786463e2016-02-04 18:46:10178
179void MessagePipeConnectionTester::RunAndCheckResults() {
sergeyu5b4667b2017-03-17 19:12:48180 sender_->Start();
181 client_pipe_->Start(this);
sergeyu786463e2016-02-04 18:46:10182
183 run_loop_.Run();
184
sergeyu5b4667b2017-03-17 19:12:48185 ASSERT_EQ(sender_->sent_messages().size(), received_messages_.size());
186 for (size_t i = 0; i < sender_->sent_messages().size(); ++i) {
187 EXPECT_TRUE(sender_->sent_messages()[i]->data() ==
188 received_messages_[i]->data());
sergeyu786463e2016-02-04 18:46:10189 }
190}
191
sergeyu5b4667b2017-03-17 19:12:48192void MessagePipeConnectionTester::OnMessagePipeOpen() {}
193
sergeyu786463e2016-02-04 18:46:10194void MessagePipeConnectionTester::OnMessageReceived(
dcheng0765c492016-04-06 22:41:53195 std::unique_ptr<CompoundBuffer> message) {
sergeyu786463e2016-02-04 18:46:10196 received_messages_.push_back(ParseMessage<VideoPacket>(message.get()));
sergeyu5b4667b2017-03-17 19:12:48197 if (received_messages_.size() >= sender_->sent_messages().size()) {
sergeyu786463e2016-02-04 18:46:10198 run_loop_.Quit();
199 }
200}
201
sergeyud059c462016-07-20 19:34:10202void MessagePipeConnectionTester::OnMessagePipeClosed() {
203 run_loop_.Quit();
204 FAIL();
205}
206
[email protected]57651a82011-12-13 03:54:28207} // namespace protocol
208} // namespace remoting