xref: /aosp_15_r20/external/cronet/base/bits_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2009 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // This file contains the unit tests for the bit utilities.
6 
7 #include "base/bits.h"
8 
9 #include <stddef.h>
10 
11 #include <limits>
12 
13 #include "testing/gtest/include/gtest/gtest.h"
14 
15 namespace base::bits {
16 
TEST(BitsTest,Log2Floor)17 TEST(BitsTest, Log2Floor) {
18   EXPECT_EQ(-1, Log2Floor(0));
19   EXPECT_EQ(0, Log2Floor(1));
20   EXPECT_EQ(1, Log2Floor(2));
21   EXPECT_EQ(1, Log2Floor(3));
22   EXPECT_EQ(2, Log2Floor(4));
23   for (int i = 3; i < 31; ++i) {
24     unsigned int value = 1U << i;
25     EXPECT_EQ(i, Log2Floor(value));
26     EXPECT_EQ(i, Log2Floor(value + 1));
27     EXPECT_EQ(i, Log2Floor(value + 2));
28     EXPECT_EQ(i - 1, Log2Floor(value - 1));
29     EXPECT_EQ(i - 1, Log2Floor(value - 2));
30   }
31   EXPECT_EQ(31, Log2Floor(0xffffffffU));
32 }
33 
TEST(BitsTest,Log2Ceiling)34 TEST(BitsTest, Log2Ceiling) {
35   EXPECT_EQ(-1, Log2Ceiling(0));
36   EXPECT_EQ(0, Log2Ceiling(1));
37   EXPECT_EQ(1, Log2Ceiling(2));
38   EXPECT_EQ(2, Log2Ceiling(3));
39   EXPECT_EQ(2, Log2Ceiling(4));
40   for (int i = 3; i < 31; ++i) {
41     unsigned int value = 1U << i;
42     EXPECT_EQ(i, Log2Ceiling(value));
43     EXPECT_EQ(i + 1, Log2Ceiling(value + 1));
44     EXPECT_EQ(i + 1, Log2Ceiling(value + 2));
45     EXPECT_EQ(i, Log2Ceiling(value - 1));
46     EXPECT_EQ(i, Log2Ceiling(value - 2));
47   }
48   EXPECT_EQ(32, Log2Ceiling(0xffffffffU));
49 }
50 
TEST(BitsTest,AlignUp)51 TEST(BitsTest, AlignUp) {
52   static constexpr size_t kSizeTMax = std::numeric_limits<size_t>::max();
53   EXPECT_EQ(0u, AlignUp(0u, 4u));
54   EXPECT_EQ(4u, AlignUp(1u, 4u));
55   EXPECT_EQ(4096u, AlignUp(1u, 4096u));
56   EXPECT_EQ(4096u, AlignUp(4096u, 4096u));
57   EXPECT_EQ(4096u, AlignUp(4095u, 4096u));
58   EXPECT_EQ(8192u, AlignUp(4097u, 4096u));
59   EXPECT_EQ(kSizeTMax - 31, AlignUp(kSizeTMax - 62, size_t{32}));
60   EXPECT_EQ(kSizeTMax / 2 + 1, AlignUp(size_t{1}, kSizeTMax / 2 + 1));
61 }
62 
TEST(BitsTest,AlignUpPointer)63 TEST(BitsTest, AlignUpPointer) {
64   static constexpr uintptr_t kUintPtrTMax =
65       std::numeric_limits<uintptr_t>::max();
66   EXPECT_EQ(reinterpret_cast<uint8_t*>(0),
67             AlignUp(reinterpret_cast<uint8_t*>(0), 4));
68   EXPECT_EQ(reinterpret_cast<uint8_t*>(4),
69             AlignUp(reinterpret_cast<uint8_t*>(1), 4));
70   EXPECT_EQ(reinterpret_cast<uint8_t*>(4096),
71             AlignUp(reinterpret_cast<uint8_t*>(1), 4096));
72   EXPECT_EQ(reinterpret_cast<uint8_t*>(4096),
73             AlignUp(reinterpret_cast<uint8_t*>(4096), 4096));
74   EXPECT_EQ(reinterpret_cast<uint8_t*>(4096),
75             AlignUp(reinterpret_cast<uint8_t*>(4095), 4096));
76   EXPECT_EQ(reinterpret_cast<uint8_t*>(8192),
77             AlignUp(reinterpret_cast<uint8_t*>(4097), 4096));
78   EXPECT_EQ(reinterpret_cast<uint8_t*>(kUintPtrTMax - 31),
79             AlignUp(reinterpret_cast<uint8_t*>(kUintPtrTMax - 62), 32));
80   EXPECT_EQ(reinterpret_cast<uint8_t*>(kUintPtrTMax / 2 + 1),
81             AlignUp(reinterpret_cast<uint8_t*>(1), kUintPtrTMax / 2 + 1));
82 }
83 
TEST(BitsTest,AlignDown)84 TEST(BitsTest, AlignDown) {
85   static constexpr size_t kSizeTMax = std::numeric_limits<size_t>::max();
86   EXPECT_EQ(0u, AlignDown(0u, 4u));
87   EXPECT_EQ(0u, AlignDown(1u, 4u));
88   EXPECT_EQ(0u, AlignDown(1u, 4096u));
89   EXPECT_EQ(4096u, AlignDown(4096u, 4096u));
90   EXPECT_EQ(0u, AlignDown(4095u, 4096u));
91   EXPECT_EQ(4096u, AlignDown(4097u, 4096u));
92   EXPECT_EQ(kSizeTMax - 63, AlignDown(kSizeTMax - 62, size_t{32}));
93   EXPECT_EQ(kSizeTMax - 31, AlignDown(kSizeTMax, size_t{32}));
94   EXPECT_EQ(0ul, AlignDown(size_t{1}, kSizeTMax / 2 + 1));
95 }
96 
TEST(BitsTest,AlignDownPointer)97 TEST(BitsTest, AlignDownPointer) {
98   static constexpr uintptr_t kUintPtrTMax =
99       std::numeric_limits<uintptr_t>::max();
100   EXPECT_EQ(reinterpret_cast<uint8_t*>(0),
101             AlignDown(reinterpret_cast<uint8_t*>(0), 4));
102   EXPECT_EQ(reinterpret_cast<uint8_t*>(0),
103             AlignDown(reinterpret_cast<uint8_t*>(1), 4));
104   EXPECT_EQ(reinterpret_cast<uint8_t*>(0),
105             AlignDown(reinterpret_cast<uint8_t*>(1), 4096));
106   EXPECT_EQ(reinterpret_cast<uint8_t*>(4096),
107             AlignDown(reinterpret_cast<uint8_t*>(4096), 4096));
108   EXPECT_EQ(reinterpret_cast<uint8_t*>(0),
109             AlignDown(reinterpret_cast<uint8_t*>(4095), 4096));
110   EXPECT_EQ(reinterpret_cast<uint8_t*>(4096),
111             AlignDown(reinterpret_cast<uint8_t*>(4097), 4096));
112   EXPECT_EQ(reinterpret_cast<uint8_t*>(kUintPtrTMax - 63),
113             AlignDown(reinterpret_cast<uint8_t*>(kUintPtrTMax - 62), 32));
114   EXPECT_EQ(reinterpret_cast<uint8_t*>(kUintPtrTMax - 31),
115             AlignDown(reinterpret_cast<uint8_t*>(kUintPtrTMax), 32));
116   EXPECT_EQ(reinterpret_cast<uint8_t*>(0),
117             AlignDown(reinterpret_cast<uint8_t*>(1), kUintPtrTMax / 2 + 1));
118 }
119 
TEST(BitsTest,PowerOfTwoDeprecatedDoNotUse)120 TEST(BitsTest, PowerOfTwoDeprecatedDoNotUse) {
121   EXPECT_FALSE(IsPowerOfTwoDeprecatedDoNotUse(-1));
122   // Signed 64 bit cases.
123   for (uint32_t i = 2; i < 63; i++) {
124     const int64_t val = int64_t{1} << i;
125     EXPECT_FALSE(IsPowerOfTwoDeprecatedDoNotUse(val - 1));
126     EXPECT_TRUE(IsPowerOfTwoDeprecatedDoNotUse(val));
127     EXPECT_FALSE(IsPowerOfTwoDeprecatedDoNotUse(val + 1));
128   }
129   // Signed integers with only the last bit set are negative, not powers of two.
130   EXPECT_FALSE(IsPowerOfTwoDeprecatedDoNotUse(int64_t{1} << 63));
131 }
132 
TEST(BitsTest,LeftMostBit)133 TEST(BitsTest, LeftMostBit) {
134   // Construction of a signed type from an unsigned one of the same width
135   // preserves all bits. Explicitly confirming this behavior here to illustrate
136   // correctness of reusing unsigned literals to test behavior of signed types.
137   // Using signed literals does not work with EXPECT_EQ.
138   static_assert(int64_t(0xFFFFFFFFFFFFFFFFu) == 0xFFFFFFFFFFFFFFFFl,
139                 "Comparing signed with unsigned literals compares bits.");
140   static_assert((0xFFFFFFFFFFFFFFFFu ^ 0xFFFFFFFFFFFFFFFFl) == 0,
141                 "Signed and unsigned literals have the same bits set");
142 
143   uint64_t unsigned_long_long_value = 0x8000000000000000u;
144   EXPECT_EQ(LeftmostBit<uint64_t>(), unsigned_long_long_value);
145   EXPECT_EQ(LeftmostBit<int64_t>(), int64_t(unsigned_long_long_value));
146 
147   uint32_t unsigned_long_value = 0x80000000u;
148   EXPECT_EQ(LeftmostBit<uint32_t>(), unsigned_long_value);
149   EXPECT_EQ(LeftmostBit<int32_t>(), int32_t(unsigned_long_value));
150 
151   uint16_t unsigned_short_value = 0x8000u;
152   EXPECT_EQ(LeftmostBit<uint16_t>(), unsigned_short_value);
153   EXPECT_EQ(LeftmostBit<int16_t>(), int16_t(unsigned_short_value));
154 
155   uint8_t unsigned_byte_value = 0x80u;
156   EXPECT_EQ(LeftmostBit<uint8_t>(), unsigned_byte_value);
157   EXPECT_EQ(LeftmostBit<int8_t>(), int8_t(unsigned_byte_value));
158 }
159 
160 }  // namespace base::bits
161