1 /*
2 * Copyright (c) 2020 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
11 #include "audio/channel_receive_frame_transformer_delegate.h"
12
13 #include <memory>
14 #include <utility>
15
16 #include "test/gmock.h"
17 #include "test/gtest.h"
18 #include "test/mock_frame_transformer.h"
19 #include "test/mock_transformable_frame.h"
20
21 namespace webrtc {
22 namespace {
23
24 using ::testing::NiceMock;
25 using ::testing::SaveArg;
26
27 class MockChannelReceive {
28 public:
29 MOCK_METHOD(void,
30 ReceiveFrame,
31 (rtc::ArrayView<const uint8_t> packet, const RTPHeader& header));
32
callback()33 ChannelReceiveFrameTransformerDelegate::ReceiveFrameCallback callback() {
34 return [this](rtc::ArrayView<const uint8_t> packet,
35 const RTPHeader& header) { ReceiveFrame(packet, header); };
36 }
37 };
38
39 // Test that the delegate registers itself with the frame transformer on Init().
TEST(ChannelReceiveFrameTransformerDelegateTest,RegisterTransformedFrameCallbackOnInit)40 TEST(ChannelReceiveFrameTransformerDelegateTest,
41 RegisterTransformedFrameCallbackOnInit) {
42 rtc::scoped_refptr<MockFrameTransformer> mock_frame_transformer =
43 rtc::make_ref_counted<MockFrameTransformer>();
44 rtc::scoped_refptr<ChannelReceiveFrameTransformerDelegate> delegate =
45 rtc::make_ref_counted<ChannelReceiveFrameTransformerDelegate>(
46 ChannelReceiveFrameTransformerDelegate::ReceiveFrameCallback(),
47 mock_frame_transformer, nullptr);
48 EXPECT_CALL(*mock_frame_transformer, RegisterTransformedFrameCallback);
49 delegate->Init();
50 }
51
52 // Test that the delegate unregisters itself from the frame transformer on
53 // Reset().
TEST(ChannelReceiveFrameTransformerDelegateTest,UnregisterTransformedFrameCallbackOnReset)54 TEST(ChannelReceiveFrameTransformerDelegateTest,
55 UnregisterTransformedFrameCallbackOnReset) {
56 rtc::scoped_refptr<MockFrameTransformer> mock_frame_transformer =
57 rtc::make_ref_counted<MockFrameTransformer>();
58 rtc::scoped_refptr<ChannelReceiveFrameTransformerDelegate> delegate =
59 rtc::make_ref_counted<ChannelReceiveFrameTransformerDelegate>(
60 ChannelReceiveFrameTransformerDelegate::ReceiveFrameCallback(),
61 mock_frame_transformer, nullptr);
62 EXPECT_CALL(*mock_frame_transformer, UnregisterTransformedFrameCallback);
63 delegate->Reset();
64 }
65
66 // Test that when the delegate receives a transformed frame from the frame
67 // transformer, it passes it to the channel using the ReceiveFrameCallback.
TEST(ChannelReceiveFrameTransformerDelegateTest,TransformRunsChannelReceiveCallback)68 TEST(ChannelReceiveFrameTransformerDelegateTest,
69 TransformRunsChannelReceiveCallback) {
70 rtc::AutoThread main_thread;
71 rtc::scoped_refptr<MockFrameTransformer> mock_frame_transformer =
72 rtc::make_ref_counted<NiceMock<MockFrameTransformer>>();
73 MockChannelReceive mock_channel;
74 rtc::scoped_refptr<ChannelReceiveFrameTransformerDelegate> delegate =
75 rtc::make_ref_counted<ChannelReceiveFrameTransformerDelegate>(
76 mock_channel.callback(), mock_frame_transformer,
77 rtc::Thread::Current());
78 rtc::scoped_refptr<TransformedFrameCallback> callback;
79 EXPECT_CALL(*mock_frame_transformer, RegisterTransformedFrameCallback)
80 .WillOnce(SaveArg<0>(&callback));
81 delegate->Init();
82 ASSERT_TRUE(callback);
83
84 const uint8_t data[] = {1, 2, 3, 4};
85 rtc::ArrayView<const uint8_t> packet(data, sizeof(data));
86 RTPHeader header;
87 EXPECT_CALL(mock_channel, ReceiveFrame);
88 ON_CALL(*mock_frame_transformer, Transform)
89 .WillByDefault(
90 [&callback](std::unique_ptr<TransformableFrameInterface> frame) {
91 callback->OnTransformedFrame(std::move(frame));
92 });
93 delegate->Transform(packet, header, 1111 /*ssrc*/);
94 rtc::ThreadManager::ProcessAllMessageQueuesForTesting();
95 }
96
97 // Test that if the delegate receives a transformed frame after it has been
98 // reset, it does not run the ReceiveFrameCallback, as the channel is destroyed
99 // after resetting the delegate.
TEST(ChannelReceiveFrameTransformerDelegateTest,OnTransformedDoesNotRunChannelReceiveCallbackAfterReset)100 TEST(ChannelReceiveFrameTransformerDelegateTest,
101 OnTransformedDoesNotRunChannelReceiveCallbackAfterReset) {
102 rtc::AutoThread main_thread;
103 rtc::scoped_refptr<MockFrameTransformer> mock_frame_transformer =
104 rtc::make_ref_counted<testing::NiceMock<MockFrameTransformer>>();
105 MockChannelReceive mock_channel;
106 rtc::scoped_refptr<ChannelReceiveFrameTransformerDelegate> delegate =
107 rtc::make_ref_counted<ChannelReceiveFrameTransformerDelegate>(
108 mock_channel.callback(), mock_frame_transformer,
109 rtc::Thread::Current());
110
111 delegate->Reset();
112 EXPECT_CALL(mock_channel, ReceiveFrame).Times(0);
113 delegate->OnTransformedFrame(std::make_unique<MockTransformableFrame>());
114 rtc::ThreadManager::ProcessAllMessageQueuesForTesting();
115 }
116
117 } // namespace
118 } // namespace webrtc
119