• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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