blob: 9d3846953b41029c331a374a7bb08ec70b9ffb6e [file] [log] [blame]
Victor Boiviede88b082021-05-03 15:52:53 +02001/*
2 * Copyright (c) 2021 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#include "net/dcsctp/timer/task_queue_timeout.h"
11
12#include <memory>
13
14#include "rtc_base/gunit.h"
15#include "test/gmock.h"
16#include "test/time_controller/simulated_time_controller.h"
17
18namespace dcsctp {
19namespace {
20using ::testing::MockFunction;
21
22class TaskQueueTimeoutTest : public testing::Test {
23 protected:
24 TaskQueueTimeoutTest()
25 : time_controller_(webrtc::Timestamp::Millis(1234)),
26 task_queue_(time_controller_.GetMainThread()),
27 factory_(
28 *task_queue_,
29 [this]() {
30 return TimeMs(time_controller_.GetClock()->CurrentTime().ms());
31 },
32 on_expired_.AsStdFunction()) {}
33
34 void AdvanceTime(DurationMs duration) {
35 time_controller_.AdvanceTime(webrtc::TimeDelta::Millis(*duration));
36 }
37
38 MockFunction<void(TimeoutID)> on_expired_;
39 webrtc::GlobalSimulatedTimeController time_controller_;
40
41 rtc::Thread* task_queue_;
42 TaskQueueTimeoutFactory factory_;
43};
44
45TEST_F(TaskQueueTimeoutTest, StartPostsDelayedTask) {
46 std::unique_ptr<Timeout> timeout = factory_.CreateTimeout();
47 timeout->Start(DurationMs(1000), TimeoutID(1));
48
49 EXPECT_CALL(on_expired_, Call).Times(0);
50 AdvanceTime(DurationMs(999));
51
52 EXPECT_CALL(on_expired_, Call(TimeoutID(1)));
53 AdvanceTime(DurationMs(1));
54}
55
56TEST_F(TaskQueueTimeoutTest, StopBeforeExpiringDoesntTrigger) {
57 std::unique_ptr<Timeout> timeout = factory_.CreateTimeout();
58 timeout->Start(DurationMs(1000), TimeoutID(1));
59
60 EXPECT_CALL(on_expired_, Call).Times(0);
61 AdvanceTime(DurationMs(999));
62
63 timeout->Stop();
64
65 AdvanceTime(DurationMs(1));
66 AdvanceTime(DurationMs(1000));
67}
68
69TEST_F(TaskQueueTimeoutTest, RestartPrologingTimeoutDuration) {
70 std::unique_ptr<Timeout> timeout = factory_.CreateTimeout();
71 timeout->Start(DurationMs(1000), TimeoutID(1));
72
73 EXPECT_CALL(on_expired_, Call).Times(0);
74 AdvanceTime(DurationMs(500));
75
76 timeout->Restart(DurationMs(1000), TimeoutID(2));
77
78 AdvanceTime(DurationMs(999));
79
80 EXPECT_CALL(on_expired_, Call(TimeoutID(2)));
81 AdvanceTime(DurationMs(1));
82}
83
84TEST_F(TaskQueueTimeoutTest, RestartWithShorterDurationExpiresWhenExpected) {
85 std::unique_ptr<Timeout> timeout = factory_.CreateTimeout();
86 timeout->Start(DurationMs(1000), TimeoutID(1));
87
88 EXPECT_CALL(on_expired_, Call).Times(0);
89 AdvanceTime(DurationMs(500));
90
91 timeout->Restart(DurationMs(200), TimeoutID(2));
92
93 AdvanceTime(DurationMs(199));
94
95 EXPECT_CALL(on_expired_, Call(TimeoutID(2)));
96 AdvanceTime(DurationMs(1));
97
98 EXPECT_CALL(on_expired_, Call).Times(0);
99 AdvanceTime(DurationMs(1000));
100}
101
102TEST_F(TaskQueueTimeoutTest, KilledBeforeExpired) {
103 std::unique_ptr<Timeout> timeout = factory_.CreateTimeout();
104 timeout->Start(DurationMs(1000), TimeoutID(1));
105
106 EXPECT_CALL(on_expired_, Call).Times(0);
107 AdvanceTime(DurationMs(500));
108
109 timeout = nullptr;
110
111 EXPECT_CALL(on_expired_, Call).Times(0);
112 AdvanceTime(DurationMs(1000));
113}
114} // namespace
115} // namespace dcsctp