DataExtractorTest.cpp 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. //===- llvm/unittest/Support/DataExtractorTest.cpp - DataExtractor tests --===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "llvm/Support/DataExtractor.h"
  9. #include "llvm/Testing/Support/Error.h"
  10. #include "gtest/gtest.h"
  11. using namespace llvm;
  12. namespace {
  13. const char numberData[] = "\x80\x90\xFF\xFF\x80\x00\x00\x00";
  14. const char stringData[] = "hellohello\0hello";
  15. const char leb128data[] = "\xA6\x49";
  16. const char bigleb128data[] = "\xAA\xA9\xFF\xAA\xFF\xAA\xFF\x4A";
  17. TEST(DataExtractorTest, OffsetOverflow) {
  18. DataExtractor DE(StringRef(numberData, sizeof(numberData)-1), false, 8);
  19. EXPECT_FALSE(DE.isValidOffsetForDataOfSize(-2U, 5));
  20. }
  21. TEST(DataExtractorTest, UnsignedNumbers) {
  22. DataExtractor DE(StringRef(numberData, sizeof(numberData)-1), false, 8);
  23. uint64_t offset = 0;
  24. EXPECT_EQ(0x80U, DE.getU8(&offset));
  25. EXPECT_EQ(1U, offset);
  26. offset = 0;
  27. EXPECT_EQ(0x8090U, DE.getU16(&offset));
  28. EXPECT_EQ(2U, offset);
  29. offset = 0;
  30. EXPECT_EQ(0x8090FFFFU, DE.getU32(&offset));
  31. EXPECT_EQ(4U, offset);
  32. offset = 0;
  33. EXPECT_EQ(0x8090FFFF80000000ULL, DE.getU64(&offset));
  34. EXPECT_EQ(8U, offset);
  35. offset = 0;
  36. EXPECT_EQ(0x8090FFFF80000000ULL, DE.getAddress(&offset));
  37. EXPECT_EQ(8U, offset);
  38. offset = 0;
  39. uint32_t data[2];
  40. EXPECT_EQ(data, DE.getU32(&offset, data, 2));
  41. EXPECT_EQ(0x8090FFFFU, data[0]);
  42. EXPECT_EQ(0x80000000U, data[1]);
  43. EXPECT_EQ(8U, offset);
  44. offset = 0;
  45. // Now for little endian.
  46. DE = DataExtractor(StringRef(numberData, sizeof(numberData)-1), true, 4);
  47. EXPECT_EQ(0x9080U, DE.getU16(&offset));
  48. EXPECT_EQ(2U, offset);
  49. offset = 0;
  50. EXPECT_EQ(0xFFFF9080U, DE.getU32(&offset));
  51. EXPECT_EQ(4U, offset);
  52. offset = 0;
  53. EXPECT_EQ(0x80FFFF9080ULL, DE.getU64(&offset));
  54. EXPECT_EQ(8U, offset);
  55. offset = 0;
  56. EXPECT_EQ(0xFFFF9080U, DE.getAddress(&offset));
  57. EXPECT_EQ(4U, offset);
  58. offset = 0;
  59. EXPECT_EQ(data, DE.getU32(&offset, data, 2));
  60. EXPECT_EQ(0xFFFF9080U, data[0]);
  61. EXPECT_EQ(0x80U, data[1]);
  62. EXPECT_EQ(8U, offset);
  63. }
  64. TEST(DataExtractorTest, SignedNumbers) {
  65. DataExtractor DE(StringRef(numberData, sizeof(numberData)-1), false, 8);
  66. uint64_t offset = 0;
  67. EXPECT_EQ(-128, DE.getSigned(&offset, 1));
  68. EXPECT_EQ(1U, offset);
  69. offset = 0;
  70. EXPECT_EQ(-32624, DE.getSigned(&offset, 2));
  71. EXPECT_EQ(2U, offset);
  72. offset = 0;
  73. EXPECT_EQ(-2137980929, DE.getSigned(&offset, 4));
  74. EXPECT_EQ(4U, offset);
  75. offset = 0;
  76. EXPECT_EQ(-9182558167379214336LL, DE.getSigned(&offset, 8));
  77. EXPECT_EQ(8U, offset);
  78. }
  79. TEST(DataExtractorTest, Strings) {
  80. DataExtractor DE(StringRef(stringData, sizeof(stringData)-1), false, 8);
  81. uint64_t offset = 0;
  82. EXPECT_EQ(stringData, DE.getCStr(&offset));
  83. EXPECT_EQ(11U, offset);
  84. EXPECT_EQ(nullptr, DE.getCStr(&offset));
  85. EXPECT_EQ(11U, offset);
  86. }
  87. TEST(DataExtractorTest, LEB128) {
  88. DataExtractor DE(StringRef(leb128data, sizeof(leb128data)-1), false, 8);
  89. uint64_t offset = 0;
  90. EXPECT_EQ(9382ULL, DE.getULEB128(&offset));
  91. EXPECT_EQ(2U, offset);
  92. offset = 0;
  93. EXPECT_EQ(-7002LL, DE.getSLEB128(&offset));
  94. EXPECT_EQ(2U, offset);
  95. DataExtractor BDE(StringRef(bigleb128data, sizeof(bigleb128data)-1), false,8);
  96. offset = 0;
  97. EXPECT_EQ(42218325750568106ULL, BDE.getULEB128(&offset));
  98. EXPECT_EQ(8U, offset);
  99. offset = 0;
  100. EXPECT_EQ(-29839268287359830LL, BDE.getSLEB128(&offset));
  101. EXPECT_EQ(8U, offset);
  102. }
  103. TEST(DataExtractorTest, LEB128_error) {
  104. DataExtractor DE(StringRef("\x81"), false, 8);
  105. uint64_t Offset = 0;
  106. EXPECT_EQ(0U, DE.getULEB128(&Offset));
  107. EXPECT_EQ(0U, Offset);
  108. Offset = 0;
  109. EXPECT_EQ(0U, DE.getSLEB128(&Offset));
  110. EXPECT_EQ(0U, Offset);
  111. }
  112. TEST(DataExtractorTest, Cursor_tell) {
  113. DataExtractor DE(StringRef("AB"), false, 8);
  114. DataExtractor::Cursor C(0);
  115. // A successful read operation advances the cursor
  116. EXPECT_EQ('A', DE.getU8(C));
  117. EXPECT_EQ(1u, C.tell());
  118. // An unsuccessful one doesn't.
  119. EXPECT_EQ(0u, DE.getU16(C));
  120. EXPECT_EQ(1u, C.tell());
  121. // And neither do any subsequent operations.
  122. EXPECT_EQ(0, DE.getU8(C));
  123. EXPECT_EQ(1u, C.tell());
  124. consumeError(C.takeError());
  125. }
  126. TEST(DataExtractorTest, Cursor_takeError) {
  127. DataExtractor DE(StringRef("AB"), false, 8);
  128. DataExtractor::Cursor C(0);
  129. // Initially, the cursor is in the "success" state.
  130. EXPECT_THAT_ERROR(C.takeError(), Succeeded());
  131. // It remains "success" after a successful read.
  132. EXPECT_EQ('A', DE.getU8(C));
  133. EXPECT_THAT_ERROR(C.takeError(), Succeeded());
  134. // An unsuccessful read sets the error state.
  135. EXPECT_EQ(0u, DE.getU32(C));
  136. EXPECT_THAT_ERROR(C.takeError(), Failed());
  137. // Once set the error sticks until explicitly cleared.
  138. EXPECT_EQ(0u, DE.getU32(C));
  139. EXPECT_EQ(0, DE.getU8(C));
  140. EXPECT_THAT_ERROR(C.takeError(), Failed());
  141. // At which point reads can be succeed again.
  142. EXPECT_EQ('B', DE.getU8(C));
  143. EXPECT_THAT_ERROR(C.takeError(), Succeeded());
  144. }
  145. TEST(DataExtractorTest, Cursor_chaining) {
  146. DataExtractor DE(StringRef("ABCD"), false, 8);
  147. DataExtractor::Cursor C(0);
  148. // Multiple reads can be chained without trigerring any assertions.
  149. EXPECT_EQ('A', DE.getU8(C));
  150. EXPECT_EQ('B', DE.getU8(C));
  151. EXPECT_EQ('C', DE.getU8(C));
  152. EXPECT_EQ('D', DE.getU8(C));
  153. // And the error checked at the end.
  154. EXPECT_THAT_ERROR(C.takeError(), Succeeded());
  155. }
  156. #if defined(GTEST_HAS_DEATH_TEST) && defined(_DEBUG)
  157. TEST(DataExtractorDeathTest, Cursor) {
  158. DataExtractor DE(StringRef("AB"), false, 8);
  159. // Even an unused cursor must be checked for errors:
  160. EXPECT_DEATH(DataExtractor::Cursor(0),
  161. "Success values must still be checked prior to being destroyed");
  162. {
  163. auto C = std::make_unique<DataExtractor::Cursor>(0);
  164. EXPECT_EQ(0u, DE.getU32(*C));
  165. // It must also be checked after an unsuccessful operation.
  166. // destruction.
  167. EXPECT_DEATH(C.reset(), "unexpected end of data");
  168. EXPECT_THAT_ERROR(C->takeError(), Failed());
  169. }
  170. {
  171. auto C = std::make_unique<DataExtractor::Cursor>(0);
  172. EXPECT_EQ('A', DE.getU8(*C));
  173. // Same goes for a successful one.
  174. EXPECT_DEATH(
  175. C.reset(),
  176. "Success values must still be checked prior to being destroyed");
  177. EXPECT_THAT_ERROR(C->takeError(), Succeeded());
  178. }
  179. {
  180. auto C = std::make_unique<DataExtractor::Cursor>(0);
  181. EXPECT_EQ('A', DE.getU8(*C));
  182. EXPECT_EQ(0u, DE.getU32(*C));
  183. // Even if a successful operation is followed by an unsuccessful one.
  184. EXPECT_DEATH(C.reset(), "unexpected end of data");
  185. EXPECT_THAT_ERROR(C->takeError(), Failed());
  186. }
  187. {
  188. auto C = std::make_unique<DataExtractor::Cursor>(0);
  189. EXPECT_EQ(0u, DE.getU32(*C));
  190. EXPECT_EQ(0, DE.getU8(*C));
  191. // Even if an unsuccessful operation is followed by one that would normally
  192. // succeed.
  193. EXPECT_DEATH(C.reset(), "unexpected end of data");
  194. EXPECT_THAT_ERROR(C->takeError(), Failed());
  195. }
  196. }
  197. #endif
  198. TEST(DataExtractorTest, getU8_vector) {
  199. DataExtractor DE(StringRef("AB"), false, 8);
  200. DataExtractor::Cursor C(0);
  201. SmallVector<uint8_t, 2> S;
  202. DE.getU8(C, S, 4);
  203. EXPECT_THAT_ERROR(C.takeError(), Failed());
  204. EXPECT_EQ("", toStringRef(S));
  205. DE.getU8(C, S, 2);
  206. EXPECT_THAT_ERROR(C.takeError(), Succeeded());
  207. EXPECT_EQ("AB", toStringRef(S));
  208. }
  209. TEST(DataExtractorTest, skip) {
  210. DataExtractor DE(StringRef("AB"), false, 8);
  211. DataExtractor::Cursor C(0);
  212. DE.skip(C, 4);
  213. EXPECT_THAT_ERROR(C.takeError(), Failed());
  214. EXPECT_EQ(0u, C.tell());
  215. DE.skip(C, 2);
  216. EXPECT_THAT_ERROR(C.takeError(), Succeeded());
  217. EXPECT_EQ(2u, C.tell());
  218. }
  219. TEST(DataExtractorTest, eof) {
  220. DataExtractor DE(StringRef("A"), false, 8);
  221. DataExtractor::Cursor C(0);
  222. EXPECT_FALSE(DE.eof(C));
  223. EXPECT_EQ(0, DE.getU16(C));
  224. EXPECT_FALSE(DE.eof(C));
  225. EXPECT_THAT_ERROR(C.takeError(), Failed());
  226. EXPECT_EQ('A', DE.getU8(C));
  227. EXPECT_TRUE(DE.eof(C));
  228. EXPECT_THAT_ERROR(C.takeError(), Succeeded());
  229. }
  230. }