1 /*
2  *  Copyright 2016 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 <limits>
12 
13 #include "webrtc/base/safe_compare.h"
14 #include "webrtc/test/gtest.h"
15 
16 namespace rtc {
17 
18 namespace {
19 
20 constexpr std::uintmax_t umax = std::numeric_limits<std::uintmax_t>::max();
21 constexpr std::intmax_t imin = std::numeric_limits<std::intmax_t>::min();
22 constexpr std::intmax_t m1 = -1;
23 
24 // m1 and umax have the same representation because we use 2's complement
25 // arithmetic, so naive casting will confuse them.
26 static_assert(static_cast<std::uintmax_t>(m1) == umax, "");
27 static_assert(m1 == static_cast<std::intmax_t>(umax), "");
28 
29 std::pair<int, int> p1(1, 1);
30 std::pair<int, int> p2(1, 2);
31 
32 }  // namespace
33 
34 // clang-format off
35 
36 // These functions aren't used in the tests, but it's useful to look at the
37 // compiler output for them, and verify that (1) the same-signedness *Safe
38 // functions result in exactly the same code as their *Ref counterparts, and
39 // that (2) the mixed-signedness *Safe functions have just a few extra
40 // arithmetic and logic instructions (but no extra control flow instructions).
TestLessThanRef(int a,int b)41 bool TestLessThanRef(      int a,      int b) { return a < b; }
TestLessThanRef(unsigned a,unsigned b)42 bool TestLessThanRef( unsigned a, unsigned b) { return a < b; }
TestLessThanSafe(int a,int b)43 bool TestLessThanSafe(     int a,      int b) { return safe_cmp::Lt(a, b); }
TestLessThanSafe(unsigned a,unsigned b)44 bool TestLessThanSafe(unsigned a, unsigned b) { return safe_cmp::Lt(a, b); }
TestLessThanSafe(unsigned a,int b)45 bool TestLessThanSafe(unsigned a,      int b) { return safe_cmp::Lt(a, b); }
TestLessThanSafe(int a,unsigned b)46 bool TestLessThanSafe(     int a, unsigned b) { return safe_cmp::Lt(a, b); }
47 
48 // For these, we expect the *Ref and *Safe functions to result in identical
49 // code, except for the ones that compare a signed variable with an unsigned
50 // constant; in that case, the *Ref function does an unsigned comparison (fast
51 // but incorrect) and the *Safe function spends a few extra instructions on
52 // doing it right.
TestLessThan17Ref(int a)53 bool TestLessThan17Ref(       int a) { return a < 17; }
TestLessThan17Ref(unsigned a)54 bool TestLessThan17Ref(  unsigned a) { return a < 17; }
TestLessThan17uRef(int a)55 bool TestLessThan17uRef(      int a) { return static_cast<unsigned>(a) < 17u; }
TestLessThan17uRef(unsigned a)56 bool TestLessThan17uRef( unsigned a) { return a < 17u; }
TestLessThan17Safe(int a)57 bool TestLessThan17Safe(      int a) { return safe_cmp::Lt(a, 17); }
TestLessThan17Safe(unsigned a)58 bool TestLessThan17Safe( unsigned a) { return safe_cmp::Lt(a, 17); }
TestLessThan17uSafe(int a)59 bool TestLessThan17uSafe(     int a) { return safe_cmp::Lt(a, 17u); }
TestLessThan17uSafe(unsigned a)60 bool TestLessThan17uSafe(unsigned a) { return safe_cmp::Lt(a, 17u); }
61 
62 // Cases where we can't convert to a larger signed type.
TestLessThanMax(intmax_t a,uintmax_t b)63 bool TestLessThanMax( intmax_t a, uintmax_t b) { return safe_cmp::Lt(a, b); }
TestLessThanMax(uintmax_t a,intmax_t b)64 bool TestLessThanMax(uintmax_t a,  intmax_t b) { return safe_cmp::Lt(a, b); }
TestLessThanMax17u(intmax_t a)65 bool TestLessThanMax17u( intmax_t a) { return safe_cmp::Lt(a, uintmax_t{17}); }
TestLessThanMax17(uintmax_t a)66 bool TestLessThanMax17( uintmax_t a) { return safe_cmp::Lt(a,  intmax_t{17}); }
67 
68 // Cases where the compiler should be able to compute the result at compile
69 // time.
TestLessThanConst1()70 bool TestLessThanConst1() { return safe_cmp::Lt(  -1,    1); }
TestLessThanConst2()71 bool TestLessThanConst2() { return safe_cmp::Lt(  m1, umax); }
TestLessThanConst3()72 bool TestLessThanConst3() { return safe_cmp::Lt(umax, imin); }
TestLessThanConst4(unsigned a)73 bool TestLessThanConst4(unsigned a) { return safe_cmp::Lt( a, -1); }
TestLessThanConst5(unsigned a)74 bool TestLessThanConst5(unsigned a) { return safe_cmp::Lt(-1,  a); }
TestLessThanConst6(unsigned a)75 bool TestLessThanConst6(unsigned a) { return safe_cmp::Lt( a,  a); }
76 
77 // clang-format on
78 
TEST(SafeCmpTest,Eq)79 TEST(SafeCmpTest, Eq) {
80   EXPECT_FALSE(safe_cmp::Eq(-1, 2));
81   EXPECT_FALSE(safe_cmp::Eq(-1, 2u));
82   EXPECT_FALSE(safe_cmp::Eq(2, -1));
83   EXPECT_FALSE(safe_cmp::Eq(2u, -1));
84 
85   EXPECT_FALSE(safe_cmp::Eq(1, 2));
86   EXPECT_FALSE(safe_cmp::Eq(1, 2u));
87   EXPECT_FALSE(safe_cmp::Eq(1u, 2));
88   EXPECT_FALSE(safe_cmp::Eq(1u, 2u));
89   EXPECT_FALSE(safe_cmp::Eq(2, 1));
90   EXPECT_FALSE(safe_cmp::Eq(2, 1u));
91   EXPECT_FALSE(safe_cmp::Eq(2u, 1));
92   EXPECT_FALSE(safe_cmp::Eq(2u, 1u));
93 
94   EXPECT_TRUE(safe_cmp::Eq(2, 2));
95   EXPECT_TRUE(safe_cmp::Eq(2, 2u));
96   EXPECT_TRUE(safe_cmp::Eq(2u, 2));
97   EXPECT_TRUE(safe_cmp::Eq(2u, 2u));
98 
99   EXPECT_TRUE(safe_cmp::Eq(imin, imin));
100   EXPECT_FALSE(safe_cmp::Eq(imin, umax));
101   EXPECT_FALSE(safe_cmp::Eq(umax, imin));
102   EXPECT_TRUE(safe_cmp::Eq(umax, umax));
103 
104   EXPECT_TRUE(safe_cmp::Eq(m1, m1));
105   EXPECT_FALSE(safe_cmp::Eq(m1, umax));
106   EXPECT_FALSE(safe_cmp::Eq(umax, m1));
107   EXPECT_TRUE(safe_cmp::Eq(umax, umax));
108 
109   EXPECT_FALSE(safe_cmp::Eq(1, 2));
110   EXPECT_FALSE(safe_cmp::Eq(1, 2.0));
111   EXPECT_FALSE(safe_cmp::Eq(1.0, 2));
112   EXPECT_FALSE(safe_cmp::Eq(1.0, 2.0));
113   EXPECT_FALSE(safe_cmp::Eq(2, 1));
114   EXPECT_FALSE(safe_cmp::Eq(2, 1.0));
115   EXPECT_FALSE(safe_cmp::Eq(2.0, 1));
116   EXPECT_FALSE(safe_cmp::Eq(2.0, 1.0));
117 
118   EXPECT_TRUE(safe_cmp::Eq(2, 2));
119   EXPECT_TRUE(safe_cmp::Eq(2, 2.0));
120   EXPECT_TRUE(safe_cmp::Eq(2.0, 2));
121   EXPECT_TRUE(safe_cmp::Eq(2.0, 2.0));
122 
123   EXPECT_TRUE(safe_cmp::Eq(p1, p1));
124   EXPECT_FALSE(safe_cmp::Eq(p1, p2));
125   EXPECT_FALSE(safe_cmp::Eq(p2, p1));
126   EXPECT_TRUE(safe_cmp::Eq(p2, p2));
127 }
128 
TEST(SafeCmpTest,Ne)129 TEST(SafeCmpTest, Ne) {
130   EXPECT_TRUE(safe_cmp::Ne(-1, 2));
131   EXPECT_TRUE(safe_cmp::Ne(-1, 2u));
132   EXPECT_TRUE(safe_cmp::Ne(2, -1));
133   EXPECT_TRUE(safe_cmp::Ne(2u, -1));
134 
135   EXPECT_TRUE(safe_cmp::Ne(1, 2));
136   EXPECT_TRUE(safe_cmp::Ne(1, 2u));
137   EXPECT_TRUE(safe_cmp::Ne(1u, 2));
138   EXPECT_TRUE(safe_cmp::Ne(1u, 2u));
139   EXPECT_TRUE(safe_cmp::Ne(2, 1));
140   EXPECT_TRUE(safe_cmp::Ne(2, 1u));
141   EXPECT_TRUE(safe_cmp::Ne(2u, 1));
142   EXPECT_TRUE(safe_cmp::Ne(2u, 1u));
143 
144   EXPECT_FALSE(safe_cmp::Ne(2, 2));
145   EXPECT_FALSE(safe_cmp::Ne(2, 2u));
146   EXPECT_FALSE(safe_cmp::Ne(2u, 2));
147   EXPECT_FALSE(safe_cmp::Ne(2u, 2u));
148 
149   EXPECT_FALSE(safe_cmp::Ne(imin, imin));
150   EXPECT_TRUE(safe_cmp::Ne(imin, umax));
151   EXPECT_TRUE(safe_cmp::Ne(umax, imin));
152   EXPECT_FALSE(safe_cmp::Ne(umax, umax));
153 
154   EXPECT_FALSE(safe_cmp::Ne(m1, m1));
155   EXPECT_TRUE(safe_cmp::Ne(m1, umax));
156   EXPECT_TRUE(safe_cmp::Ne(umax, m1));
157   EXPECT_FALSE(safe_cmp::Ne(umax, umax));
158 
159   EXPECT_TRUE(safe_cmp::Ne(1, 2));
160   EXPECT_TRUE(safe_cmp::Ne(1, 2.0));
161   EXPECT_TRUE(safe_cmp::Ne(1.0, 2));
162   EXPECT_TRUE(safe_cmp::Ne(1.0, 2.0));
163   EXPECT_TRUE(safe_cmp::Ne(2, 1));
164   EXPECT_TRUE(safe_cmp::Ne(2, 1.0));
165   EXPECT_TRUE(safe_cmp::Ne(2.0, 1));
166   EXPECT_TRUE(safe_cmp::Ne(2.0, 1.0));
167 
168   EXPECT_FALSE(safe_cmp::Ne(2, 2));
169   EXPECT_FALSE(safe_cmp::Ne(2, 2.0));
170   EXPECT_FALSE(safe_cmp::Ne(2.0, 2));
171   EXPECT_FALSE(safe_cmp::Ne(2.0, 2.0));
172 
173   EXPECT_FALSE(safe_cmp::Ne(p1, p1));
174   EXPECT_TRUE(safe_cmp::Ne(p1, p2));
175   EXPECT_TRUE(safe_cmp::Ne(p2, p1));
176   EXPECT_FALSE(safe_cmp::Ne(p2, p2));
177 }
178 
TEST(SafeCmpTest,Lt)179 TEST(SafeCmpTest, Lt) {
180   EXPECT_TRUE(safe_cmp::Lt(-1, 2));
181   EXPECT_TRUE(safe_cmp::Lt(-1, 2u));
182   EXPECT_FALSE(safe_cmp::Lt(2, -1));
183   EXPECT_FALSE(safe_cmp::Lt(2u, -1));
184 
185   EXPECT_TRUE(safe_cmp::Lt(1, 2));
186   EXPECT_TRUE(safe_cmp::Lt(1, 2u));
187   EXPECT_TRUE(safe_cmp::Lt(1u, 2));
188   EXPECT_TRUE(safe_cmp::Lt(1u, 2u));
189   EXPECT_FALSE(safe_cmp::Lt(2, 1));
190   EXPECT_FALSE(safe_cmp::Lt(2, 1u));
191   EXPECT_FALSE(safe_cmp::Lt(2u, 1));
192   EXPECT_FALSE(safe_cmp::Lt(2u, 1u));
193 
194   EXPECT_FALSE(safe_cmp::Lt(2, 2));
195   EXPECT_FALSE(safe_cmp::Lt(2, 2u));
196   EXPECT_FALSE(safe_cmp::Lt(2u, 2));
197   EXPECT_FALSE(safe_cmp::Lt(2u, 2u));
198 
199   EXPECT_FALSE(safe_cmp::Lt(imin, imin));
200   EXPECT_TRUE(safe_cmp::Lt(imin, umax));
201   EXPECT_FALSE(safe_cmp::Lt(umax, imin));
202   EXPECT_FALSE(safe_cmp::Lt(umax, umax));
203 
204   EXPECT_FALSE(safe_cmp::Lt(m1, m1));
205   EXPECT_TRUE(safe_cmp::Lt(m1, umax));
206   EXPECT_FALSE(safe_cmp::Lt(umax, m1));
207   EXPECT_FALSE(safe_cmp::Lt(umax, umax));
208 
209   EXPECT_TRUE(safe_cmp::Lt(1, 2));
210   EXPECT_TRUE(safe_cmp::Lt(1, 2.0));
211   EXPECT_TRUE(safe_cmp::Lt(1.0, 2));
212   EXPECT_TRUE(safe_cmp::Lt(1.0, 2.0));
213   EXPECT_FALSE(safe_cmp::Lt(2, 1));
214   EXPECT_FALSE(safe_cmp::Lt(2, 1.0));
215   EXPECT_FALSE(safe_cmp::Lt(2.0, 1));
216   EXPECT_FALSE(safe_cmp::Lt(2.0, 1.0));
217 
218   EXPECT_FALSE(safe_cmp::Lt(2, 2));
219   EXPECT_FALSE(safe_cmp::Lt(2, 2.0));
220   EXPECT_FALSE(safe_cmp::Lt(2.0, 2));
221   EXPECT_FALSE(safe_cmp::Lt(2.0, 2.0));
222 
223   EXPECT_FALSE(safe_cmp::Lt(p1, p1));
224   EXPECT_TRUE(safe_cmp::Lt(p1, p2));
225   EXPECT_FALSE(safe_cmp::Lt(p2, p1));
226   EXPECT_FALSE(safe_cmp::Lt(p2, p2));
227 }
228 
TEST(SafeCmpTest,Le)229 TEST(SafeCmpTest, Le) {
230   EXPECT_TRUE(safe_cmp::Le(-1, 2));
231   EXPECT_TRUE(safe_cmp::Le(-1, 2u));
232   EXPECT_FALSE(safe_cmp::Le(2, -1));
233   EXPECT_FALSE(safe_cmp::Le(2u, -1));
234 
235   EXPECT_TRUE(safe_cmp::Le(1, 2));
236   EXPECT_TRUE(safe_cmp::Le(1, 2u));
237   EXPECT_TRUE(safe_cmp::Le(1u, 2));
238   EXPECT_TRUE(safe_cmp::Le(1u, 2u));
239   EXPECT_FALSE(safe_cmp::Le(2, 1));
240   EXPECT_FALSE(safe_cmp::Le(2, 1u));
241   EXPECT_FALSE(safe_cmp::Le(2u, 1));
242   EXPECT_FALSE(safe_cmp::Le(2u, 1u));
243 
244   EXPECT_TRUE(safe_cmp::Le(2, 2));
245   EXPECT_TRUE(safe_cmp::Le(2, 2u));
246   EXPECT_TRUE(safe_cmp::Le(2u, 2));
247   EXPECT_TRUE(safe_cmp::Le(2u, 2u));
248 
249   EXPECT_TRUE(safe_cmp::Le(imin, imin));
250   EXPECT_TRUE(safe_cmp::Le(imin, umax));
251   EXPECT_FALSE(safe_cmp::Le(umax, imin));
252   EXPECT_TRUE(safe_cmp::Le(umax, umax));
253 
254   EXPECT_TRUE(safe_cmp::Le(m1, m1));
255   EXPECT_TRUE(safe_cmp::Le(m1, umax));
256   EXPECT_FALSE(safe_cmp::Le(umax, m1));
257   EXPECT_TRUE(safe_cmp::Le(umax, umax));
258 
259   EXPECT_TRUE(safe_cmp::Le(1, 2));
260   EXPECT_TRUE(safe_cmp::Le(1, 2.0));
261   EXPECT_TRUE(safe_cmp::Le(1.0, 2));
262   EXPECT_TRUE(safe_cmp::Le(1.0, 2.0));
263   EXPECT_FALSE(safe_cmp::Le(2, 1));
264   EXPECT_FALSE(safe_cmp::Le(2, 1.0));
265   EXPECT_FALSE(safe_cmp::Le(2.0, 1));
266   EXPECT_FALSE(safe_cmp::Le(2.0, 1.0));
267 
268   EXPECT_TRUE(safe_cmp::Le(2, 2));
269   EXPECT_TRUE(safe_cmp::Le(2, 2.0));
270   EXPECT_TRUE(safe_cmp::Le(2.0, 2));
271   EXPECT_TRUE(safe_cmp::Le(2.0, 2.0));
272 
273   EXPECT_TRUE(safe_cmp::Le(p1, p1));
274   EXPECT_TRUE(safe_cmp::Le(p1, p2));
275   EXPECT_FALSE(safe_cmp::Le(p2, p1));
276   EXPECT_TRUE(safe_cmp::Le(p2, p2));
277 }
278 
TEST(SafeCmpTest,Gt)279 TEST(SafeCmpTest, Gt) {
280   EXPECT_FALSE(safe_cmp::Gt(-1, 2));
281   EXPECT_FALSE(safe_cmp::Gt(-1, 2u));
282   EXPECT_TRUE(safe_cmp::Gt(2, -1));
283   EXPECT_TRUE(safe_cmp::Gt(2u, -1));
284 
285   EXPECT_FALSE(safe_cmp::Gt(1, 2));
286   EXPECT_FALSE(safe_cmp::Gt(1, 2u));
287   EXPECT_FALSE(safe_cmp::Gt(1u, 2));
288   EXPECT_FALSE(safe_cmp::Gt(1u, 2u));
289   EXPECT_TRUE(safe_cmp::Gt(2, 1));
290   EXPECT_TRUE(safe_cmp::Gt(2, 1u));
291   EXPECT_TRUE(safe_cmp::Gt(2u, 1));
292   EXPECT_TRUE(safe_cmp::Gt(2u, 1u));
293 
294   EXPECT_FALSE(safe_cmp::Gt(2, 2));
295   EXPECT_FALSE(safe_cmp::Gt(2, 2u));
296   EXPECT_FALSE(safe_cmp::Gt(2u, 2));
297   EXPECT_FALSE(safe_cmp::Gt(2u, 2u));
298 
299   EXPECT_FALSE(safe_cmp::Gt(imin, imin));
300   EXPECT_FALSE(safe_cmp::Gt(imin, umax));
301   EXPECT_TRUE(safe_cmp::Gt(umax, imin));
302   EXPECT_FALSE(safe_cmp::Gt(umax, umax));
303 
304   EXPECT_FALSE(safe_cmp::Gt(m1, m1));
305   EXPECT_FALSE(safe_cmp::Gt(m1, umax));
306   EXPECT_TRUE(safe_cmp::Gt(umax, m1));
307   EXPECT_FALSE(safe_cmp::Gt(umax, umax));
308 
309   EXPECT_FALSE(safe_cmp::Gt(1, 2));
310   EXPECT_FALSE(safe_cmp::Gt(1, 2.0));
311   EXPECT_FALSE(safe_cmp::Gt(1.0, 2));
312   EXPECT_FALSE(safe_cmp::Gt(1.0, 2.0));
313   EXPECT_TRUE(safe_cmp::Gt(2, 1));
314   EXPECT_TRUE(safe_cmp::Gt(2, 1.0));
315   EXPECT_TRUE(safe_cmp::Gt(2.0, 1));
316   EXPECT_TRUE(safe_cmp::Gt(2.0, 1.0));
317 
318   EXPECT_FALSE(safe_cmp::Gt(2, 2));
319   EXPECT_FALSE(safe_cmp::Gt(2, 2.0));
320   EXPECT_FALSE(safe_cmp::Gt(2.0, 2));
321   EXPECT_FALSE(safe_cmp::Gt(2.0, 2.0));
322 
323   EXPECT_FALSE(safe_cmp::Gt(p1, p1));
324   EXPECT_FALSE(safe_cmp::Gt(p1, p2));
325   EXPECT_TRUE(safe_cmp::Gt(p2, p1));
326   EXPECT_FALSE(safe_cmp::Gt(p2, p2));
327 }
328 
TEST(SafeCmpTest,Ge)329 TEST(SafeCmpTest, Ge) {
330   EXPECT_FALSE(safe_cmp::Ge(-1, 2));
331   EXPECT_FALSE(safe_cmp::Ge(-1, 2u));
332   EXPECT_TRUE(safe_cmp::Ge(2, -1));
333   EXPECT_TRUE(safe_cmp::Ge(2u, -1));
334 
335   EXPECT_FALSE(safe_cmp::Ge(1, 2));
336   EXPECT_FALSE(safe_cmp::Ge(1, 2u));
337   EXPECT_FALSE(safe_cmp::Ge(1u, 2));
338   EXPECT_FALSE(safe_cmp::Ge(1u, 2u));
339   EXPECT_TRUE(safe_cmp::Ge(2, 1));
340   EXPECT_TRUE(safe_cmp::Ge(2, 1u));
341   EXPECT_TRUE(safe_cmp::Ge(2u, 1));
342   EXPECT_TRUE(safe_cmp::Ge(2u, 1u));
343 
344   EXPECT_TRUE(safe_cmp::Ge(2, 2));
345   EXPECT_TRUE(safe_cmp::Ge(2, 2u));
346   EXPECT_TRUE(safe_cmp::Ge(2u, 2));
347   EXPECT_TRUE(safe_cmp::Ge(2u, 2u));
348 
349   EXPECT_TRUE(safe_cmp::Ge(imin, imin));
350   EXPECT_FALSE(safe_cmp::Ge(imin, umax));
351   EXPECT_TRUE(safe_cmp::Ge(umax, imin));
352   EXPECT_TRUE(safe_cmp::Ge(umax, umax));
353 
354   EXPECT_TRUE(safe_cmp::Ge(m1, m1));
355   EXPECT_FALSE(safe_cmp::Ge(m1, umax));
356   EXPECT_TRUE(safe_cmp::Ge(umax, m1));
357   EXPECT_TRUE(safe_cmp::Ge(umax, umax));
358 
359   EXPECT_FALSE(safe_cmp::Ge(1, 2));
360   EXPECT_FALSE(safe_cmp::Ge(1, 2.0));
361   EXPECT_FALSE(safe_cmp::Ge(1.0, 2));
362   EXPECT_FALSE(safe_cmp::Ge(1.0, 2.0));
363   EXPECT_TRUE(safe_cmp::Ge(2, 1));
364   EXPECT_TRUE(safe_cmp::Ge(2, 1.0));
365   EXPECT_TRUE(safe_cmp::Ge(2.0, 1));
366   EXPECT_TRUE(safe_cmp::Ge(2.0, 1.0));
367 
368   EXPECT_TRUE(safe_cmp::Ge(2, 2));
369   EXPECT_TRUE(safe_cmp::Ge(2, 2.0));
370   EXPECT_TRUE(safe_cmp::Ge(2.0, 2));
371   EXPECT_TRUE(safe_cmp::Ge(2.0, 2.0));
372 
373   EXPECT_TRUE(safe_cmp::Ge(p1, p1));
374   EXPECT_FALSE(safe_cmp::Ge(p1, p2));
375   EXPECT_TRUE(safe_cmp::Ge(p2, p1));
376   EXPECT_TRUE(safe_cmp::Ge(p2, p2));
377 }
378 
TEST(SafeCmpTest,Enum)379 TEST(SafeCmpTest, Enum) {
380   enum E1 { e1 = 13 };
381   enum { e2 = 13 };
382   enum E3 : unsigned { e3 = 13 };
383   enum : unsigned { e4 = 13 };
384   EXPECT_TRUE(safe_cmp::Eq(13, e1));
385   EXPECT_TRUE(safe_cmp::Eq(13u, e1));
386   EXPECT_TRUE(safe_cmp::Eq(13, e2));
387   EXPECT_TRUE(safe_cmp::Eq(13u, e2));
388   EXPECT_TRUE(safe_cmp::Eq(13, e3));
389   EXPECT_TRUE(safe_cmp::Eq(13u, e3));
390   EXPECT_TRUE(safe_cmp::Eq(13, e4));
391   EXPECT_TRUE(safe_cmp::Eq(13u, e4));
392 }
393 
394 }  // namespace rtc
395