this repo has no description
at trunk 287 lines 11 kB view raw
1// Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com) 2#include "utils.h" 3 4#include <dlfcn.h> 5 6#include <cstdio> 7#include <cstdlib> 8#include <cstring> 9#include <sstream> 10 11#include "gtest/gtest.h" 12 13#include "modules.h" 14#include "test-utils.h" 15 16namespace py { 17namespace testing { 18 19using UtilsTest = RuntimeFixture; 20using UtilsDeathTest = RuntimeFixture; 21 22TEST(UtilsTestNoFixture, MemoryFindWithEmptyHaystackReturnsNegativeOne) { 23 byte haystack[] = "hello"; 24 byte needle[] = "el"; 25 EXPECT_EQ(Utils::memoryFind(haystack, 0, needle, 2), -1); 26} 27 28TEST(UtilsTestNoFixture, MemoryFindWithZeroLengthNeedleReturnsNegativeOne) { 29 byte haystack[] = "hello"; 30 byte needle[] = "el"; 31 EXPECT_EQ(Utils::memoryFind(haystack, 5, needle, 0), -1); 32} 33 34TEST(UtilsTestNoFixture, 35 MemoryFindWithHaystackLengthLessThanNeedleLengthReturnsNegativeOne) { 36 byte haystack[] = "hello"; 37 byte needle[] = "el"; 38 EXPECT_EQ(Utils::memoryFind(haystack, 1, needle, 2), -1); 39} 40 41TEST(UtilsTestNoFixture, MemoryFindWithCharNeedleInHaystackReturnsLocation) { 42 byte haystack[] = "hello"; 43 byte needle[] = "el"; 44 EXPECT_EQ(Utils::memoryFind(haystack, 5, needle, 1), 1); 45} 46 47TEST(UtilsTestNoFixture, 48 MemoryFindWithCharNeedleNotInHaystackReturnsNegativeOne) { 49 byte haystack[] = "hello"; 50 byte needle[] = "q"; 51 EXPECT_EQ(Utils::memoryFind(haystack, 5, needle, 1), -1); 52} 53 54TEST(UtilsTestNoFixture, MemoryFindWithNeedleInHaystackReturnsLocation) { 55 byte haystack[] = "hello"; 56 byte needle[] = "el"; 57 EXPECT_EQ(Utils::memoryFind(haystack, 5, needle, 2), 1); 58} 59 60TEST(UtilsTestNoFixture, 61 MemoryFindWithNeedleInHaystackReturnsFirstLocationFromLeft) { 62 byte haystack[] = "hello hello"; 63 byte needle[] = "el"; 64 EXPECT_EQ(Utils::memoryFind(haystack, 11, needle, 2), 1); 65} 66 67TEST(UtilsTestNoFixture, MemoryFindWithNeedleNotInHaystackReturnsNegativeOne) { 68 byte haystack[] = "hello"; 69 byte needle[] = "qo"; 70 EXPECT_EQ(Utils::memoryFind(haystack, 5, needle, 2), -1); 71} 72 73TEST(UtilsTestNoFixture, MemoryFindCharWithEmptyHaystackReturnsNegativeOne) { 74 byte haystack[] = "hello"; 75 int needle = 'h'; 76 EXPECT_EQ(Utils::memoryFindChar(haystack, 0, needle), -1); 77} 78 79TEST(UtilsTestNoFixture, MemoryFindCharWithNeedleInHaystackReturnsLocation) { 80 byte haystack[] = "hello"; 81 int needle = 'h'; 82 EXPECT_EQ(Utils::memoryFindChar(haystack, 5, needle), 0); 83} 84 85TEST(UtilsTestNoFixture, 86 MemoryFindCharWithNeedleInHaystackReturnsLeftmostLocation) { 87 byte haystack[] = "helloh"; 88 int needle = 'h'; 89 EXPECT_EQ(Utils::memoryFindChar(haystack, 6, needle), 0); 90} 91 92TEST(UtilsTestNoFixture, 93 MemoryFindCharReverseWithEmptyHaystackReturnsNegativeOne) { 94 byte haystack[] = "hello"; 95 int needle = 'h'; 96 EXPECT_EQ(Utils::memoryFindCharReverse(haystack, 0, needle), -1); 97} 98 99TEST(UtilsTestNoFixture, 100 MemoryFindCharReverseWithNeedleInHaystackReturnsLocation) { 101 byte haystack[] = "hello"; 102 int needle = 'h'; 103 EXPECT_EQ(Utils::memoryFindCharReverse(haystack, 5, needle), 0); 104} 105 106TEST(UtilsTestNoFixture, 107 MemoryFindCharReverseWithNeedleInHaystackReturnsRightmostLocation) { 108 byte haystack[] = "helloh"; 109 int needle = 'h'; 110 EXPECT_EQ(Utils::memoryFindCharReverse(haystack, 6, needle), 5); 111} 112 113TEST(UtilsTestNoFixture, MemoryFindReverseWithEmptyHaystackReturnsNegativeOne) { 114 byte haystack[] = "hello"; 115 byte needle[] = "el"; 116 EXPECT_EQ(Utils::memoryFindReverse(haystack, 0, needle, 2), -1); 117} 118 119TEST(UtilsTestNoFixture, MemoryFindReverseWithEmptyNeedleReturnsNegativeOne) { 120 byte haystack[] = "hello"; 121 byte needle[] = "el"; 122 EXPECT_EQ(Utils::memoryFindReverse(haystack, 5, needle, 0), -1); 123} 124 125TEST(UtilsTestNoFixture, 126 MemoryFindReverseWithHaystackSmallerThanNeedleReturnsNegativeOne) { 127 byte haystack[] = "hello"; 128 byte needle[] = "el"; 129 EXPECT_EQ(Utils::memoryFindReverse(haystack, 1, needle, 2), -1); 130} 131 132TEST(UtilsTestNoFixture, 133 MemoryFindReverseWithCharNeedleInHaystackReturnsLocation) { 134 byte haystack[] = "hello"; 135 byte needle[] = "el"; 136 EXPECT_EQ(Utils::memoryFindReverse(haystack, 5, needle, 1), 1); 137} 138 139TEST(UtilsTestNoFixture, 140 MemoryFindReverseWithCharNeedleNotInHaystackReturnsNegativeOne) { 141 byte haystack[] = "hello"; 142 byte needle[] = "q"; 143 EXPECT_EQ(Utils::memoryFindReverse(haystack, 5, needle, 1), -1); 144} 145 146TEST(UtilsTestNoFixture, MemoryFindReverseWithNeedleInHaystackReturnsLocation) { 147 byte haystack[] = "hello"; 148 byte needle[] = "el"; 149 EXPECT_EQ(Utils::memoryFindReverse(haystack, 5, needle, 2), 1); 150} 151 152TEST(UtilsTestNoFixture, 153 MemoryFindReverseWithNeedleInHaystackReturnsFirstLocationFromRight) { 154 byte haystack[] = "hello hello"; 155 byte needle[] = "el"; 156 EXPECT_EQ(Utils::memoryFindReverse(haystack, 11, needle, 2), 7); 157} 158 159TEST(UtilsTestNoFixture, 160 MemoryFindReverseWithNeedleNotInHaystackReturnsNegativeOne) { 161 byte haystack[] = "hello"; 162 byte needle[] = "qo"; 163 EXPECT_EQ(Utils::memoryFindReverse(haystack, 5, needle, 2), -1); 164} 165 166TEST(UtilsTestNoFixture, RotateLeft) { 167 EXPECT_EQ(Utils::rotateLeft(1ULL, 0), 0x0000000000000001ULL); 168 EXPECT_EQ(Utils::rotateLeft(1ULL, 1), 0x0000000000000002ULL); 169 EXPECT_EQ(Utils::rotateLeft(1ULL, 2), 0x0000000000000004ULL); 170 EXPECT_EQ(Utils::rotateLeft(1ULL, 3), 0x0000000000000008ULL); 171 EXPECT_EQ(Utils::rotateLeft(1ULL, 4), 0x0000000000000010ULL); 172 EXPECT_EQ(Utils::rotateLeft(1ULL, 5), 0x0000000000000020ULL); 173 EXPECT_EQ(Utils::rotateLeft(1ULL, 6), 0x0000000000000040ULL); 174 EXPECT_EQ(Utils::rotateLeft(1ULL, 7), 0x0000000000000080ULL); 175 EXPECT_EQ(Utils::rotateLeft(1ULL, 8), 0x0000000000000100ULL); 176 EXPECT_EQ(Utils::rotateLeft(1ULL, 9), 0x0000000000000200ULL); 177 EXPECT_EQ(Utils::rotateLeft(1ULL, 10), 0x0000000000000400ULL); 178 EXPECT_EQ(Utils::rotateLeft(1ULL, 11), 0x0000000000000800ULL); 179 EXPECT_EQ(Utils::rotateLeft(1ULL, 12), 0x0000000000001000ULL); 180 EXPECT_EQ(Utils::rotateLeft(1ULL, 13), 0x0000000000002000ULL); 181 EXPECT_EQ(Utils::rotateLeft(1ULL, 14), 0x0000000000004000ULL); 182 EXPECT_EQ(Utils::rotateLeft(1ULL, 15), 0x0000000000008000ULL); 183 EXPECT_EQ(Utils::rotateLeft(1ULL, 16), 0x0000000000010000ULL); 184 EXPECT_EQ(Utils::rotateLeft(1ULL, 17), 0x0000000000020000ULL); 185 EXPECT_EQ(Utils::rotateLeft(1ULL, 18), 0x0000000000040000ULL); 186 EXPECT_EQ(Utils::rotateLeft(1ULL, 19), 0x0000000000080000ULL); 187 EXPECT_EQ(Utils::rotateLeft(1ULL, 20), 0x0000000000100000ULL); 188 EXPECT_EQ(Utils::rotateLeft(1ULL, 21), 0x0000000000200000ULL); 189 EXPECT_EQ(Utils::rotateLeft(1ULL, 22), 0x0000000000400000ULL); 190 EXPECT_EQ(Utils::rotateLeft(1ULL, 23), 0x0000000000800000ULL); 191 EXPECT_EQ(Utils::rotateLeft(1ULL, 24), 0x0000000001000000ULL); 192 EXPECT_EQ(Utils::rotateLeft(1ULL, 25), 0x0000000002000000ULL); 193 EXPECT_EQ(Utils::rotateLeft(1ULL, 26), 0x0000000004000000ULL); 194 EXPECT_EQ(Utils::rotateLeft(1ULL, 27), 0x0000000008000000ULL); 195 EXPECT_EQ(Utils::rotateLeft(1ULL, 28), 0x0000000010000000ULL); 196 EXPECT_EQ(Utils::rotateLeft(1ULL, 29), 0x0000000020000000ULL); 197 EXPECT_EQ(Utils::rotateLeft(1ULL, 30), 0x0000000040000000ULL); 198 EXPECT_EQ(Utils::rotateLeft(1ULL, 31), 0x0000000080000000ULL); 199 EXPECT_EQ(Utils::rotateLeft(1ULL, 32), 0x0000000100000000ULL); 200 EXPECT_EQ(Utils::rotateLeft(1ULL, 33), 0x0000000200000000ULL); 201 EXPECT_EQ(Utils::rotateLeft(1ULL, 34), 0x0000000400000000ULL); 202 EXPECT_EQ(Utils::rotateLeft(1ULL, 35), 0x0000000800000000ULL); 203 EXPECT_EQ(Utils::rotateLeft(1ULL, 36), 0x0000001000000000ULL); 204 EXPECT_EQ(Utils::rotateLeft(1ULL, 37), 0x0000002000000000ULL); 205 EXPECT_EQ(Utils::rotateLeft(1ULL, 38), 0x0000004000000000ULL); 206 EXPECT_EQ(Utils::rotateLeft(1ULL, 39), 0x0000008000000000ULL); 207 EXPECT_EQ(Utils::rotateLeft(1ULL, 40), 0x0000010000000000ULL); 208 EXPECT_EQ(Utils::rotateLeft(1ULL, 41), 0x0000020000000000ULL); 209 EXPECT_EQ(Utils::rotateLeft(1ULL, 42), 0x0000040000000000ULL); 210 EXPECT_EQ(Utils::rotateLeft(1ULL, 43), 0x0000080000000000ULL); 211 EXPECT_EQ(Utils::rotateLeft(1ULL, 44), 0x0000100000000000ULL); 212 EXPECT_EQ(Utils::rotateLeft(1ULL, 45), 0x0000200000000000ULL); 213 EXPECT_EQ(Utils::rotateLeft(1ULL, 46), 0x0000400000000000ULL); 214 EXPECT_EQ(Utils::rotateLeft(1ULL, 47), 0x0000800000000000ULL); 215 EXPECT_EQ(Utils::rotateLeft(1ULL, 48), 0x0001000000000000ULL); 216 EXPECT_EQ(Utils::rotateLeft(1ULL, 49), 0x0002000000000000ULL); 217 EXPECT_EQ(Utils::rotateLeft(1ULL, 50), 0x0004000000000000ULL); 218 EXPECT_EQ(Utils::rotateLeft(1ULL, 51), 0x0008000000000000ULL); 219 EXPECT_EQ(Utils::rotateLeft(1ULL, 52), 0x0010000000000000ULL); 220 EXPECT_EQ(Utils::rotateLeft(1ULL, 53), 0x0020000000000000ULL); 221 EXPECT_EQ(Utils::rotateLeft(1ULL, 54), 0x0040000000000000ULL); 222 EXPECT_EQ(Utils::rotateLeft(1ULL, 55), 0x0080000000000000ULL); 223 EXPECT_EQ(Utils::rotateLeft(1ULL, 56), 0x0100000000000000ULL); 224 EXPECT_EQ(Utils::rotateLeft(1ULL, 57), 0x0200000000000000ULL); 225 EXPECT_EQ(Utils::rotateLeft(1ULL, 58), 0x0400000000000000ULL); 226 EXPECT_EQ(Utils::rotateLeft(1ULL, 59), 0x0800000000000000ULL); 227 EXPECT_EQ(Utils::rotateLeft(1ULL, 60), 0x1000000000000000ULL); 228 EXPECT_EQ(Utils::rotateLeft(1ULL, 61), 0x2000000000000000ULL); 229 EXPECT_EQ(Utils::rotateLeft(1ULL, 62), 0x4000000000000000ULL); 230 EXPECT_EQ(Utils::rotateLeft(1ULL, 63), 0x8000000000000000ULL); 231} 232 233ALIGN_16 RawObject printDebugInfoAndAbortTest(Thread* thread, Arguments) { 234 // Produce a pending exception with stacktrace! 235 HandleScope scope(thread); 236 Object call_raising(&scope, mainModuleAt(thread->runtime(), "call_raising")); 237 EXPECT_TRUE(Interpreter::call0(thread, call_raising).isErrorException()); 238 239 Utils::printDebugInfoAndAbort(); 240} 241 242TEST_F(UtilsDeathTest, PrintDebugInfoAndAbortPrintsTraceback) { 243 addBuiltin("test_print_debug_info_and_abort", printDebugInfoAndAbortTest, 244 View<const char*>(nullptr, 0), /*code_flags=*/0); 245 ASSERT_DEATH(static_cast<void>(runFromCStr(runtime_, R"( 246def raising(): 247 raise UserWarning("Hello") 248 249def call_raising(): 250 raising() 251 252def foo(): 253 test_print_debug_info_and_abort() 254 255def bar(): 256 foo() 257 258bar() 259)")), 260 R"(Stack \(most recent call first\): 261 File "", line \?\?\? in test_print_debug_info_and_abort 262 File "<test string>", line 9 in foo 263 File "<test string>", line 12 in bar 264 File "<test string>", line 14 in <module> 265Pending exception 266 Type : <type "UserWarning"> 267 Value : <"UserWarning" object> 268 Exception Args: \("Hello",\) 269 Traceback : <"traceback" object> 270Traceback \(most recent call last\): 271 File "<test string>", line 6, in call_raising 272 File "<test string>", line 3, in raising 273)"); 274} 275 276TEST_F(UtilsTest, RoundUpDiv) { 277 EXPECT_EQ(Utils::roundUpDiv(17, 3), 6); 278 EXPECT_EQ(Utils::roundUpDiv(17, 2), 9); 279} 280 281TEST(UtilsTestNoFixture, FailedDcheckWithNoThread) { 282 EXPECT_EXIT(CHECK(false, "something went wrong!"), 283 ::testing::KilledBySignal(SIGABRT), "something went wrong!"); 284} 285 286} // namespace testing 287} // namespace py