xref: /aosp_15_r20/external/webrtc/audio/channel_receive_frame_transformer_delegate_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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