blob: f85413c55b587545bafc3f36deea5493672f5d32 [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
Niels Möller2e47f7c2018-10-16 10:41:42 +020035// Test only uses the sequence number.
36MediaTransportEncodedAudioFrame CreateAudioFrame(int sequence_number) {
37 static constexpr int kSamplingRateHz = 48000;
38 static constexpr int kStartingSampleIndex = 0;
39 static constexpr int kSamplesPerChannel = 480;
40 static constexpr uint8_t kPayloadType = 17;
41
42 return MediaTransportEncodedAudioFrame(
43 kSamplingRateHz, kStartingSampleIndex, kSamplesPerChannel,
44 sequence_number, MediaTransportEncodedAudioFrame::FrameType::kSpeech,
45 kPayloadType, std::vector<uint8_t>(kSamplesPerChannel));
46}
47
48} // namespace
49
50TEST(LoopbackMediaTransport, AudioWithNoSinkSilentlyIgnored) {
Bjorn Mellem273d0292018-11-01 16:42:44 -070051 std::unique_ptr<rtc::Thread> thread = rtc::Thread::Create();
52 thread->Start();
53 MediaTransportPair transport_pair(thread.get());
Niels Möller2e47f7c2018-10-16 10:41:42 +020054 transport_pair.first()->SendAudioFrame(1, CreateAudioFrame(0));
55 transport_pair.second()->SendAudioFrame(2, CreateAudioFrame(0));
Bjorn Mellem273d0292018-11-01 16:42:44 -070056 transport_pair.FlushAsyncInvokes();
Niels Möller2e47f7c2018-10-16 10:41:42 +020057}
58
59TEST(LoopbackMediaTransport, AudioDeliveredToSink) {
Bjorn Mellem273d0292018-11-01 16:42:44 -070060 std::unique_ptr<rtc::Thread> thread = rtc::Thread::Create();
61 thread->Start();
62 MediaTransportPair transport_pair(thread.get());
Niels Möller2e47f7c2018-10-16 10:41:42 +020063 testing::StrictMock<MockMediaTransportAudioSinkInterface> sink;
64 EXPECT_CALL(sink,
65 OnData(1, testing::Property(
66 &MediaTransportEncodedAudioFrame::sequence_number,
67 testing::Eq(10))));
68 transport_pair.second()->SetReceiveAudioSink(&sink);
69 transport_pair.first()->SendAudioFrame(1, CreateAudioFrame(10));
70
Bjorn Mellem273d0292018-11-01 16:42:44 -070071 transport_pair.FlushAsyncInvokes();
Niels Möller2e47f7c2018-10-16 10:41:42 +020072 transport_pair.second()->SetReceiveAudioSink(nullptr);
73}
74
Bjorn Mellem273d0292018-11-01 16:42:44 -070075TEST(LoopbackMediaTransport, DataDeliveredToSink) {
76 std::unique_ptr<rtc::Thread> thread = rtc::Thread::Create();
77 thread->Start();
78 MediaTransportPair transport_pair(thread.get());
79
80 MockDataChannelSink sink;
81 transport_pair.first()->SetDataSink(&sink);
82
83 const int channel_id = 1;
84 EXPECT_CALL(sink,
85 OnDataReceived(
86 channel_id, DataMessageType::kText,
87 testing::Property<rtc::CopyOnWriteBuffer, const char*>(
88 &rtc::CopyOnWriteBuffer::cdata, testing::StrEq("foo"))));
89
90 SendDataParams params;
91 params.type = DataMessageType::kText;
92 rtc::CopyOnWriteBuffer buffer("foo");
93 transport_pair.second()->SendData(channel_id, params, buffer);
94
95 transport_pair.FlushAsyncInvokes();
96 transport_pair.first()->SetDataSink(nullptr);
97}
98
99TEST(LoopbackMediaTransport, CloseDeliveredToSink) {
100 std::unique_ptr<rtc::Thread> thread = rtc::Thread::Create();
101 thread->Start();
102 MediaTransportPair transport_pair(thread.get());
103
104 MockDataChannelSink first_sink;
105 transport_pair.first()->SetDataSink(&first_sink);
106
107 MockDataChannelSink second_sink;
108 transport_pair.second()->SetDataSink(&second_sink);
109
110 const int channel_id = 1;
111 {
112 testing::InSequence s;
113 EXPECT_CALL(second_sink, OnChannelClosing(channel_id));
114 EXPECT_CALL(second_sink, OnChannelClosed(channel_id));
115 EXPECT_CALL(first_sink, OnChannelClosed(channel_id));
116 }
117
118 transport_pair.first()->CloseChannel(channel_id);
119
120 transport_pair.FlushAsyncInvokes();
121 transport_pair.first()->SetDataSink(nullptr);
122 transport_pair.second()->SetDataSink(nullptr);
123}
124
Niels Möller2e47f7c2018-10-16 10:41:42 +0200125} // namespace webrtc