1 /*
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
11 #include "modules/include/module_common_types.h"
12
13 #include "modules/include/module_common_types_public.h"
14 #include "test/gtest.h"
15
16 namespace webrtc {
17
TEST(IsNewerSequenceNumber,Equal)18 TEST(IsNewerSequenceNumber, Equal) {
19 EXPECT_FALSE(IsNewerSequenceNumber(0x0001, 0x0001));
20 }
21
TEST(IsNewerSequenceNumber,NoWrap)22 TEST(IsNewerSequenceNumber, NoWrap) {
23 EXPECT_TRUE(IsNewerSequenceNumber(0xFFFF, 0xFFFE));
24 EXPECT_TRUE(IsNewerSequenceNumber(0x0001, 0x0000));
25 EXPECT_TRUE(IsNewerSequenceNumber(0x0100, 0x00FF));
26 }
27
TEST(IsNewerSequenceNumber,ForwardWrap)28 TEST(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
TEST(IsNewerSequenceNumber,BackwardWrap)35 TEST(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
TEST(IsNewerSequenceNumber,HalfWayApart)42 TEST(IsNewerSequenceNumber, HalfWayApart) {
43 EXPECT_TRUE(IsNewerSequenceNumber(0x8000, 0x0000));
44 EXPECT_FALSE(IsNewerSequenceNumber(0x0000, 0x8000));
45 }
46
TEST(IsNewerTimestamp,Equal)47 TEST(IsNewerTimestamp, Equal) {
48 EXPECT_FALSE(IsNewerTimestamp(0x00000001, 0x000000001));
49 }
50
TEST(IsNewerTimestamp,NoWrap)51 TEST(IsNewerTimestamp, NoWrap) {
52 EXPECT_TRUE(IsNewerTimestamp(0xFFFFFFFF, 0xFFFFFFFE));
53 EXPECT_TRUE(IsNewerTimestamp(0x00000001, 0x00000000));
54 EXPECT_TRUE(IsNewerTimestamp(0x00010000, 0x0000FFFF));
55 }
56
TEST(IsNewerTimestamp,ForwardWrap)57 TEST(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
TEST(IsNewerTimestamp,BackwardWrap)64 TEST(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
TEST(IsNewerTimestamp,HalfWayApart)71 TEST(IsNewerTimestamp, HalfWayApart) {
72 EXPECT_TRUE(IsNewerTimestamp(0x80000000, 0x00000000));
73 EXPECT_FALSE(IsNewerTimestamp(0x00000000, 0x80000000));
74 }
75
TEST(LatestSequenceNumber,NoWrap)76 TEST(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
TEST(LatestSequenceNumber,Wrap)86 TEST(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
TEST(LatestTimestamp,NoWrap)98 TEST(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
TEST(LatestTimestamp,Wrap)104 TEST(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 }
115
TEST(SequenceNumberUnwrapper,Limits)116 TEST(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.
122 EXPECT_EQ(0, unwrapper.Unwrap(0));
123
124 EXPECT_EQ(0x8000, unwrapper.Unwrap(0x8000));
125 EXPECT_EQ(0xFFFF, unwrapper.Unwrap(0xFFFF));
126 EXPECT_EQ(0x10000, unwrapper.Unwrap(0));
127 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
TEST(SequenceNumberUnwrapper,ForwardWraps)135 TEST(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
TEST(SequenceNumberUnwrapper,BackwardWraps)154 TEST(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
TEST(TimestampUnwrapper,Limits)175 TEST(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
TEST(TimestampUnwrapper,ForwardWraps)195 TEST(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
TEST(TimestampUnwrapper,BackwardWraps)209 TEST(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
224 } // namespace webrtc
225