]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Test/GoogleTest/Library/BaseSafeIntLib/SafeIntLibUintnIntnUnitTests32.cpp
MdePkg/Test: Add port of BaseSafeIntLib unit tests to GoogleTest
[mirror_edk2.git] / MdePkg / Test / GoogleTest / Library / BaseSafeIntLib / SafeIntLibUintnIntnUnitTests32.cpp
CommitLineData
6d55ad9a
MK
1/** @file\r
2 IA32-specific functions for unit-testing INTN and UINTN functions in\r
3 SafeIntLib.\r
4\r
5 Copyright (c) Microsoft Corporation.<BR>\r
6 Copyright (c) 2019 - 2020, Intel Corporation. All rights reserved.<BR>\r
7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
8\r
9**/\r
10\r
11#include <gtest/gtest.h>\r
12extern "C" {\r
13 #include <Base.h>\r
14 #include <Library/SafeIntLib.h>\r
15}\r
16\r
17TEST(ConversionTestSuite, TestSafeInt32ToUintn) {\r
18 RETURN_STATUS Status;\r
19 INT32 Operand;\r
20 UINTN Result;\r
21\r
22 //\r
23 // If Operand is non-negative, then it's a cast\r
24 //\r
25 Operand = 0x5bababab;\r
26 Result = 0;\r
27 Status = SafeInt32ToUintn (Operand, &Result);\r
28 ASSERT_EQ (Status, RETURN_SUCCESS);\r
29 ASSERT_EQ ((UINTN)0x5bababab, Result);\r
30\r
31 //\r
32 // Otherwise should result in an error status\r
33 //\r
34 Operand = (-1537977259);\r
35 Status = SafeInt32ToUintn (Operand, &Result);\r
36 ASSERT_EQ (RETURN_BUFFER_TOO_SMALL, Status);\r
37}\r
38\r
39TEST(ConversionTestSuite, TestSafeUint32ToIntn) {\r
40 RETURN_STATUS Status;\r
41 UINT32 Operand;\r
42 INTN Result;\r
43\r
44 //\r
45 // If Operand is <= MAX_INTN, then it's a cast\r
46 //\r
47 Operand = 0x5bababab;\r
48 Result = 0;\r
49 Status = SafeUint32ToIntn (Operand, &Result);\r
50 ASSERT_EQ (Status, RETURN_SUCCESS);\r
51 ASSERT_EQ (0x5bababab, Result);\r
52\r
53 //\r
54 // Otherwise should result in an error status\r
55 //\r
56 Operand = (0xabababab);\r
57 Status = SafeUint32ToIntn (Operand, &Result);\r
58 ASSERT_EQ (RETURN_BUFFER_TOO_SMALL, Status);\r
59}\r
60\r
61TEST(ConversionTestSuite, TestSafeIntnToInt32) {\r
62 RETURN_STATUS Status;\r
63 INTN Operand;\r
64 INT32 Result;\r
65\r
66 //\r
67 // INTN is same as INT32 in IA32, so this is just a cast\r
68 //\r
69 Operand = 0x5bababab;\r
70 Result = 0;\r
71 Status = SafeIntnToInt32 (Operand, &Result);\r
72 ASSERT_EQ (Status, RETURN_SUCCESS);\r
73 ASSERT_EQ (0x5bababab, Result);\r
74}\r
75\r
76TEST(ConversionTestSuite, TestSafeIntnToUint32) {\r
77 RETURN_STATUS Status;\r
78 INTN Operand;\r
79 UINT32 Result;\r
80\r
81 //\r
82 // If Operand is non-negative, then it's a cast\r
83 //\r
84 Operand = 0x5bababab;\r
85 Result = 0;\r
86 Status = SafeIntnToUint32 (Operand, &Result);\r
87 ASSERT_EQ (Status, RETURN_SUCCESS);\r
88 ASSERT_EQ ((UINT32)0x5bababab, Result);\r
89\r
90 //\r
91 // Otherwise should result in an error status\r
92 //\r
93 Operand = (-1537977259);\r
94 Status = SafeIntnToUint32 (Operand, &Result);\r
95 ASSERT_EQ (RETURN_BUFFER_TOO_SMALL, Status);\r
96}\r
97\r
98TEST(ConversionTestSuite, TestSafeUintnToUint32) {\r
99 RETURN_STATUS Status;\r
100 UINTN Operand;\r
101 UINT32 Result;\r
102\r
103 //\r
104 // UINTN is same as UINT32 in IA32, so this is just a cast\r
105 //\r
106 Operand = 0xabababab;\r
107 Result = 0;\r
108 Status = SafeUintnToUint32 (Operand, &Result);\r
109 ASSERT_EQ (Status, RETURN_SUCCESS);\r
110 ASSERT_EQ (0xabababab, Result);\r
111}\r
112\r
113TEST(ConversionTestSuite, TestSafeUintnToIntn) {\r
114 RETURN_STATUS Status;\r
115 UINTN Operand;\r
116 INTN Result;\r
117\r
118 //\r
119 // If Operand is <= MAX_INTN, then it's a cast\r
120 //\r
121 Operand = 0x5bababab;\r
122 Result = 0;\r
123 Status = SafeUintnToIntn (Operand, &Result);\r
124 ASSERT_EQ (Status, RETURN_SUCCESS);\r
125 ASSERT_EQ (0x5bababab, Result);\r
126\r
127 //\r
128 // Otherwise should result in an error status\r
129 //\r
130 Operand = (0xabababab);\r
131 Status = SafeUintnToIntn (Operand, &Result);\r
132 ASSERT_EQ (RETURN_BUFFER_TOO_SMALL, Status);\r
133}\r
134\r
135TEST(ConversionTestSuite, TestSafeUintnToInt64) {\r
136 RETURN_STATUS Status;\r
137 UINTN Operand;\r
138 INT64 Result;\r
139\r
140 //\r
141 // UINTN is same as UINT32 in IA32, and UINT32 is a subset of\r
142 // INT64, so this is just a cast\r
143 //\r
144 Operand = 0xabababab;\r
145 Result = 0;\r
146 Status = SafeUintnToInt64 (Operand, &Result);\r
147 ASSERT_EQ (Status, RETURN_SUCCESS);\r
148 ASSERT_EQ (0xabababab, Result);\r
149}\r
150\r
151TEST(ConversionTestSuite, TestSafeInt64ToIntn) {\r
152 RETURN_STATUS Status;\r
153 INT64 Operand;\r
154 INTN Result;\r
155\r
156 //\r
157 // If Operand is between MIN_INTN and MAX_INTN2 inclusive, then it's a cast\r
158 //\r
159 Operand = 0x5bababab;\r
160 Result = 0;\r
161 Status = SafeInt64ToIntn (Operand, &Result);\r
162 ASSERT_EQ (Status, RETURN_SUCCESS);\r
163 ASSERT_EQ (0x5bababab, Result);\r
164\r
165 Operand = (-1537977259);\r
166 Status = SafeInt64ToIntn (Operand, &Result);\r
167 ASSERT_EQ (Status, RETURN_SUCCESS);\r
168 ASSERT_EQ ((-1537977259), Result);\r
169\r
170 //\r
171 // Otherwise should result in an error status\r
172 //\r
173 Operand = (0x5babababefefefef);\r
174 Status = SafeInt64ToIntn (Operand, &Result);\r
175 ASSERT_EQ (RETURN_BUFFER_TOO_SMALL, Status);\r
176\r
177 Operand = (-6605562033422200815);\r
178 Status = SafeInt64ToIntn (Operand, &Result);\r
179 ASSERT_EQ (RETURN_BUFFER_TOO_SMALL, Status);\r
180}\r
181\r
182TEST(ConversionTestSuite, TestSafeInt64ToUintn) {\r
183 RETURN_STATUS Status;\r
184 INT64 Operand;\r
185 UINTN Result;\r
186\r
187 //\r
188 // If Operand is between 0 and MAX_UINTN inclusive, then it's a cast\r
189 //\r
190 Operand = 0xabababab;\r
191 Result = 0;\r
192 Status = SafeInt64ToUintn (Operand, &Result);\r
193 ASSERT_EQ (Status, RETURN_SUCCESS);\r
194 ASSERT_EQ (0xabababab, Result);\r
195\r
196 //\r
197 // Otherwise should result in an error status\r
198 //\r
199 Operand = (0x5babababefefefef);\r
200 Status = SafeInt64ToUintn (Operand, &Result);\r
201 ASSERT_EQ (RETURN_BUFFER_TOO_SMALL, Status);\r
202\r
203 Operand = (-6605562033422200815);\r
204 Status = SafeInt64ToUintn (Operand, &Result);\r
205 ASSERT_EQ (RETURN_BUFFER_TOO_SMALL, Status);\r
206}\r
207\r
208TEST(ConversionTestSuite, TestSafeUint64ToIntn) {\r
209 RETURN_STATUS Status;\r
210 UINT64 Operand;\r
211 INTN Result;\r
212\r
213 //\r
214 // If Operand is <= MAX_INTN, then it's a cast\r
215 //\r
216 Operand = 0x5bababab;\r
217 Result = 0;\r
218 Status = SafeUint64ToIntn (Operand, &Result);\r
219 ASSERT_EQ (Status, RETURN_SUCCESS);\r
220 ASSERT_EQ (0x5bababab, Result);\r
221\r
222 //\r
223 // Otherwise should result in an error status\r
224 //\r
225 Operand = (0xababababefefefef);\r
226 Status = SafeUint64ToIntn (Operand, &Result);\r
227 ASSERT_EQ (RETURN_BUFFER_TOO_SMALL, Status);\r
228}\r
229\r
230TEST(ConversionTestSuite, TestSafeUint64ToUintn) {\r
231 RETURN_STATUS Status;\r
232 UINT64 Operand;\r
233 UINTN Result;\r
234\r
235 //\r
236 // If Operand is <= MAX_UINTN, then it's a cast\r
237 //\r
238 Operand = 0xabababab;\r
239 Result = 0;\r
240 Status = SafeUint64ToUintn (Operand, &Result);\r
241 ASSERT_EQ (Status, RETURN_SUCCESS);\r
242 ASSERT_EQ (0xabababab, Result);\r
243\r
244 //\r
245 // Otherwise should result in an error status\r
246 //\r
247 Operand = (0xababababefefefef);\r
248 Status = SafeUint64ToUintn (Operand, &Result);\r
249 ASSERT_EQ (RETURN_BUFFER_TOO_SMALL, Status);\r
250}\r
251\r
252TEST(AdditionSubtractionTestSuite, TestSafeUintnAdd) {\r
253 RETURN_STATUS Status;\r
254 UINTN Augend;\r
255 UINTN Addend;\r
256 UINTN Result;\r
257\r
258 //\r
259 // If the result of addition doesn't overflow MAX_UINTN, then it's addition\r
260 //\r
261 Augend = 0x3a3a3a3a;\r
262 Addend = 0x3a3a3a3a;\r
263 Result = 0;\r
264 Status = SafeUintnAdd (Augend, Addend, &Result);\r
265 ASSERT_EQ (Status, RETURN_SUCCESS);\r
266 ASSERT_EQ ((UINTN)0x74747474, Result);\r
267\r
268 //\r
269 // Otherwise should result in an error status\r
270 //\r
271 Augend = 0xabababab;\r
272 Addend = 0xbcbcbcbc;\r
273 Status = SafeUintnAdd (Augend, Addend, &Result);\r
274 ASSERT_EQ (RETURN_BUFFER_TOO_SMALL, Status);\r
275}\r
276\r
277TEST(AdditionSubtractionTestSuite, TestSafeIntnAdd) {\r
278 RETURN_STATUS Status;\r
279 INTN Augend;\r
280 INTN Addend;\r
281 INTN Result;\r
282\r
283 //\r
284 // If the result of addition doesn't overflow MAX_INTN\r
285 // and doesn't underflow MIN_INTN, then it's addition\r
286 //\r
287 Augend = 0x3a3a3a3a;\r
288 Addend = 0x3a3a3a3a;\r
289 Result = 0;\r
290 Status = SafeIntnAdd (Augend, Addend, &Result);\r
291 ASSERT_EQ (Status, RETURN_SUCCESS);\r
292 ASSERT_EQ (0x74747474, Result);\r
293\r
294 Augend = (-976894522);\r
295 Addend = (-976894522);\r
296 Status = SafeIntnAdd (Augend, Addend, &Result);\r
297 ASSERT_EQ (Status, RETURN_SUCCESS);\r
298 ASSERT_EQ ((-1953789044), Result);\r
299\r
300 //\r
301 // Otherwise should result in an error status\r
302 //\r
303 Augend = 0x5a5a5a5a;\r
304 Addend = 0x5a5a5a5a;\r
305 Status = SafeIntnAdd (Augend, Addend, &Result);\r
306 ASSERT_EQ (RETURN_BUFFER_TOO_SMALL, Status);\r
307\r
308 Augend = (-1515870810);\r
309 Addend = (-1515870810);\r
310 Status = SafeIntnAdd (Augend, Addend, &Result);\r
311 ASSERT_EQ (RETURN_BUFFER_TOO_SMALL, Status);\r
312}\r
313\r
314TEST(AdditionSubtractionTestSuite, TestSafeUintnSub) {\r
315 RETURN_STATUS Status;\r
316 UINTN Minuend;\r
317 UINTN Subtrahend;\r
318 UINTN Result;\r
319\r
320 //\r
321 // If Minuend >= Subtrahend, then it's subtraction\r
322 //\r
323 Minuend = 0x5a5a5a5a;\r
324 Subtrahend = 0x3b3b3b3b;\r
325 Result = 0;\r
326 Status = SafeUintnSub (Minuend, Subtrahend, &Result);\r
327 ASSERT_EQ (Status, RETURN_SUCCESS);\r
328 ASSERT_EQ ((UINTN)0x1f1f1f1f, Result);\r
329\r
330 //\r
331 // Otherwise should result in an error status\r
332 //\r
333 Minuend = 0x5a5a5a5a;\r
334 Subtrahend = 0x6d6d6d6d;\r
335 Status = SafeUintnSub (Minuend, Subtrahend, &Result);\r
336 ASSERT_EQ (RETURN_BUFFER_TOO_SMALL, Status);\r
337}\r
338\r
339TEST(AdditionSubtractionTestSuite, TestSafeIntnSub) {\r
340 RETURN_STATUS Status;\r
341 INTN Minuend;\r
342 INTN Subtrahend;\r
343 INTN Result;\r
344\r
345 //\r
346 // If the result of subtractions doesn't overflow MAX_INTN or\r
347 // underflow MIN_INTN, then it's subtraction\r
348 //\r
349 Minuend = 0x5a5a5a5a;\r
350 Subtrahend = 0x3a3a3a3a;\r
351 Result = 0;\r
352 Status = SafeIntnSub (Minuend, Subtrahend, &Result);\r
353 ASSERT_EQ (Status, RETURN_SUCCESS);\r
354 ASSERT_EQ (0x20202020, Result);\r
355\r
356 Minuend = 0x3a3a3a3a;\r
357 Subtrahend = 0x5a5a5a5a;\r
358 Status = SafeIntnSub (Minuend, Subtrahend, &Result);\r
359 ASSERT_EQ (Status, RETURN_SUCCESS);\r
360 ASSERT_EQ ((-538976288), Result);\r
361\r
362 //\r
363 // Otherwise should result in an error status\r
364 //\r
365 Minuend = (-2054847098);\r
366 Subtrahend = 2054847098;\r
367 Status = SafeIntnSub (Minuend, Subtrahend, &Result);\r
368 ASSERT_EQ (RETURN_BUFFER_TOO_SMALL, Status);\r
369\r
370 Minuend = (2054847098);\r
371 Subtrahend = (-2054847098);\r
372 Status = SafeIntnSub (Minuend, Subtrahend, &Result);\r
373 ASSERT_EQ (RETURN_BUFFER_TOO_SMALL, Status);\r
374}\r
375\r
376TEST(MultiplicationTestSuite, TestSafeUintnMult) {\r
377 RETURN_STATUS Status;\r
378 UINTN Multiplicand;\r
379 UINTN Multiplier;\r
380 UINTN Result;\r
381\r
382 //\r
383 // If the result of multiplication doesn't overflow MAX_UINTN, it will succeed\r
384 //\r
385 Multiplicand = 0xa122a;\r
386 Multiplier = 0xd23;\r
387 Result = 0;\r
388 Status = SafeUintnMult (Multiplicand, Multiplier, &Result);\r
389 ASSERT_EQ (Status, RETURN_SUCCESS);\r
390 ASSERT_EQ (0x844c9dbe, Result);\r
391\r
392 //\r
393 // Otherwise should result in an error status\r
394 //\r
395 Multiplicand = 0xa122a;\r
396 Multiplier = 0xed23;\r
397 Status = SafeUintnMult (Multiplicand, Multiplier, &Result);\r
398 ASSERT_EQ (RETURN_BUFFER_TOO_SMALL, Status);\r
399}\r
400\r
401TEST(MultiplicationTestSuite, TestSafeIntnMult) {\r
402 RETURN_STATUS Status;\r
403 INTN Multiplicand;\r
404 INTN Multiplier;\r
405 INTN Result;\r
406\r
407 //\r
408 // If the result of multiplication doesn't overflow MAX_INTN and doesn't\r
409 // underflow MIN_UINTN, it will succeed\r
410 //\r
411 Multiplicand = 0x123456;\r
412 Multiplier = 0x678;\r
413 Result = 0;\r
414 Status = SafeIntnMult (Multiplicand, Multiplier, &Result);\r
415 ASSERT_EQ (Status, RETURN_SUCCESS);\r
416 ASSERT_EQ (0x75c28c50, Result);\r
417\r
418 //\r
419 // Otherwise should result in an error status\r
420 //\r
421 Multiplicand = 0x123456;\r
422 Multiplier = 0xabc;\r
423 Status = SafeIntnMult (Multiplicand, Multiplier, &Result);\r
424 ASSERT_EQ (RETURN_BUFFER_TOO_SMALL, Status);\r
425}\r