OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include <utility> | 11 #include <utility> |
12 #include <vector> | 12 #include <vector> |
13 | 13 |
14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
15 #include "webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adapto
r_impl.h" | 15 #include "webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adapto
r_impl.h" |
16 #include "webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_controller
.h" | 16 #include "webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_controller
.h" |
17 #include "webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_controller
_manager.h" | 17 #include "webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_controller
_manager.h" |
| 18 #include "webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_debug_dump
_writer.h" |
18 | 19 |
19 namespace webrtc { | 20 namespace webrtc { |
20 | 21 |
21 using ::testing::_; | 22 using ::testing::_; |
22 using ::testing::NiceMock; | 23 using ::testing::NiceMock; |
23 using ::testing::Return; | 24 using ::testing::Return; |
| 25 using ::testing::SetArgPointee; |
24 | 26 |
25 namespace { | 27 namespace { |
26 | 28 |
27 constexpr size_t kNumControllers = 2; | 29 constexpr size_t kNumControllers = 2; |
28 | 30 |
| 31 constexpr int64_t kClockInitialTimeMs = 12345678; |
| 32 |
29 MATCHER_P(NetworkMetricsIs, metric, "") { | 33 MATCHER_P(NetworkMetricsIs, metric, "") { |
30 return arg.uplink_bandwidth_bps == metric.uplink_bandwidth_bps && | 34 return arg.uplink_bandwidth_bps == metric.uplink_bandwidth_bps && |
31 arg.target_audio_bitrate_bps == metric.target_audio_bitrate_bps && | 35 arg.target_audio_bitrate_bps == metric.target_audio_bitrate_bps && |
| 36 arg.rtt_ms == metric.rtt_ms && |
32 arg.uplink_packet_loss_fraction == metric.uplink_packet_loss_fraction; | 37 arg.uplink_packet_loss_fraction == metric.uplink_packet_loss_fraction; |
33 } | 38 } |
34 | 39 |
35 MATCHER_P(ConstraintsReceiverFrameLengthRangeIs, frame_length_range, "") { | 40 MATCHER_P(ConstraintsReceiverFrameLengthRangeIs, frame_length_range, "") { |
36 return arg.receiver_frame_length_range->min_frame_length_ms == | 41 return arg.receiver_frame_length_range->min_frame_length_ms == |
37 frame_length_range.min_frame_length_ms && | 42 frame_length_range.min_frame_length_ms && |
38 arg.receiver_frame_length_range->max_frame_length_ms == | 43 arg.receiver_frame_length_range->max_frame_length_ms == |
39 frame_length_range.max_frame_length_ms; | 44 frame_length_range.max_frame_length_ms; |
40 } | 45 } |
41 | 46 |
| 47 MATCHER_P(EncoderRuntimeConfigIs, config, "") { |
| 48 return arg.bitrate_bps == config.bitrate_bps && |
| 49 arg.frame_length_ms == config.frame_length_ms && |
| 50 arg.uplink_packet_loss_fraction == |
| 51 config.uplink_packet_loss_fraction && |
| 52 arg.enable_fec == config.enable_fec && |
| 53 arg.enable_dtx == config.enable_dtx && |
| 54 arg.num_channels == config.num_channels; |
| 55 } |
| 56 |
42 struct AudioNetworkAdaptorStates { | 57 struct AudioNetworkAdaptorStates { |
43 std::unique_ptr<AudioNetworkAdaptorImpl> audio_network_adaptor; | 58 std::unique_ptr<AudioNetworkAdaptorImpl> audio_network_adaptor; |
44 std::vector<std::unique_ptr<MockController>> mock_controllers; | 59 std::vector<std::unique_ptr<MockController>> mock_controllers; |
| 60 std::unique_ptr<SimulatedClock> simulated_clock; |
| 61 MockDebugDumpWriter* mock_debug_dump_writer; |
45 }; | 62 }; |
46 | 63 |
47 AudioNetworkAdaptorStates CreateAudioNetworkAdaptor() { | 64 AudioNetworkAdaptorStates CreateAudioNetworkAdaptor() { |
48 AudioNetworkAdaptorStates states; | 65 AudioNetworkAdaptorStates states; |
49 std::vector<Controller*> controllers; | 66 std::vector<Controller*> controllers; |
50 for (size_t i = 0; i < kNumControllers; ++i) { | 67 for (size_t i = 0; i < kNumControllers; ++i) { |
51 auto controller = | 68 auto controller = |
52 std::unique_ptr<MockController>(new NiceMock<MockController>()); | 69 std::unique_ptr<MockController>(new NiceMock<MockController>()); |
53 EXPECT_CALL(*controller, Die()); | 70 EXPECT_CALL(*controller, Die()); |
54 controllers.push_back(controller.get()); | 71 controllers.push_back(controller.get()); |
55 states.mock_controllers.push_back(std::move(controller)); | 72 states.mock_controllers.push_back(std::move(controller)); |
56 } | 73 } |
57 | 74 |
58 auto controller_manager = std::unique_ptr<MockControllerManager>( | 75 auto controller_manager = std::unique_ptr<MockControllerManager>( |
59 new NiceMock<MockControllerManager>()); | 76 new NiceMock<MockControllerManager>()); |
60 | 77 |
61 EXPECT_CALL(*controller_manager, Die()); | 78 EXPECT_CALL(*controller_manager, Die()); |
62 EXPECT_CALL(*controller_manager, GetControllers()) | 79 EXPECT_CALL(*controller_manager, GetControllers()) |
63 .WillRepeatedly(Return(controllers)); | 80 .WillRepeatedly(Return(controllers)); |
64 EXPECT_CALL(*controller_manager, GetSortedControllers(_)) | 81 EXPECT_CALL(*controller_manager, GetSortedControllers(_)) |
65 .WillRepeatedly(Return(controllers)); | 82 .WillRepeatedly(Return(controllers)); |
66 | 83 |
| 84 states.simulated_clock.reset(new SimulatedClock(kClockInitialTimeMs * 1000)); |
| 85 |
| 86 auto debug_dump_writer = |
| 87 std::unique_ptr<MockDebugDumpWriter>(new NiceMock<MockDebugDumpWriter>()); |
| 88 EXPECT_CALL(*debug_dump_writer, Die()); |
| 89 states.mock_debug_dump_writer = debug_dump_writer.get(); |
| 90 |
| 91 AudioNetworkAdaptorImpl::Config config; |
| 92 config.clock = states.simulated_clock.get(); |
67 // AudioNetworkAdaptorImpl governs the lifetime of controller manager. | 93 // AudioNetworkAdaptorImpl governs the lifetime of controller manager. |
68 states.audio_network_adaptor.reset(new AudioNetworkAdaptorImpl( | 94 states.audio_network_adaptor.reset(new AudioNetworkAdaptorImpl( |
69 AudioNetworkAdaptorImpl::Config(), std::move(controller_manager))); | 95 config, |
| 96 std::move(controller_manager), std::move(debug_dump_writer))); |
70 | 97 |
71 return states; | 98 return states; |
72 } | 99 } |
73 | 100 |
74 } // namespace | 101 } // namespace |
75 | 102 |
76 TEST(AudioNetworkAdaptorImplTest, | 103 TEST(AudioNetworkAdaptorImplTest, |
77 MakeDecisionIsCalledOnGetEncoderRuntimeConfig) { | 104 MakeDecisionIsCalledOnGetEncoderRuntimeConfig) { |
78 auto states = CreateAudioNetworkAdaptor(); | 105 auto states = CreateAudioNetworkAdaptor(); |
79 | 106 |
(...skipping 21 matching lines...) Expand all Loading... |
101 auto states = CreateAudioNetworkAdaptor(); | 128 auto states = CreateAudioNetworkAdaptor(); |
102 | 129 |
103 for (auto& mock_controller : states.mock_controllers) { | 130 for (auto& mock_controller : states.mock_controllers) { |
104 EXPECT_CALL(*mock_controller, | 131 EXPECT_CALL(*mock_controller, |
105 SetConstraints(ConstraintsReceiverFrameLengthRangeIs( | 132 SetConstraints(ConstraintsReceiverFrameLengthRangeIs( |
106 Controller::Constraints::FrameLengthRange(20, 120)))); | 133 Controller::Constraints::FrameLengthRange(20, 120)))); |
107 } | 134 } |
108 states.audio_network_adaptor->SetReceiverFrameLengthRange(20, 120); | 135 states.audio_network_adaptor->SetReceiverFrameLengthRange(20, 120); |
109 } | 136 } |
110 | 137 |
| 138 TEST(AudioNetworkAdaptorImplTest, |
| 139 DumpEncoderRuntimeConfigIsCalledOnGetEncoderRuntimeConfig) { |
| 140 auto states = CreateAudioNetworkAdaptor(); |
| 141 |
| 142 AudioNetworkAdaptor::EncoderRuntimeConfig config; |
| 143 config.bitrate_bps = rtc::Optional<int>(32000); |
| 144 config.enable_fec = rtc::Optional<bool>(true); |
| 145 |
| 146 EXPECT_CALL(*states.mock_controllers[0], MakeDecision(_, _)) |
| 147 .WillOnce(SetArgPointee<1>(config)); |
| 148 |
| 149 EXPECT_CALL(*states.mock_debug_dump_writer, |
| 150 DumpEncoderRuntimeConfig(EncoderRuntimeConfigIs(config), |
| 151 kClockInitialTimeMs)); |
| 152 states.audio_network_adaptor->GetEncoderRuntimeConfig(); |
| 153 } |
| 154 |
| 155 TEST(AudioNetworkAdaptorImplTest, |
| 156 DumpNetworkMetricsIsCalledOnSetNetworkMetrics) { |
| 157 auto states = CreateAudioNetworkAdaptor(); |
| 158 |
| 159 constexpr int kBandwidth = 16000; |
| 160 constexpr float kPacketLoss = 0.7f; |
| 161 constexpr int kRtt = 100; |
| 162 |
| 163 Controller::NetworkMetrics check; |
| 164 check.uplink_bandwidth_bps = rtc::Optional<int>(kBandwidth); |
| 165 int64_t timestamp_check = kClockInitialTimeMs; |
| 166 |
| 167 EXPECT_CALL(*states.mock_debug_dump_writer, |
| 168 DumpNetworkMetrics(NetworkMetricsIs(check), timestamp_check)); |
| 169 states.audio_network_adaptor->SetUplinkBandwidth(kBandwidth); |
| 170 |
| 171 states.simulated_clock->AdvanceTimeMilliseconds(100); |
| 172 timestamp_check += 100; |
| 173 check.uplink_packet_loss_fraction = rtc::Optional<float>(kPacketLoss); |
| 174 EXPECT_CALL(*states.mock_debug_dump_writer, |
| 175 DumpNetworkMetrics(NetworkMetricsIs(check), timestamp_check)); |
| 176 states.audio_network_adaptor->SetUplinkPacketLossFraction(kPacketLoss); |
| 177 |
| 178 states.simulated_clock->AdvanceTimeMilliseconds(200); |
| 179 timestamp_check += 200; |
| 180 check.rtt_ms = rtc::Optional<int>(kRtt); |
| 181 EXPECT_CALL(*states.mock_debug_dump_writer, |
| 182 DumpNetworkMetrics(NetworkMetricsIs(check), timestamp_check)); |
| 183 states.audio_network_adaptor->SetRtt(kRtt); |
| 184 } |
| 185 |
111 } // namespace webrtc | 186 } // namespace webrtc |
OLD | NEW |