blob: ba741a05ca79862d68340e825d7ccd50deaf27b7 [file] [log] [blame]
Niels Möller2e47f7c2018-10-16 10:41:42 +02001/*
2 * Copyright 2018 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Bjorn Mellem273d0292018-11-01 16:42:44 -070011#include <memory>
Niels Möller2e47f7c2018-10-16 10:41:42 +020012#include <vector>
13
14#include "api/test/loopback_media_transport.h"
15#include "test/gmock.h"
16
17namespace webrtc {
18
19namespace {
20
21class MockMediaTransportAudioSinkInterface
22 : public MediaTransportAudioSinkInterface {
23 public:
24 MOCK_METHOD2(OnData, void(uint64_t, MediaTransportEncodedAudioFrame));
25};
26
Bjorn Mellem273d0292018-11-01 16:42:44 -070027class MockDataChannelSink : public DataChannelSink {
28 public:
29 MOCK_METHOD3(OnDataReceived,
30 void(int, DataMessageType, const rtc::CopyOnWriteBuffer&));
31 MOCK_METHOD1(OnChannelClosing, void(int));
32 MOCK_METHOD1(OnChannelClosed, void(int));
33};
34
Bjorn Mellem175aa2e2018-11-08 11:23:22 -080035class MockStateCallback : public MediaTransportStateCallback {
36 public:
37 MOCK_METHOD1(OnStateChanged, void(MediaTransportState));
38};
39
Niels Möller2e47f7c2018-10-16 10:41:42 +020040// Test only uses the sequence number.
41MediaTransportEncodedAudioFrame CreateAudioFrame(int sequence_number) {
42 static constexpr int kSamplingRateHz = 48000;
43 static constexpr int kStartingSampleIndex = 0;
44 static constexpr int kSamplesPerChannel = 480;
45 static constexpr uint8_t kPayloadType = 17;
46
47 return MediaTransportEncodedAudioFrame(
48 kSamplingRateHz, kStartingSampleIndex, kSamplesPerChannel,
49 sequence_number, MediaTransportEncodedAudioFrame::FrameType::kSpeech,
50 kPayloadType, std::vector<uint8_t>(kSamplesPerChannel));
51}
52
53} // namespace
54
55TEST(LoopbackMediaTransport, AudioWithNoSinkSilentlyIgnored) {
Bjorn Mellem273d0292018-11-01 16:42:44 -070056 std::unique_ptr<rtc::Thread> thread = rtc::Thread::Create();
57 thread->Start();
58 MediaTransportPair transport_pair(thread.get());
Niels Möller2e47f7c2018-10-16 10:41:42 +020059 transport_pair.first()->SendAudioFrame(1, CreateAudioFrame(0));
60 transport_pair.second()->SendAudioFrame(2, CreateAudioFrame(0));
Bjorn Mellem273d0292018-11-01 16:42:44 -070061 transport_pair.FlushAsyncInvokes();
Niels Möller2e47f7c2018-10-16 10:41:42 +020062}
63
64TEST(LoopbackMediaTransport, AudioDeliveredToSink) {
Bjorn Mellem273d0292018-11-01 16:42:44 -070065 std::unique_ptr<rtc::Thread> thread = rtc::Thread::Create();
66 thread->Start();
67 MediaTransportPair transport_pair(thread.get());
Niels Möller2e47f7c2018-10-16 10:41:42 +020068 testing::StrictMock<MockMediaTransportAudioSinkInterface> sink;
69 EXPECT_CALL(sink,
70 OnData(1, testing::Property(
71 &MediaTransportEncodedAudioFrame::sequence_number,
72 testing::Eq(10))));
73 transport_pair.second()->SetReceiveAudioSink(&sink);
74 transport_pair.first()->SendAudioFrame(1, CreateAudioFrame(10));
75
Bjorn Mellem273d0292018-11-01 16:42:44 -070076 transport_pair.FlushAsyncInvokes();
Niels Möller2e47f7c2018-10-16 10:41:42 +020077 transport_pair.second()->SetReceiveAudioSink(nullptr);
78}
79
Bjorn Mellem273d0292018-11-01 16:42:44 -070080TEST(LoopbackMediaTransport, DataDeliveredToSink) {
81 std::unique_ptr<rtc::Thread> thread = rtc::Thread::Create();
82 thread->Start();
83 MediaTransportPair transport_pair(thread.get());
84
85 MockDataChannelSink sink;
86 transport_pair.first()->SetDataSink(&sink);
87
88 const int channel_id = 1;
89 EXPECT_CALL(sink,
90 OnDataReceived(
91 channel_id, DataMessageType::kText,
92 testing::Property<rtc::CopyOnWriteBuffer, const char*>(
93 &rtc::CopyOnWriteBuffer::cdata, testing::StrEq("foo"))));
94
95 SendDataParams params;
96 params.type = DataMessageType::kText;
97 rtc::CopyOnWriteBuffer buffer("foo");
98 transport_pair.second()->SendData(channel_id, params, buffer);
99
100 transport_pair.FlushAsyncInvokes();
101 transport_pair.first()->SetDataSink(nullptr);
102}
103
104TEST(LoopbackMediaTransport, CloseDeliveredToSink) {
105 std::unique_ptr<rtc::Thread> thread = rtc::Thread::Create();
106 thread->Start();
107 MediaTransportPair transport_pair(thread.get());
108
109 MockDataChannelSink first_sink;
110 transport_pair.first()->SetDataSink(&first_sink);
111
112 MockDataChannelSink second_sink;
113 transport_pair.second()->SetDataSink(&second_sink);
114
115 const int channel_id = 1;
116 {
117 testing::InSequence s;
118 EXPECT_CALL(second_sink, OnChannelClosing(channel_id));
119 EXPECT_CALL(second_sink, OnChannelClosed(channel_id));
120 EXPECT_CALL(first_sink, OnChannelClosed(channel_id));
121 }
122
123 transport_pair.first()->CloseChannel(channel_id);
124
125 transport_pair.FlushAsyncInvokes();
126 transport_pair.first()->SetDataSink(nullptr);
127 transport_pair.second()->SetDataSink(nullptr);
128}
129
Bjorn Mellem175aa2e2018-11-08 11:23:22 -0800130TEST(LoopbackMediaTransport, InitialStateDeliveredWhenCallbackSet) {
131 std::unique_ptr<rtc::Thread> thread = rtc::Thread::Create();
132 thread->Start();
133 MediaTransportPair transport_pair(thread.get());
134
135 MockStateCallback state_callback;
136
137 EXPECT_CALL(state_callback, OnStateChanged(MediaTransportState::kPending));
138 transport_pair.first()->SetMediaTransportStateCallback(&state_callback);
139 transport_pair.FlushAsyncInvokes();
140}
141
142TEST(LoopbackMediaTransport, ChangedStateDeliveredWhenCallbackSet) {
143 std::unique_ptr<rtc::Thread> thread = rtc::Thread::Create();
144 thread->Start();
145 MediaTransportPair transport_pair(thread.get());
146
147 transport_pair.SetState(MediaTransportState::kWritable);
148 transport_pair.FlushAsyncInvokes();
149
150 MockStateCallback state_callback;
151
152 EXPECT_CALL(state_callback, OnStateChanged(MediaTransportState::kWritable));
153 transport_pair.first()->SetMediaTransportStateCallback(&state_callback);
154 transport_pair.FlushAsyncInvokes();
155}
156
157TEST(LoopbackMediaTransport, StateChangeDeliveredToCallback) {
158 std::unique_ptr<rtc::Thread> thread = rtc::Thread::Create();
159 thread->Start();
160 MediaTransportPair transport_pair(thread.get());
161
162 MockStateCallback state_callback;
163
164 EXPECT_CALL(state_callback, OnStateChanged(MediaTransportState::kPending));
165 EXPECT_CALL(state_callback, OnStateChanged(MediaTransportState::kWritable));
166 transport_pair.first()->SetMediaTransportStateCallback(&state_callback);
167 transport_pair.SetState(MediaTransportState::kWritable);
168 transport_pair.FlushAsyncInvokes();
169}
170
Niels Möller2e47f7c2018-10-16 10:41:42 +0200171} // namespace webrtc