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