1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "sleb128.h" 6 7 #include <vector> 8 #include "elf_traits.h" 9 #include "gtest/gtest.h" 10 11 namespace relocation_packer { 12 13 TEST(Sleb128, Encoder64) { 14 std::vector<uint64_t> values; 15 values.push_back(624485U); 16 values.push_back(0U); 17 values.push_back(1U); 18 values.push_back(63U); 19 values.push_back(64U); 20 values.push_back(static_cast<uint64_t>(-1)); 21 values.push_back(static_cast<uint64_t>(-624485)); 22 23 Sleb128Encoder<uint64_t> encoder; 24 encoder.EnqueueAll(values); 25 26 encoder.Enqueue(2147483647U); 27 encoder.Enqueue(static_cast<uint64_t>(-2147483648)); 28 encoder.Enqueue(9223372036854775807ULL); 29 encoder.Enqueue(static_cast<uint64_t>(-9223372036854775807LL - 1)); 30 31 std::vector<uint8_t> encoding; 32 encoder.GetEncoding(&encoding); 33 34 EXPECT_EQ(42u, encoding.size()); 35 // 624485 36 EXPECT_EQ(0xe5, encoding[0]); 37 EXPECT_EQ(0x8e, encoding[1]); 38 EXPECT_EQ(0x26, encoding[2]); 39 // 0 40 EXPECT_EQ(0x00, encoding[3]); 41 // 1 42 EXPECT_EQ(0x01, encoding[4]); 43 // 63 44 EXPECT_EQ(0x3f, encoding[5]); 45 // 64 46 EXPECT_EQ(0xc0, encoding[6]); 47 EXPECT_EQ(0x00, encoding[7]); 48 // -1 49 EXPECT_EQ(0x7f, encoding[8]); 50 // -624485 51 EXPECT_EQ(0x9b, encoding[9]); 52 EXPECT_EQ(0xf1, encoding[10]); 53 EXPECT_EQ(0x59, encoding[11]); 54 // 2147483647 55 EXPECT_EQ(0xff, encoding[12]); 56 EXPECT_EQ(0xff, encoding[13]); 57 EXPECT_EQ(0xff, encoding[14]); 58 EXPECT_EQ(0xff, encoding[15]); 59 EXPECT_EQ(0x07, encoding[16]); 60 // -2147483648 61 EXPECT_EQ(0x80, encoding[17]); 62 EXPECT_EQ(0x80, encoding[18]); 63 EXPECT_EQ(0x80, encoding[19]); 64 EXPECT_EQ(0x80, encoding[20]); 65 EXPECT_EQ(0x78, encoding[21]); 66 // 9223372036854775807 67 EXPECT_EQ(0xff, encoding[22]); 68 EXPECT_EQ(0xff, encoding[23]); 69 EXPECT_EQ(0xff, encoding[24]); 70 EXPECT_EQ(0xff, encoding[25]); 71 EXPECT_EQ(0xff, encoding[26]); 72 EXPECT_EQ(0xff, encoding[27]); 73 EXPECT_EQ(0xff, encoding[28]); 74 EXPECT_EQ(0xff, encoding[29]); 75 EXPECT_EQ(0xff, encoding[30]); 76 EXPECT_EQ(0x00, encoding[31]); 77 // -9223372036854775808 78 EXPECT_EQ(0x80, encoding[32]); 79 EXPECT_EQ(0x80, encoding[33]); 80 EXPECT_EQ(0x80, encoding[34]); 81 EXPECT_EQ(0x80, encoding[35]); 82 EXPECT_EQ(0x80, encoding[36]); 83 EXPECT_EQ(0x80, encoding[37]); 84 EXPECT_EQ(0x80, encoding[38]); 85 EXPECT_EQ(0x80, encoding[39]); 86 EXPECT_EQ(0x80, encoding[40]); 87 EXPECT_EQ(0x7f, encoding[41]); 88 } 89 90 TEST(Sleb128, Decoder) { 91 std::vector<uint8_t> encoding; 92 // 624485 93 encoding.push_back(0xe5); 94 encoding.push_back(0x8e); 95 encoding.push_back(0x26); 96 // 0 97 encoding.push_back(0x00); 98 // 1 99 encoding.push_back(0x01); 100 // 63 101 encoding.push_back(0x3f); 102 // 64 103 encoding.push_back(0xc0); 104 encoding.push_back(0x00); 105 // -1 106 encoding.push_back(0x7f); 107 // -624485 108 encoding.push_back(0x9b); 109 encoding.push_back(0xf1); 110 encoding.push_back(0x59); 111 // 2147483647 112 encoding.push_back(0xff); 113 encoding.push_back(0xff); 114 encoding.push_back(0xff); 115 encoding.push_back(0xff); 116 encoding.push_back(0x07); 117 // -2147483648 118 encoding.push_back(0x80); 119 encoding.push_back(0x80); 120 encoding.push_back(0x80); 121 encoding.push_back(0x80); 122 encoding.push_back(0x78); 123 // 9223372036854775807 124 encoding.push_back(0xff); 125 encoding.push_back(0xff); 126 encoding.push_back(0xff); 127 encoding.push_back(0xff); 128 encoding.push_back(0xff); 129 encoding.push_back(0xff); 130 encoding.push_back(0xff); 131 encoding.push_back(0xff); 132 encoding.push_back(0xff); 133 encoding.push_back(0x00); 134 // -9223372036854775808 135 encoding.push_back(0x80); 136 encoding.push_back(0x80); 137 encoding.push_back(0x80); 138 encoding.push_back(0x80); 139 encoding.push_back(0x80); 140 encoding.push_back(0x80); 141 encoding.push_back(0x80); 142 encoding.push_back(0x80); 143 encoding.push_back(0x80); 144 encoding.push_back(0x7f); 145 146 Sleb128Decoder<uint64_t> decoder(encoding, 0); 147 148 EXPECT_EQ(624485U, decoder.Dequeue()); 149 150 std::vector<uint64_t> dequeued; 151 decoder.DequeueAll(&dequeued); 152 153 EXPECT_EQ(10U, dequeued.size()); 154 EXPECT_EQ(0U, dequeued[0]); 155 EXPECT_EQ(1U, dequeued[1]); 156 EXPECT_EQ(63U, dequeued[2]); 157 EXPECT_EQ(64U, dequeued[3]); 158 EXPECT_EQ(static_cast<uint64_t>(-1), dequeued[4]); 159 EXPECT_EQ(static_cast<uint64_t>(-624485), dequeued[5]); 160 EXPECT_EQ(2147483647U, dequeued[6]); 161 EXPECT_EQ(static_cast<uint64_t>(-2147483648), dequeued[7]); 162 EXPECT_EQ(9223372036854775807ULL, dequeued[8]); 163 EXPECT_EQ(static_cast<uint64_t>(-9223372036854775807LL - 1), dequeued[9]); 164 } 165 166 } // namespace relocation_packer 167