17db96d56Sopenharmony_ciimport sys 27db96d56Sopenharmony_ciimport types 37db96d56Sopenharmony_ciimport unittest 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_ci# bpo-46417: Test that structseq types used by the sys module are still 77db96d56Sopenharmony_ci# valid when Py_Finalize()/Py_Initialize() are called multiple times. 87db96d56Sopenharmony_ciclass TestStructSeq(unittest.TestCase): 97db96d56Sopenharmony_ci # test PyTypeObject members 107db96d56Sopenharmony_ci def check_structseq(self, obj_type): 117db96d56Sopenharmony_ci # ob_refcnt 127db96d56Sopenharmony_ci self.assertGreaterEqual(sys.getrefcount(obj_type), 1) 137db96d56Sopenharmony_ci # tp_base 147db96d56Sopenharmony_ci self.assertTrue(issubclass(obj_type, tuple)) 157db96d56Sopenharmony_ci # tp_bases 167db96d56Sopenharmony_ci self.assertEqual(obj_type.__bases__, (tuple,)) 177db96d56Sopenharmony_ci # tp_dict 187db96d56Sopenharmony_ci self.assertIsInstance(obj_type.__dict__, types.MappingProxyType) 197db96d56Sopenharmony_ci # tp_mro 207db96d56Sopenharmony_ci self.assertEqual(obj_type.__mro__, (obj_type, tuple, object)) 217db96d56Sopenharmony_ci # tp_name 227db96d56Sopenharmony_ci self.assertIsInstance(type.__name__, str) 237db96d56Sopenharmony_ci # tp_subclasses 247db96d56Sopenharmony_ci self.assertEqual(obj_type.__subclasses__(), []) 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_ci def test_sys_attrs(self): 277db96d56Sopenharmony_ci for attr_name in ( 287db96d56Sopenharmony_ci 'flags', # FlagsType 297db96d56Sopenharmony_ci 'float_info', # FloatInfoType 307db96d56Sopenharmony_ci 'hash_info', # Hash_InfoType 317db96d56Sopenharmony_ci 'int_info', # Int_InfoType 327db96d56Sopenharmony_ci 'thread_info', # ThreadInfoType 337db96d56Sopenharmony_ci 'version_info', # VersionInfoType 347db96d56Sopenharmony_ci ): 357db96d56Sopenharmony_ci with self.subTest(attr=attr_name): 367db96d56Sopenharmony_ci attr = getattr(sys, attr_name) 377db96d56Sopenharmony_ci self.check_structseq(type(attr)) 387db96d56Sopenharmony_ci 397db96d56Sopenharmony_ci def test_sys_funcs(self): 407db96d56Sopenharmony_ci func_names = ['get_asyncgen_hooks'] # AsyncGenHooksType 417db96d56Sopenharmony_ci if hasattr(sys, 'getwindowsversion'): 427db96d56Sopenharmony_ci func_names.append('getwindowsversion') # WindowsVersionType 437db96d56Sopenharmony_ci for func_name in func_names: 447db96d56Sopenharmony_ci with self.subTest(func=func_name): 457db96d56Sopenharmony_ci func = getattr(sys, func_name) 467db96d56Sopenharmony_ci obj = func() 477db96d56Sopenharmony_ci self.check_structseq(type(obj)) 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_ci 507db96d56Sopenharmony_citry: 517db96d56Sopenharmony_ci unittest.main() 527db96d56Sopenharmony_ciexcept SystemExit as exc: 537db96d56Sopenharmony_ci if exc.args[0] != 0: 547db96d56Sopenharmony_ci raise 557db96d56Sopenharmony_ciprint("Tests passed") 56