blob: 95ae9a5aba8da02b86d5955bc39d300fd570d105 [file] [log] [blame]
sergeyu97568a8162015-02-24 18:00:551// Copyright 2015 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#include "remoting/protocol/client_video_dispatcher.h"
6
avi954c9c1d2017-01-11 16:52:377#include <memory>
Erik Jensen56d7f2e2019-02-20 01:38:568#include <utility>
avi954c9c1d2017-01-11 16:52:379#include <vector>
10
sergeyu97568a8162015-02-24 18:00:5511#include "base/bind.h"
sergeyu97568a8162015-02-24 18:00:5512#include "base/run_loop.h"
Gabriel Charettec7108742019-08-23 03:31:4013#include "base/test/task_environment.h"
[email protected]f94cd9702017-12-07 06:09:4014#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
sergeyuaa22c082015-07-20 19:41:1315#include "remoting/base/buffered_socket_writer.h"
sergeyu97568a8162015-02-24 18:00:5516#include "remoting/base/constants.h"
17#include "remoting/proto/video.pb.h"
sergeyu97568a8162015-02-24 18:00:5518#include "remoting/protocol/fake_stream_socket.h"
sergeyuf1005f62016-02-03 21:11:3019#include "remoting/protocol/message_reader.h"
sergeyu97568a8162015-02-24 18:00:5520#include "remoting/protocol/message_serialization.h"
sergeyu00a67b12016-04-01 00:07:0021#include "remoting/protocol/protocol_mock_objects.h"
sergeyu786463e2016-02-04 18:46:1022#include "remoting/protocol/stream_message_pipe_adapter.h"
sergeyu97568a8162015-02-24 18:00:5523#include "remoting/protocol/video_stub.h"
24#include "testing/gtest/include/gtest/gtest.h"
25
26namespace remoting {
27namespace protocol {
28
29class ClientVideoDispatcherTest : public testing::Test,
30 public VideoStub,
31 public ChannelDispatcherBase::EventHandler {
32 public:
33 ClientVideoDispatcherTest();
34
35 // VideoStub interface.
dcheng0765c492016-04-06 22:41:5336 void ProcessVideoPacket(std::unique_ptr<VideoPacket> video_packet,
Erik Jensen56d7f2e2019-02-20 01:38:5637 base::OnceClosure done) override;
sergeyu97568a8162015-02-24 18:00:5538
39 // ChannelDispatcherBase::EventHandler interface.
40 void OnChannelInitialized(ChannelDispatcherBase* channel_dispatcher) override;
sergeyud059c462016-07-20 19:34:1041 void OnChannelClosed(ChannelDispatcherBase* channel_dispatcher) override;
sergeyu97568a8162015-02-24 18:00:5542
43 protected:
sergeyu786463e2016-02-04 18:46:1044 void OnChannelError(int error);
45
dcheng0765c492016-04-06 22:41:5346 void OnMessageReceived(std::unique_ptr<CompoundBuffer> buffer);
sergeyua04c0462015-05-14 01:48:4047 void OnReadError(int error);
sergeyu97568a8162015-02-24 18:00:5548
Gabriel Charettedf0a7442019-09-05 17:32:3549 base::test::SingleThreadTaskEnvironment task_environment_;
sergeyu97568a8162015-02-24 18:00:5550
51 // Set to true in OnChannelInitialized().
sergeyu786463e2016-02-04 18:46:1052 bool initialized_ = false;
sergeyu97568a8162015-02-24 18:00:5553
54 // Client side.
sergeyu38e73d42015-12-18 06:50:0455 FakeStreamChannelFactory client_channel_factory_;
sergeyu786463e2016-02-04 18:46:1056 StreamMessageChannelFactoryAdapter channel_factory_adapter_;
sergeyu00a67b12016-04-01 00:07:0057 MockClientStub client_stub_;
sergeyu97568a8162015-02-24 18:00:5558 ClientVideoDispatcher dispatcher_;
sergeyu97568a8162015-02-24 18:00:5559
60 // Host side.
61 FakeStreamSocket host_socket_;
62 MessageReader reader_;
sergeyu97568a8162015-02-24 18:00:5563 BufferedSocketWriter writer_;
64
avi954c9c1d2017-01-11 16:52:3765 std::vector<std::unique_ptr<VideoPacket>> video_packets_;
Erik Jensen56d7f2e2019-02-20 01:38:5666 std::vector<base::OnceClosure> packet_done_callbacks_;
sergeyu97568a8162015-02-24 18:00:5567
avi954c9c1d2017-01-11 16:52:3768 std::vector<std::unique_ptr<VideoAck>> ack_messages_;
sergeyu97568a8162015-02-24 18:00:5569};
70
71ClientVideoDispatcherTest::ClientVideoDispatcherTest()
sergeyu786463e2016-02-04 18:46:1072 : channel_factory_adapter_(
73 &client_channel_factory_,
74 base::Bind(&ClientVideoDispatcherTest::OnChannelError,
75 base::Unretained(this))),
sergeyu00a67b12016-04-01 00:07:0076 dispatcher_(this, &client_stub_) {
sergeyu786463e2016-02-04 18:46:1077 dispatcher_.Init(&channel_factory_adapter_, this);
sergeyu97568a8162015-02-24 18:00:5578 base::RunLoop().RunUntilIdle();
79 DCHECK(initialized_);
80 host_socket_.PairWith(
sergeyu38e73d42015-12-18 06:50:0481 client_channel_factory_.GetFakeChannel(kVideoChannelName));
sergeyua04c0462015-05-14 01:48:4082 reader_.StartReading(&host_socket_,
sergeyud8af2ca2016-01-30 03:04:3683 base::Bind(&ClientVideoDispatcherTest::OnMessageReceived,
84 base::Unretained(this)),
sergeyua04c0462015-05-14 01:48:4085 base::Bind(&ClientVideoDispatcherTest::OnReadError,
86 base::Unretained(this)));
sergeyuc3497fc2016-01-14 06:53:0187 writer_.Start(
sergeyuaa22c082015-07-20 19:41:1388 base::Bind(&P2PStreamSocket::Write, base::Unretained(&host_socket_)),
89 BufferedSocketWriter::WriteFailedCallback());
sergeyu97568a8162015-02-24 18:00:5590}
91
92void ClientVideoDispatcherTest::ProcessVideoPacket(
dcheng0765c492016-04-06 22:41:5393 std::unique_ptr<VideoPacket> video_packet,
Erik Jensen56d7f2e2019-02-20 01:38:5694 base::OnceClosure done) {
avi954c9c1d2017-01-11 16:52:3795 video_packets_.push_back(std::move(video_packet));
Erik Jensen56d7f2e2019-02-20 01:38:5696 packet_done_callbacks_.push_back(std::move(done));
sergeyu97568a8162015-02-24 18:00:5597}
98
99void ClientVideoDispatcherTest::OnChannelInitialized(
100 ChannelDispatcherBase* channel_dispatcher) {
101 initialized_ = true;
102}
103
sergeyud059c462016-07-20 19:34:10104void ClientVideoDispatcherTest::OnChannelClosed(
105 ChannelDispatcherBase* channel_dispatcher) {
106 // Don't expect channels to be closed.
107 FAIL();
108}
109
sergeyu786463e2016-02-04 18:46:10110void ClientVideoDispatcherTest::OnChannelError(int error) {
sergeyu97568a8162015-02-24 18:00:55111 // Don't expect channel creation to fail.
112 FAIL();
113}
114
sergeyud8af2ca2016-01-30 03:04:36115void ClientVideoDispatcherTest::OnMessageReceived(
dcheng0765c492016-04-06 22:41:53116 std::unique_ptr<CompoundBuffer> buffer) {
117 std::unique_ptr<VideoAck> ack = ParseMessage<VideoAck>(buffer.get());
sergeyud8af2ca2016-01-30 03:04:36118 EXPECT_TRUE(ack);
avi954c9c1d2017-01-11 16:52:37119 ack_messages_.push_back(std::move(ack));
sergeyu97568a8162015-02-24 18:00:55120}
121
sergeyua04c0462015-05-14 01:48:40122void ClientVideoDispatcherTest::OnReadError(int error) {
123 LOG(FATAL) << "Unexpected read error: " << error;
124}
125
sergeyu97568a8162015-02-24 18:00:55126// Verify that the client can receive video packets and acks are not sent for
127// VideoPackets that don't have frame_id field set.
128TEST_F(ClientVideoDispatcherTest, WithoutAcks) {
129 VideoPacket packet;
130 packet.set_data(std::string());
131
132 // Send a VideoPacket and verify that the client receives it.
Evan Stade86dadf152020-03-16 20:06:33133 writer_.Write(SerializeAndFrameMessage(packet), {},
[email protected]f94cd9702017-12-07 06:09:40134 TRAFFIC_ANNOTATION_FOR_TESTS);
sergeyu97568a8162015-02-24 18:00:55135 base::RunLoop().RunUntilIdle();
136 EXPECT_EQ(1U, video_packets_.size());
137
Erik Jensen56d7f2e2019-02-20 01:38:56138 std::move(packet_done_callbacks_.front()).Run();
sergeyu97568a8162015-02-24 18:00:55139 base::RunLoop().RunUntilIdle();
140
141 // Ack should never be sent for the packet without frame_id.
142 EXPECT_TRUE(ack_messages_.empty());
143}
144
145// Verifies that the dispatcher sends Ack message with correct rendering delay.
146TEST_F(ClientVideoDispatcherTest, WithAcks) {
147 int kTestFrameId = 3;
148
149 VideoPacket packet;
150 packet.set_data(std::string());
151 packet.set_frame_id(kTestFrameId);
152
153 // Send a VideoPacket and verify that the client receives it.
Evan Stade86dadf152020-03-16 20:06:33154 writer_.Write(SerializeAndFrameMessage(packet), {},
[email protected]f94cd9702017-12-07 06:09:40155 TRAFFIC_ANNOTATION_FOR_TESTS);
sergeyu97568a8162015-02-24 18:00:55156 base::RunLoop().RunUntilIdle();
157 EXPECT_EQ(1U, video_packets_.size());
158
159 // Ack should only be sent after the packet is processed.
160 EXPECT_TRUE(ack_messages_.empty());
161 base::RunLoop().RunUntilIdle();
162
163 // Fake completion of video packet decoding, to trigger the Ack.
Erik Jensen56d7f2e2019-02-20 01:38:56164 std::move(packet_done_callbacks_.front()).Run();
sergeyu97568a8162015-02-24 18:00:55165 base::RunLoop().RunUntilIdle();
166
167 // Verify that the Ack message has been received.
168 ASSERT_EQ(1U, ack_messages_.size());
169 EXPECT_EQ(kTestFrameId, ack_messages_[0]->frame_id());
170}
171
sergeyu00a67b12016-04-01 00:07:00172// Verifies that the dispatcher properly synthesizes VideoLayout message when
173// screen size changes.
174TEST_F(ClientVideoDispatcherTest, VideoLayout) {
175 const int kScreenSize = 100;
176 const float kScaleFactor = 2.0;
177
178 VideoPacket packet;
179 packet.set_data(std::string());
180 packet.set_frame_id(42);
181 packet.mutable_format()->set_screen_width(kScreenSize);
182 packet.mutable_format()->set_screen_height(kScreenSize);
183 packet.mutable_format()->set_x_dpi(kDefaultDpi * kScaleFactor);
184 packet.mutable_format()->set_y_dpi(kDefaultDpi * kScaleFactor);
185
186 VideoLayout layout;
187 EXPECT_CALL(client_stub_, SetVideoLayout(testing::_))
188 .WillOnce(testing::SaveArg<0>(&layout));
189
190 // Send a VideoPacket and verify that the client receives it.
Evan Stade86dadf152020-03-16 20:06:33191 writer_.Write(SerializeAndFrameMessage(packet), {},
[email protected]f94cd9702017-12-07 06:09:40192 TRAFFIC_ANNOTATION_FOR_TESTS);
sergeyu00a67b12016-04-01 00:07:00193 base::RunLoop().RunUntilIdle();
194
195 ASSERT_EQ(1, layout.video_track_size());
196 EXPECT_EQ(0, layout.video_track(0).position_x());
197 EXPECT_EQ(0, layout.video_track(0).position_y());
198 EXPECT_EQ(kScreenSize / kScaleFactor, layout.video_track(0).width());
199 EXPECT_EQ(kScreenSize / kScaleFactor, layout.video_track(0).height());
200 EXPECT_EQ(kDefaultDpi * kScaleFactor, layout.video_track(0).x_dpi());
201 EXPECT_EQ(kDefaultDpi * kScaleFactor, layout.video_track(0).y_dpi());
202}
203
sergeyu97568a8162015-02-24 18:00:55204// Verify that Ack messages are sent in correct order.
205TEST_F(ClientVideoDispatcherTest, AcksOrder) {
206 int kTestFrameId = 3;
207
208 VideoPacket packet;
209 packet.set_data(std::string());
210 packet.set_frame_id(kTestFrameId);
211
212 // Send two VideoPackets.
Evan Stade86dadf152020-03-16 20:06:33213 writer_.Write(SerializeAndFrameMessage(packet), {},
[email protected]f94cd9702017-12-07 06:09:40214 TRAFFIC_ANNOTATION_FOR_TESTS);
sergeyu97568a8162015-02-24 18:00:55215 base::RunLoop().RunUntilIdle();
216
217 packet.set_frame_id(kTestFrameId + 1);
Evan Stade86dadf152020-03-16 20:06:33218 writer_.Write(SerializeAndFrameMessage(packet), {},
[email protected]f94cd9702017-12-07 06:09:40219 TRAFFIC_ANNOTATION_FOR_TESTS);
sergeyu97568a8162015-02-24 18:00:55220 base::RunLoop().RunUntilIdle();
221
222 EXPECT_EQ(2U, video_packets_.size());
223 EXPECT_TRUE(ack_messages_.empty());
224
225 // Call completion callbacks in revers order.
Erik Jensen56d7f2e2019-02-20 01:38:56226 std::move(packet_done_callbacks_[1]).Run();
227 std::move(packet_done_callbacks_[0]).Run();
sergeyu97568a8162015-02-24 18:00:55228
229 base::RunLoop().RunUntilIdle();
230
231 // Verify order of Ack messages.
232 ASSERT_EQ(2U, ack_messages_.size());
233 EXPECT_EQ(kTestFrameId, ack_messages_[0]->frame_id());
234 EXPECT_EQ(kTestFrameId + 1, ack_messages_[1]->frame_id());
235}
236
237} // namespace protocol
238} // namespace remoting