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/common/sequence_numbers.h"
11
12 #include "test/gmock.h"
13
14 namespace dcsctp {
15 namespace {
16
17 using Wrapped = webrtc::StrongAlias<class WrappedTag, uint16_t>;
18 using TestSequence = UnwrappedSequenceNumber<Wrapped>;
19
TEST(SequenceNumbersTest,SimpleUnwrapping)20 TEST(SequenceNumbersTest, SimpleUnwrapping) {
21 TestSequence::Unwrapper unwrapper;
22
23 TestSequence s0 = unwrapper.Unwrap(Wrapped(0));
24 TestSequence s1 = unwrapper.Unwrap(Wrapped(1));
25 TestSequence s2 = unwrapper.Unwrap(Wrapped(2));
26 TestSequence s3 = unwrapper.Unwrap(Wrapped(3));
27
28 EXPECT_LT(s0, s1);
29 EXPECT_LT(s0, s2);
30 EXPECT_LT(s0, s3);
31 EXPECT_LT(s1, s2);
32 EXPECT_LT(s1, s3);
33 EXPECT_LT(s2, s3);
34
35 EXPECT_EQ(TestSequence::Difference(s1, s0), 1);
36 EXPECT_EQ(TestSequence::Difference(s2, s0), 2);
37 EXPECT_EQ(TestSequence::Difference(s3, s0), 3);
38
39 EXPECT_GT(s1, s0);
40 EXPECT_GT(s2, s0);
41 EXPECT_GT(s3, s0);
42 EXPECT_GT(s2, s1);
43 EXPECT_GT(s3, s1);
44 EXPECT_GT(s3, s2);
45
46 s0.Increment();
47 EXPECT_EQ(s0, s1);
48 s1.Increment();
49 EXPECT_EQ(s1, s2);
50 s2.Increment();
51 EXPECT_EQ(s2, s3);
52
53 EXPECT_EQ(TestSequence::AddTo(s0, 2), s3);
54 }
55
TEST(SequenceNumbersTest,MidValueUnwrapping)56 TEST(SequenceNumbersTest, MidValueUnwrapping) {
57 TestSequence::Unwrapper unwrapper;
58
59 TestSequence s0 = unwrapper.Unwrap(Wrapped(0x7FFE));
60 TestSequence s1 = unwrapper.Unwrap(Wrapped(0x7FFF));
61 TestSequence s2 = unwrapper.Unwrap(Wrapped(0x8000));
62 TestSequence s3 = unwrapper.Unwrap(Wrapped(0x8001));
63
64 EXPECT_LT(s0, s1);
65 EXPECT_LT(s0, s2);
66 EXPECT_LT(s0, s3);
67 EXPECT_LT(s1, s2);
68 EXPECT_LT(s1, s3);
69 EXPECT_LT(s2, s3);
70
71 EXPECT_EQ(TestSequence::Difference(s1, s0), 1);
72 EXPECT_EQ(TestSequence::Difference(s2, s0), 2);
73 EXPECT_EQ(TestSequence::Difference(s3, s0), 3);
74
75 EXPECT_GT(s1, s0);
76 EXPECT_GT(s2, s0);
77 EXPECT_GT(s3, s0);
78 EXPECT_GT(s2, s1);
79 EXPECT_GT(s3, s1);
80 EXPECT_GT(s3, s2);
81
82 s0.Increment();
83 EXPECT_EQ(s0, s1);
84 s1.Increment();
85 EXPECT_EQ(s1, s2);
86 s2.Increment();
87 EXPECT_EQ(s2, s3);
88
89 EXPECT_EQ(TestSequence::AddTo(s0, 2), s3);
90 }
91
TEST(SequenceNumbersTest,WrappedUnwrapping)92 TEST(SequenceNumbersTest, WrappedUnwrapping) {
93 TestSequence::Unwrapper unwrapper;
94
95 TestSequence s0 = unwrapper.Unwrap(Wrapped(0xFFFE));
96 TestSequence s1 = unwrapper.Unwrap(Wrapped(0xFFFF));
97 TestSequence s2 = unwrapper.Unwrap(Wrapped(0x0000));
98 TestSequence s3 = unwrapper.Unwrap(Wrapped(0x0001));
99
100 EXPECT_LT(s0, s1);
101 EXPECT_LT(s0, s2);
102 EXPECT_LT(s0, s3);
103 EXPECT_LT(s1, s2);
104 EXPECT_LT(s1, s3);
105 EXPECT_LT(s2, s3);
106
107 EXPECT_EQ(TestSequence::Difference(s1, s0), 1);
108 EXPECT_EQ(TestSequence::Difference(s2, s0), 2);
109 EXPECT_EQ(TestSequence::Difference(s3, s0), 3);
110
111 EXPECT_GT(s1, s0);
112 EXPECT_GT(s2, s0);
113 EXPECT_GT(s3, s0);
114 EXPECT_GT(s2, s1);
115 EXPECT_GT(s3, s1);
116 EXPECT_GT(s3, s2);
117
118 s0.Increment();
119 EXPECT_EQ(s0, s1);
120 s1.Increment();
121 EXPECT_EQ(s1, s2);
122 s2.Increment();
123 EXPECT_EQ(s2, s3);
124
125 EXPECT_EQ(TestSequence::AddTo(s0, 2), s3);
126 }
127
TEST(SequenceNumbersTest,WrapAroundAFewTimes)128 TEST(SequenceNumbersTest, WrapAroundAFewTimes) {
129 TestSequence::Unwrapper unwrapper;
130
131 TestSequence s0 = unwrapper.Unwrap(Wrapped(0));
132 TestSequence prev = s0;
133
134 for (uint32_t i = 1; i < 65536 * 3; i++) {
135 uint16_t wrapped = static_cast<uint16_t>(i);
136 TestSequence si = unwrapper.Unwrap(Wrapped(wrapped));
137
138 EXPECT_LT(s0, si);
139 EXPECT_LT(prev, si);
140 prev = si;
141 }
142 }
143
TEST(SequenceNumbersTest,IncrementIsSameAsWrapped)144 TEST(SequenceNumbersTest, IncrementIsSameAsWrapped) {
145 TestSequence::Unwrapper unwrapper;
146
147 TestSequence s0 = unwrapper.Unwrap(Wrapped(0));
148
149 for (uint32_t i = 1; i < 65536 * 2; i++) {
150 uint16_t wrapped = static_cast<uint16_t>(i);
151 TestSequence si = unwrapper.Unwrap(Wrapped(wrapped));
152
153 s0.Increment();
154 EXPECT_EQ(s0, si);
155 }
156 }
157
TEST(SequenceNumbersTest,UnwrappingLargerNumberIsAlwaysLarger)158 TEST(SequenceNumbersTest, UnwrappingLargerNumberIsAlwaysLarger) {
159 TestSequence::Unwrapper unwrapper;
160
161 for (uint32_t i = 1; i < 65536 * 2; i++) {
162 uint16_t wrapped = static_cast<uint16_t>(i);
163 TestSequence si = unwrapper.Unwrap(Wrapped(wrapped));
164
165 EXPECT_GT(unwrapper.Unwrap(Wrapped(wrapped + 1)), si);
166 EXPECT_GT(unwrapper.Unwrap(Wrapped(wrapped + 5)), si);
167 EXPECT_GT(unwrapper.Unwrap(Wrapped(wrapped + 10)), si);
168 EXPECT_GT(unwrapper.Unwrap(Wrapped(wrapped + 100)), si);
169 }
170 }
171
TEST(SequenceNumbersTest,UnwrappingSmallerNumberIsAlwaysSmaller)172 TEST(SequenceNumbersTest, UnwrappingSmallerNumberIsAlwaysSmaller) {
173 TestSequence::Unwrapper unwrapper;
174
175 for (uint32_t i = 1; i < 65536 * 2; i++) {
176 uint16_t wrapped = static_cast<uint16_t>(i);
177 TestSequence si = unwrapper.Unwrap(Wrapped(wrapped));
178
179 EXPECT_LT(unwrapper.Unwrap(Wrapped(wrapped - 1)), si);
180 EXPECT_LT(unwrapper.Unwrap(Wrapped(wrapped - 5)), si);
181 EXPECT_LT(unwrapper.Unwrap(Wrapped(wrapped - 10)), si);
182 EXPECT_LT(unwrapper.Unwrap(Wrapped(wrapped - 100)), si);
183 }
184 }
185
TEST(SequenceNumbersTest,DifferenceIsAbsolute)186 TEST(SequenceNumbersTest, DifferenceIsAbsolute) {
187 TestSequence::Unwrapper unwrapper;
188
189 TestSequence this_value = unwrapper.Unwrap(Wrapped(10));
190 TestSequence other_value = TestSequence::AddTo(this_value, 100);
191
192 EXPECT_EQ(TestSequence::Difference(this_value, other_value), 100);
193 EXPECT_EQ(TestSequence::Difference(other_value, this_value), 100);
194
195 TestSequence minus_value = TestSequence::AddTo(this_value, -100);
196
197 EXPECT_EQ(TestSequence::Difference(this_value, minus_value), 100);
198 EXPECT_EQ(TestSequence::Difference(minus_value, this_value), 100);
199 }
200
201 } // namespace
202 } // namespace dcsctp
203