1 /*
2 * Copyright 2019 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 "pc/jitter_buffer_delay.h"
12
13 #include <stdint.h>
14
15 #include "absl/types/optional.h"
16 #include "api/scoped_refptr.h"
17 #include "pc/test/mock_delayable.h"
18 #include "rtc_base/ref_counted_object.h"
19 #include "rtc_base/thread.h"
20 #include "test/gmock.h"
21 #include "test/gtest.h"
22
23 using ::testing::Return;
24
25 namespace {
26 constexpr int kSsrc = 1234;
27 } // namespace
28
29 namespace webrtc {
30
31 class JitterBufferDelayTest : public ::testing::Test {
32 public:
JitterBufferDelayTest()33 JitterBufferDelayTest()
34 : delay_(new rtc::RefCountedObject<JitterBufferDelay>(
35 rtc::Thread::Current())) {}
36
37 protected:
38 rtc::scoped_refptr<JitterBufferDelayInterface> delay_;
39 MockDelayable delayable_;
40 };
41
TEST_F(JitterBufferDelayTest,Set)42 TEST_F(JitterBufferDelayTest, Set) {
43 delay_->OnStart(&delayable_, kSsrc);
44
45 EXPECT_CALL(delayable_, SetBaseMinimumPlayoutDelayMs(kSsrc, 3000))
46 .WillOnce(Return(true));
47
48 // Delay in seconds.
49 delay_->Set(3.0);
50 }
51
TEST_F(JitterBufferDelayTest,Caching)52 TEST_F(JitterBufferDelayTest, Caching) {
53 // Check that value is cached before start.
54 delay_->Set(4.0);
55
56 // Check that cached value applied on the start.
57 EXPECT_CALL(delayable_, SetBaseMinimumPlayoutDelayMs(kSsrc, 4000))
58 .WillOnce(Return(true));
59 delay_->OnStart(&delayable_, kSsrc);
60 }
61
TEST_F(JitterBufferDelayTest,Clamping)62 TEST_F(JitterBufferDelayTest, Clamping) {
63 delay_->OnStart(&delayable_, kSsrc);
64
65 // In current Jitter Buffer implementation (Audio or Video) maximum supported
66 // value is 10000 milliseconds.
67 EXPECT_CALL(delayable_, SetBaseMinimumPlayoutDelayMs(kSsrc, 10000))
68 .WillOnce(Return(true));
69 delay_->Set(10.5);
70
71 // Test int overflow.
72 EXPECT_CALL(delayable_, SetBaseMinimumPlayoutDelayMs(kSsrc, 10000))
73 .WillOnce(Return(true));
74 delay_->Set(21474836470.0);
75
76 EXPECT_CALL(delayable_, SetBaseMinimumPlayoutDelayMs(kSsrc, 0))
77 .WillOnce(Return(true));
78 delay_->Set(-21474836470.0);
79
80 // Boundary value in seconds to milliseconds conversion.
81 EXPECT_CALL(delayable_, SetBaseMinimumPlayoutDelayMs(kSsrc, 0))
82 .WillOnce(Return(true));
83 delay_->Set(0.0009);
84
85 EXPECT_CALL(delayable_, SetBaseMinimumPlayoutDelayMs(kSsrc, 0))
86 .WillOnce(Return(true));
87
88 delay_->Set(-2.0);
89 }
90
91 } // namespace webrtc
92