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