1 /*
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/tx/retransmission_error_counter.h"
11
12 #include "net/dcsctp/public/dcsctp_options.h"
13 #include "rtc_base/gunit.h"
14 #include "test/gmock.h"
15
16 namespace dcsctp {
17 namespace {
18
TEST(RetransmissionErrorCounterTest,HasInitialValue)19 TEST(RetransmissionErrorCounterTest, HasInitialValue) {
20 DcSctpOptions options;
21 RetransmissionErrorCounter counter("log: ", options);
22 EXPECT_EQ(counter.value(), 0);
23 }
24
TEST(RetransmissionErrorCounterTest,ReturnsFalseAtMaximumValue)25 TEST(RetransmissionErrorCounterTest, ReturnsFalseAtMaximumValue) {
26 DcSctpOptions options;
27 options.max_retransmissions = 5;
28 RetransmissionErrorCounter counter("log: ", options);
29 EXPECT_TRUE(counter.Increment("test")); // 1
30 EXPECT_TRUE(counter.Increment("test")); // 2
31 EXPECT_TRUE(counter.Increment("test")); // 3
32 EXPECT_TRUE(counter.Increment("test")); // 4
33 EXPECT_TRUE(counter.Increment("test")); // 5
34 EXPECT_FALSE(counter.Increment("test")); // Too many retransmissions
35 }
36
TEST(RetransmissionErrorCounterTest,CanHandleZeroRetransmission)37 TEST(RetransmissionErrorCounterTest, CanHandleZeroRetransmission) {
38 DcSctpOptions options;
39 options.max_retransmissions = 0;
40 RetransmissionErrorCounter counter("log: ", options);
41 EXPECT_FALSE(counter.Increment("test")); // One is too many.
42 }
43
TEST(RetransmissionErrorCounterTest,IsExhaustedAtMaximum)44 TEST(RetransmissionErrorCounterTest, IsExhaustedAtMaximum) {
45 DcSctpOptions options;
46 options.max_retransmissions = 3;
47 RetransmissionErrorCounter counter("log: ", options);
48 EXPECT_TRUE(counter.Increment("test")); // 1
49 EXPECT_FALSE(counter.IsExhausted());
50 EXPECT_TRUE(counter.Increment("test")); // 2
51 EXPECT_FALSE(counter.IsExhausted());
52 EXPECT_TRUE(counter.Increment("test")); // 3
53 EXPECT_FALSE(counter.IsExhausted());
54 EXPECT_FALSE(counter.Increment("test")); // Too many retransmissions
55 EXPECT_TRUE(counter.IsExhausted());
56 EXPECT_FALSE(counter.Increment("test")); // One after too many
57 EXPECT_TRUE(counter.IsExhausted());
58 }
59
TEST(RetransmissionErrorCounterTest,ClearingCounter)60 TEST(RetransmissionErrorCounterTest, ClearingCounter) {
61 DcSctpOptions options;
62 options.max_retransmissions = 3;
63 RetransmissionErrorCounter counter("log: ", options);
64 EXPECT_TRUE(counter.Increment("test")); // 1
65 EXPECT_TRUE(counter.Increment("test")); // 2
66 counter.Clear();
67 EXPECT_TRUE(counter.Increment("test")); // 1
68 EXPECT_TRUE(counter.Increment("test")); // 2
69 EXPECT_TRUE(counter.Increment("test")); // 3
70 EXPECT_FALSE(counter.IsExhausted());
71 EXPECT_FALSE(counter.Increment("test")); // Too many retransmissions
72 EXPECT_TRUE(counter.IsExhausted());
73 }
74
TEST(RetransmissionErrorCounterTest,CanBeLimitless)75 TEST(RetransmissionErrorCounterTest, CanBeLimitless) {
76 DcSctpOptions options;
77 options.max_retransmissions = absl::nullopt;
78 RetransmissionErrorCounter counter("log: ", options);
79 for (int i = 0; i < 100; ++i) {
80 EXPECT_TRUE(counter.Increment("test"));
81 EXPECT_FALSE(counter.IsExhausted());
82 }
83 }
84
85 } // namespace
86 } // namespace dcsctp
87