17db96d56Sopenharmony_ci""" 27db96d56Sopenharmony_ciThese tests are meant to exercise that requests to create objects bigger 37db96d56Sopenharmony_cithan what the address space allows are properly met with an OverflowError 47db96d56Sopenharmony_ci(rather than crash weirdly). 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_ciPrimarily, this means 32-bit builds with at least 2 GiB of available memory. 77db96d56Sopenharmony_ciYou need to pass the -M option to regrtest (e.g. "-M 2.1G") for tests to 87db96d56Sopenharmony_cibe enabled. 97db96d56Sopenharmony_ci""" 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_cifrom test import support 127db96d56Sopenharmony_cifrom test.support import bigaddrspacetest, MAX_Py_ssize_t 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ciimport unittest 157db96d56Sopenharmony_ciimport operator 167db96d56Sopenharmony_ciimport sys 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ciclass BytesTest(unittest.TestCase): 207db96d56Sopenharmony_ci 217db96d56Sopenharmony_ci @bigaddrspacetest 227db96d56Sopenharmony_ci def test_concat(self): 237db96d56Sopenharmony_ci # Allocate a bytestring that's near the maximum size allowed by 247db96d56Sopenharmony_ci # the address space, and then try to build a new, larger one through 257db96d56Sopenharmony_ci # concatenation. 267db96d56Sopenharmony_ci try: 277db96d56Sopenharmony_ci x = b"x" * (MAX_Py_ssize_t - 128) 287db96d56Sopenharmony_ci self.assertRaises(OverflowError, operator.add, x, b"x" * 128) 297db96d56Sopenharmony_ci finally: 307db96d56Sopenharmony_ci x = None 317db96d56Sopenharmony_ci 327db96d56Sopenharmony_ci @bigaddrspacetest 337db96d56Sopenharmony_ci def test_optimized_concat(self): 347db96d56Sopenharmony_ci try: 357db96d56Sopenharmony_ci x = b"x" * (MAX_Py_ssize_t - 128) 367db96d56Sopenharmony_ci 377db96d56Sopenharmony_ci with self.assertRaises(OverflowError) as cm: 387db96d56Sopenharmony_ci # this statement used a fast path in ceval.c 397db96d56Sopenharmony_ci x = x + b"x" * 128 407db96d56Sopenharmony_ci 417db96d56Sopenharmony_ci with self.assertRaises(OverflowError) as cm: 427db96d56Sopenharmony_ci # this statement used a fast path in ceval.c 437db96d56Sopenharmony_ci x += b"x" * 128 447db96d56Sopenharmony_ci finally: 457db96d56Sopenharmony_ci x = None 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_ci @bigaddrspacetest 487db96d56Sopenharmony_ci def test_repeat(self): 497db96d56Sopenharmony_ci try: 507db96d56Sopenharmony_ci x = b"x" * (MAX_Py_ssize_t - 128) 517db96d56Sopenharmony_ci self.assertRaises(OverflowError, operator.mul, x, 128) 527db96d56Sopenharmony_ci finally: 537db96d56Sopenharmony_ci x = None 547db96d56Sopenharmony_ci 557db96d56Sopenharmony_ci 567db96d56Sopenharmony_ciclass StrTest(unittest.TestCase): 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci unicodesize = 4 597db96d56Sopenharmony_ci 607db96d56Sopenharmony_ci @bigaddrspacetest 617db96d56Sopenharmony_ci def test_concat(self): 627db96d56Sopenharmony_ci try: 637db96d56Sopenharmony_ci # Create a string that would fill almost the address space 647db96d56Sopenharmony_ci x = "x" * int(MAX_Py_ssize_t // (1.1 * self.unicodesize)) 657db96d56Sopenharmony_ci # Unicode objects trigger MemoryError in case an operation that's 667db96d56Sopenharmony_ci # going to cause a size overflow is executed 677db96d56Sopenharmony_ci self.assertRaises(MemoryError, operator.add, x, x) 687db96d56Sopenharmony_ci finally: 697db96d56Sopenharmony_ci x = None 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_ci @bigaddrspacetest 727db96d56Sopenharmony_ci def test_optimized_concat(self): 737db96d56Sopenharmony_ci try: 747db96d56Sopenharmony_ci x = "x" * int(MAX_Py_ssize_t // (1.1 * self.unicodesize)) 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci with self.assertRaises(MemoryError) as cm: 777db96d56Sopenharmony_ci # this statement uses a fast path in ceval.c 787db96d56Sopenharmony_ci x = x + x 797db96d56Sopenharmony_ci 807db96d56Sopenharmony_ci with self.assertRaises(MemoryError) as cm: 817db96d56Sopenharmony_ci # this statement uses a fast path in ceval.c 827db96d56Sopenharmony_ci x += x 837db96d56Sopenharmony_ci finally: 847db96d56Sopenharmony_ci x = None 857db96d56Sopenharmony_ci 867db96d56Sopenharmony_ci @bigaddrspacetest 877db96d56Sopenharmony_ci def test_repeat(self): 887db96d56Sopenharmony_ci try: 897db96d56Sopenharmony_ci x = "x" * int(MAX_Py_ssize_t // (1.1 * self.unicodesize)) 907db96d56Sopenharmony_ci self.assertRaises(MemoryError, operator.mul, x, 2) 917db96d56Sopenharmony_ci finally: 927db96d56Sopenharmony_ci x = None 937db96d56Sopenharmony_ci 947db96d56Sopenharmony_ci 957db96d56Sopenharmony_ciif __name__ == '__main__': 967db96d56Sopenharmony_ci if len(sys.argv) > 1: 977db96d56Sopenharmony_ci support.set_memlimit(sys.argv[1]) 987db96d56Sopenharmony_ci unittest.main() 99