this repo has no description
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