blob: f5fa7888765e202aafdac58d270a2654f85cb0c9 [file] [log] [blame]
Victor Boiviea4d5e242021-03-30 08:03:511/*
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
14namespace dcsctp {
15namespace {
16
Victor Boivie83c726f2021-04-01 22:18:4817using Wrapped = StrongAlias<class WrappedTag, uint16_t>;
18using TestSequence = UnwrappedSequenceNumber<Wrapped>;
Victor Boiviea4d5e242021-03-30 08:03:5119
20TEST(SequenceNumbersTest, SimpleUnwrapping) {
21 TestSequence::Unwrapper unwrapper;
22
Victor Boivie83c726f2021-04-01 22:18:4823 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));
Victor Boiviea4d5e242021-03-30 08:03:5127
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
Victor Boivie250fbb32021-04-13 09:11:0435 EXPECT_EQ(TestSequence::Difference(s1, s0), 1);
36 EXPECT_EQ(TestSequence::Difference(s2, s0), 2);
37 EXPECT_EQ(TestSequence::Difference(s3, s0), 3);
Victor Boiviea4d5e242021-03-30 08:03:5138
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
Victor Boivie250fbb32021-04-13 09:11:0453 EXPECT_EQ(TestSequence::AddTo(s0, 2), s3);
Victor Boiviea4d5e242021-03-30 08:03:5154}
55
56TEST(SequenceNumbersTest, MidValueUnwrapping) {
57 TestSequence::Unwrapper unwrapper;
58
Victor Boivie83c726f2021-04-01 22:18:4859 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));
Victor Boiviea4d5e242021-03-30 08:03:5163
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
Victor Boivie250fbb32021-04-13 09:11:0471 EXPECT_EQ(TestSequence::Difference(s1, s0), 1);
72 EXPECT_EQ(TestSequence::Difference(s2, s0), 2);
73 EXPECT_EQ(TestSequence::Difference(s3, s0), 3);
Victor Boiviea4d5e242021-03-30 08:03:5174
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
Victor Boivie250fbb32021-04-13 09:11:0489 EXPECT_EQ(TestSequence::AddTo(s0, 2), s3);
Victor Boiviea4d5e242021-03-30 08:03:5190}
91
92TEST(SequenceNumbersTest, WrappedUnwrapping) {
93 TestSequence::Unwrapper unwrapper;
94
Victor Boivie83c726f2021-04-01 22:18:4895 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));
Victor Boiviea4d5e242021-03-30 08:03:5199
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
Victor Boivie250fbb32021-04-13 09:11:04107 EXPECT_EQ(TestSequence::Difference(s1, s0), 1);
108 EXPECT_EQ(TestSequence::Difference(s2, s0), 2);
109 EXPECT_EQ(TestSequence::Difference(s3, s0), 3);
Victor Boiviea4d5e242021-03-30 08:03:51110
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
Victor Boivie250fbb32021-04-13 09:11:04125 EXPECT_EQ(TestSequence::AddTo(s0, 2), s3);
Victor Boiviea4d5e242021-03-30 08:03:51126}
127
128TEST(SequenceNumbersTest, WrapAroundAFewTimes) {
129 TestSequence::Unwrapper unwrapper;
130
Victor Boivie83c726f2021-04-01 22:18:48131 TestSequence s0 = unwrapper.Unwrap(Wrapped(0));
Victor Boiviea4d5e242021-03-30 08:03:51132 TestSequence prev = s0;
133
134 for (uint32_t i = 1; i < 65536 * 3; i++) {
135 uint16_t wrapped = static_cast<uint16_t>(i);
Victor Boivie83c726f2021-04-01 22:18:48136 TestSequence si = unwrapper.Unwrap(Wrapped(wrapped));
Victor Boiviea4d5e242021-03-30 08:03:51137
138 EXPECT_LT(s0, si);
139 EXPECT_LT(prev, si);
140 prev = si;
141 }
142}
143
144TEST(SequenceNumbersTest, IncrementIsSameAsWrapped) {
145 TestSequence::Unwrapper unwrapper;
146
Victor Boivie83c726f2021-04-01 22:18:48147 TestSequence s0 = unwrapper.Unwrap(Wrapped(0));
Victor Boiviea4d5e242021-03-30 08:03:51148
149 for (uint32_t i = 1; i < 65536 * 2; i++) {
150 uint16_t wrapped = static_cast<uint16_t>(i);
Victor Boivie83c726f2021-04-01 22:18:48151 TestSequence si = unwrapper.Unwrap(Wrapped(wrapped));
Victor Boiviea4d5e242021-03-30 08:03:51152
153 s0.Increment();
154 EXPECT_EQ(s0, si);
155 }
156}
157
158TEST(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);
Victor Boivie83c726f2021-04-01 22:18:48163 TestSequence si = unwrapper.Unwrap(Wrapped(wrapped));
Victor Boiviea4d5e242021-03-30 08:03:51164
Victor Boivie83c726f2021-04-01 22:18:48165 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);
Victor Boiviea4d5e242021-03-30 08:03:51169 }
170}
171
172TEST(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);
Victor Boivie83c726f2021-04-01 22:18:48177 TestSequence si = unwrapper.Unwrap(Wrapped(wrapped));
Victor Boiviea4d5e242021-03-30 08:03:51178
Victor Boivie83c726f2021-04-01 22:18:48179 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);
Victor Boiviea4d5e242021-03-30 08:03:51183 }
184}
185
Victor Boivie250fbb32021-04-13 09:11:04186TEST(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
Victor Boiviea4d5e242021-03-30 08:03:51201} // namespace
202} // namespace dcsctp