blob: 0979af38e63e556f0c0cb311933e7391e64ee0f2 [file] [log] [blame]
stefan@webrtc.org7bc465b2013-04-11 17:48:02 +00001/*
2 * Copyright (c) 2013 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "modules/include/module_common_types.h"
stefan@webrtc.org7bc465b2013-04-11 17:48:02 +000012
Yves Gerey3e707812018-11-28 16:47:49 +010013#include "modules/include/module_common_types_public.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "test/gtest.h"
stefan@webrtc.org7bc465b2013-04-11 17:48:02 +000015
16namespace webrtc {
17
18TEST(IsNewerSequenceNumber, Equal) {
19 EXPECT_FALSE(IsNewerSequenceNumber(0x0001, 0x0001));
20}
21
22TEST(IsNewerSequenceNumber, NoWrap) {
23 EXPECT_TRUE(IsNewerSequenceNumber(0xFFFF, 0xFFFE));
24 EXPECT_TRUE(IsNewerSequenceNumber(0x0001, 0x0000));
25 EXPECT_TRUE(IsNewerSequenceNumber(0x0100, 0x00FF));
26}
27
28TEST(IsNewerSequenceNumber, ForwardWrap) {
29 EXPECT_TRUE(IsNewerSequenceNumber(0x0000, 0xFFFF));
30 EXPECT_TRUE(IsNewerSequenceNumber(0x0000, 0xFF00));
31 EXPECT_TRUE(IsNewerSequenceNumber(0x00FF, 0xFFFF));
32 EXPECT_TRUE(IsNewerSequenceNumber(0x00FF, 0xFF00));
33}
34
35TEST(IsNewerSequenceNumber, BackwardWrap) {
36 EXPECT_FALSE(IsNewerSequenceNumber(0xFFFF, 0x0000));
37 EXPECT_FALSE(IsNewerSequenceNumber(0xFF00, 0x0000));
38 EXPECT_FALSE(IsNewerSequenceNumber(0xFFFF, 0x00FF));
39 EXPECT_FALSE(IsNewerSequenceNumber(0xFF00, 0x00FF));
40}
41
Cesar Magalhaesf69f1fb2015-05-30 17:49:18 +020042TEST(IsNewerSequenceNumber, HalfWayApart) {
43 EXPECT_TRUE(IsNewerSequenceNumber(0x8000, 0x0000));
44 EXPECT_FALSE(IsNewerSequenceNumber(0x0000, 0x8000));
45}
46
stefan@webrtc.org7bc465b2013-04-11 17:48:02 +000047TEST(IsNewerTimestamp, Equal) {
48 EXPECT_FALSE(IsNewerTimestamp(0x00000001, 0x000000001));
49}
50
51TEST(IsNewerTimestamp, NoWrap) {
52 EXPECT_TRUE(IsNewerTimestamp(0xFFFFFFFF, 0xFFFFFFFE));
53 EXPECT_TRUE(IsNewerTimestamp(0x00000001, 0x00000000));
54 EXPECT_TRUE(IsNewerTimestamp(0x00010000, 0x0000FFFF));
55}
56
57TEST(IsNewerTimestamp, ForwardWrap) {
58 EXPECT_TRUE(IsNewerTimestamp(0x00000000, 0xFFFFFFFF));
59 EXPECT_TRUE(IsNewerTimestamp(0x00000000, 0xFFFF0000));
60 EXPECT_TRUE(IsNewerTimestamp(0x0000FFFF, 0xFFFFFFFF));
61 EXPECT_TRUE(IsNewerTimestamp(0x0000FFFF, 0xFFFF0000));
62}
63
64TEST(IsNewerTimestamp, BackwardWrap) {
65 EXPECT_FALSE(IsNewerTimestamp(0xFFFFFFFF, 0x00000000));
66 EXPECT_FALSE(IsNewerTimestamp(0xFFFF0000, 0x00000000));
67 EXPECT_FALSE(IsNewerTimestamp(0xFFFFFFFF, 0x0000FFFF));
68 EXPECT_FALSE(IsNewerTimestamp(0xFFFF0000, 0x0000FFFF));
69}
70
Cesar Magalhaesf69f1fb2015-05-30 17:49:18 +020071TEST(IsNewerTimestamp, HalfWayApart) {
72 EXPECT_TRUE(IsNewerTimestamp(0x80000000, 0x00000000));
73 EXPECT_FALSE(IsNewerTimestamp(0x00000000, 0x80000000));
74}
75
stefan@webrtc.org7bc465b2013-04-11 17:48:02 +000076TEST(LatestSequenceNumber, NoWrap) {
77 EXPECT_EQ(0xFFFFu, LatestSequenceNumber(0xFFFF, 0xFFFE));
78 EXPECT_EQ(0x0001u, LatestSequenceNumber(0x0001, 0x0000));
79 EXPECT_EQ(0x0100u, LatestSequenceNumber(0x0100, 0x00FF));
80
81 EXPECT_EQ(0xFFFFu, LatestSequenceNumber(0xFFFE, 0xFFFF));
82 EXPECT_EQ(0x0001u, LatestSequenceNumber(0x0000, 0x0001));
83 EXPECT_EQ(0x0100u, LatestSequenceNumber(0x00FF, 0x0100));
84}
85
86TEST(LatestSequenceNumber, Wrap) {
87 EXPECT_EQ(0x0000u, LatestSequenceNumber(0x0000, 0xFFFF));
88 EXPECT_EQ(0x0000u, LatestSequenceNumber(0x0000, 0xFF00));
89 EXPECT_EQ(0x00FFu, LatestSequenceNumber(0x00FF, 0xFFFF));
90 EXPECT_EQ(0x00FFu, LatestSequenceNumber(0x00FF, 0xFF00));
91
92 EXPECT_EQ(0x0000u, LatestSequenceNumber(0xFFFF, 0x0000));
93 EXPECT_EQ(0x0000u, LatestSequenceNumber(0xFF00, 0x0000));
94 EXPECT_EQ(0x00FFu, LatestSequenceNumber(0xFFFF, 0x00FF));
95 EXPECT_EQ(0x00FFu, LatestSequenceNumber(0xFF00, 0x00FF));
96}
97
98TEST(LatestTimestamp, NoWrap) {
99 EXPECT_EQ(0xFFFFFFFFu, LatestTimestamp(0xFFFFFFFF, 0xFFFFFFFE));
100 EXPECT_EQ(0x00000001u, LatestTimestamp(0x00000001, 0x00000000));
101 EXPECT_EQ(0x00010000u, LatestTimestamp(0x00010000, 0x0000FFFF));
102}
103
104TEST(LatestTimestamp, Wrap) {
105 EXPECT_EQ(0x00000000u, LatestTimestamp(0x00000000, 0xFFFFFFFF));
106 EXPECT_EQ(0x00000000u, LatestTimestamp(0x00000000, 0xFFFF0000));
107 EXPECT_EQ(0x0000FFFFu, LatestTimestamp(0x0000FFFF, 0xFFFFFFFF));
108 EXPECT_EQ(0x0000FFFFu, LatestTimestamp(0x0000FFFF, 0xFFFF0000));
109
110 EXPECT_EQ(0x00000000u, LatestTimestamp(0xFFFFFFFF, 0x00000000));
111 EXPECT_EQ(0x00000000u, LatestTimestamp(0xFFFF0000, 0x00000000));
112 EXPECT_EQ(0x0000FFFFu, LatestTimestamp(0xFFFFFFFF, 0x0000FFFF));
113 EXPECT_EQ(0x0000FFFFu, LatestTimestamp(0xFFFF0000, 0x0000FFFF));
114}
Cesar Magalhaesf69f1fb2015-05-30 17:49:18 +0200115
sprangc3aa12d2015-09-08 03:43:17 -0700116TEST(SequenceNumberUnwrapper, Limits) {
117 SequenceNumberUnwrapper unwrapper;
118
119 EXPECT_EQ(0, unwrapper.Unwrap(0));
120 EXPECT_EQ(0x8000, unwrapper.Unwrap(0x8000));
121 // Delta is exactly 0x8000 but current is lower than input, wrap backwards.
henrik.lundin06863c92017-04-23 23:54:13 -0700122 EXPECT_EQ(0, unwrapper.Unwrap(0));
sprangc3aa12d2015-09-08 03:43:17 -0700123
124 EXPECT_EQ(0x8000, unwrapper.Unwrap(0x8000));
125 EXPECT_EQ(0xFFFF, unwrapper.Unwrap(0xFFFF));
henrik.lundin06863c92017-04-23 23:54:13 -0700126 EXPECT_EQ(0x10000, unwrapper.Unwrap(0));
sprangc3aa12d2015-09-08 03:43:17 -0700127 EXPECT_EQ(0xFFFF, unwrapper.Unwrap(0xFFFF));
128 EXPECT_EQ(0x8000, unwrapper.Unwrap(0x8000));
129 EXPECT_EQ(0, unwrapper.Unwrap(0));
130
131 // Don't allow negative values.
132 EXPECT_EQ(0xFFFF, unwrapper.Unwrap(0xFFFF));
133}
134
135TEST(SequenceNumberUnwrapper, ForwardWraps) {
136 int64_t seq = 0;
137 SequenceNumberUnwrapper unwrapper;
138
139 const int kMaxIncrease = 0x8000 - 1;
140 const int kNumWraps = 4;
141 for (int i = 0; i < kNumWraps * 2; ++i) {
142 int64_t unwrapped = unwrapper.Unwrap(static_cast<uint16_t>(seq & 0xFFFF));
143 EXPECT_EQ(seq, unwrapped);
144 seq += kMaxIncrease;
145 }
146
147 unwrapper.UpdateLast(0);
148 for (int seq = 0; seq < kNumWraps * 0xFFFF; ++seq) {
149 int64_t unwrapped = unwrapper.Unwrap(static_cast<uint16_t>(seq & 0xFFFF));
150 EXPECT_EQ(seq, unwrapped);
151 }
152}
153
154TEST(SequenceNumberUnwrapper, BackwardWraps) {
155 SequenceNumberUnwrapper unwrapper;
156
157 const int kMaxDecrease = 0x8000 - 1;
158 const int kNumWraps = 4;
159 int64_t seq = kNumWraps * 2 * kMaxDecrease;
160 unwrapper.UpdateLast(seq);
161 for (int i = kNumWraps * 2; i >= 0; --i) {
162 int64_t unwrapped = unwrapper.Unwrap(static_cast<uint16_t>(seq & 0xFFFF));
163 EXPECT_EQ(seq, unwrapped);
164 seq -= kMaxDecrease;
165 }
166
167 seq = kNumWraps * 0xFFFF;
168 unwrapper.UpdateLast(seq);
169 for (; seq >= 0; --seq) {
170 int64_t unwrapped = unwrapper.Unwrap(static_cast<uint16_t>(seq & 0xFFFF));
171 EXPECT_EQ(seq, unwrapped);
172 }
173}
174
henrik.lundin06863c92017-04-23 23:54:13 -0700175TEST(TimestampUnwrapper, Limits) {
176 TimestampUnwrapper unwrapper;
177
178 EXPECT_EQ(0, unwrapper.Unwrap(0));
179 EXPECT_EQ(0x80000000, unwrapper.Unwrap(0x80000000));
180 // Delta is exactly 0x80000000 but current is lower than input, wrap
181 // backwards.
182 EXPECT_EQ(0, unwrapper.Unwrap(0));
183
184 EXPECT_EQ(0x80000000, unwrapper.Unwrap(0x80000000));
185 EXPECT_EQ(0xFFFFFFFF, unwrapper.Unwrap(0xFFFFFFFF));
186 EXPECT_EQ(0x100000000, unwrapper.Unwrap(0x00000000));
187 EXPECT_EQ(0xFFFFFFFF, unwrapper.Unwrap(0xFFFFFFFF));
188 EXPECT_EQ(0x80000000, unwrapper.Unwrap(0x80000000));
189 EXPECT_EQ(0, unwrapper.Unwrap(0));
190
191 // Don't allow negative values.
192 EXPECT_EQ(0xFFFFFFFF, unwrapper.Unwrap(0xFFFFFFFF));
193}
194
195TEST(TimestampUnwrapper, ForwardWraps) {
196 int64_t ts = 0;
197 TimestampUnwrapper unwrapper;
198
199 const int64_t kMaxIncrease = 0x80000000 - 1;
200 const int kNumWraps = 4;
201 for (int i = 0; i < kNumWraps * 2; ++i) {
202 int64_t unwrapped =
203 unwrapper.Unwrap(static_cast<uint32_t>(ts & 0xFFFFFFFF));
204 EXPECT_EQ(ts, unwrapped);
205 ts += kMaxIncrease;
206 }
207}
208
209TEST(TimestampUnwrapper, BackwardWraps) {
210 TimestampUnwrapper unwrapper;
211
212 const int64_t kMaxDecrease = 0x80000000 - 1;
213 const int kNumWraps = 4;
214 int64_t ts = kNumWraps * 2 * kMaxDecrease;
215 unwrapper.UpdateLast(ts);
216 for (int i = 0; i <= kNumWraps * 2; ++i) {
217 int64_t unwrapped =
218 unwrapper.Unwrap(static_cast<uint32_t>(ts & 0xFFFFFFFF));
219 EXPECT_EQ(ts, unwrapped);
220 ts -= kMaxDecrease;
221 }
222}
223
stefan@webrtc.org7bc465b2013-04-11 17:48:02 +0000224} // namespace webrtc