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 "rtc_base/ref_counted_object.h"
17 #include "test/gmock.h"
18 #include "test/gtest.h"
19 #include "test/mock_frame_transformer.h"
20 #include "test/mock_transformable_frame.h"
21
22 namespace webrtc {
23 namespace {
24
25 using ::testing::NiceMock;
26 using ::testing::SaveArg;
27
28 class MockChannelReceive {
29 public:
30 MOCK_METHOD(void,
31 ReceiveFrame,
32 (rtc::ArrayView<const uint8_t> packet, const RTPHeader& header));
33
callback()34 ChannelReceiveFrameTransformerDelegate::ReceiveFrameCallback callback() {
35 return [this](rtc::ArrayView<const uint8_t> packet,
36 const RTPHeader& header) { ReceiveFrame(packet, header); };
37 }
38 };
39
40 // Test that the delegate registers itself with the frame transformer on Init().
TEST(ChannelReceiveFrameTransformerDelegateTest,RegisterTransformedFrameCallbackOnInit)41 TEST(ChannelReceiveFrameTransformerDelegateTest,
42 RegisterTransformedFrameCallbackOnInit) {
43 rtc::scoped_refptr<MockFrameTransformer> mock_frame_transformer =
44 new rtc::RefCountedObject<MockFrameTransformer>();
45 rtc::scoped_refptr<ChannelReceiveFrameTransformerDelegate> delegate =
46 new rtc::RefCountedObject<ChannelReceiveFrameTransformerDelegate>(
47 ChannelReceiveFrameTransformerDelegate::ReceiveFrameCallback(),
48 mock_frame_transformer, nullptr);
49 EXPECT_CALL(*mock_frame_transformer, RegisterTransformedFrameCallback);
50 delegate->Init();
51 }
52
53 // Test that the delegate unregisters itself from the frame transformer on
54 // Reset().
TEST(ChannelReceiveFrameTransformerDelegateTest,UnregisterTransformedFrameCallbackOnReset)55 TEST(ChannelReceiveFrameTransformerDelegateTest,
56 UnregisterTransformedFrameCallbackOnReset) {
57 rtc::scoped_refptr<MockFrameTransformer> mock_frame_transformer =
58 new rtc::RefCountedObject<MockFrameTransformer>();
59 rtc::scoped_refptr<ChannelReceiveFrameTransformerDelegate> delegate =
60 new rtc::RefCountedObject<ChannelReceiveFrameTransformerDelegate>(
61 ChannelReceiveFrameTransformerDelegate::ReceiveFrameCallback(),
62 mock_frame_transformer, nullptr);
63 EXPECT_CALL(*mock_frame_transformer, UnregisterTransformedFrameCallback);
64 delegate->Reset();
65 }
66
67 // Test that when the delegate receives a transformed frame from the frame
68 // transformer, it passes it to the channel using the ReceiveFrameCallback.
TEST(ChannelReceiveFrameTransformerDelegateTest,TransformRunsChannelReceiveCallback)69 TEST(ChannelReceiveFrameTransformerDelegateTest,
70 TransformRunsChannelReceiveCallback) {
71 rtc::scoped_refptr<MockFrameTransformer> mock_frame_transformer =
72 new rtc::RefCountedObject<NiceMock<MockFrameTransformer>>();
73 MockChannelReceive mock_channel;
74 rtc::scoped_refptr<ChannelReceiveFrameTransformerDelegate> delegate =
75 new rtc::RefCountedObject<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::scoped_refptr<MockFrameTransformer> mock_frame_transformer =
103 new rtc::RefCountedObject<testing::NiceMock<MockFrameTransformer>>();
104 MockChannelReceive mock_channel;
105 rtc::scoped_refptr<ChannelReceiveFrameTransformerDelegate> delegate =
106 new rtc::RefCountedObject<ChannelReceiveFrameTransformerDelegate>(
107 mock_channel.callback(), mock_frame_transformer,
108 rtc::Thread::Current());
109
110 delegate->Reset();
111 EXPECT_CALL(mock_channel, ReceiveFrame).Times(0);
112 delegate->OnTransformedFrame(std::make_unique<MockTransformableFrame>());
113 rtc::ThreadManager::ProcessAllMessageQueuesForTesting();
114 }
115
116 } // namespace
117 } // namespace webrtc
118