17db96d56Sopenharmony_ciimport os
27db96d56Sopenharmony_ciimport unittest
37db96d56Sopenharmony_cifrom test.support import import_helper
47db96d56Sopenharmony_ciimport warnings
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ciwith warnings.catch_warnings():
87db96d56Sopenharmony_ci    warnings.simplefilter("ignore", DeprecationWarning)
97db96d56Sopenharmony_ci    spwd = import_helper.import_module('spwd')
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci@unittest.skipUnless(hasattr(os, 'geteuid') and os.geteuid() == 0,
137db96d56Sopenharmony_ci                     'root privileges required')
147db96d56Sopenharmony_ciclass TestSpwdRoot(unittest.TestCase):
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ci    def test_getspall(self):
177db96d56Sopenharmony_ci        entries = spwd.getspall()
187db96d56Sopenharmony_ci        self.assertIsInstance(entries, list)
197db96d56Sopenharmony_ci        for entry in entries:
207db96d56Sopenharmony_ci            self.assertIsInstance(entry, spwd.struct_spwd)
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ci    def test_getspnam(self):
237db96d56Sopenharmony_ci        entries = spwd.getspall()
247db96d56Sopenharmony_ci        if not entries:
257db96d56Sopenharmony_ci            self.skipTest('empty shadow password database')
267db96d56Sopenharmony_ci        random_name = entries[0].sp_namp
277db96d56Sopenharmony_ci        entry = spwd.getspnam(random_name)
287db96d56Sopenharmony_ci        self.assertIsInstance(entry, spwd.struct_spwd)
297db96d56Sopenharmony_ci        self.assertEqual(entry.sp_namp, random_name)
307db96d56Sopenharmony_ci        self.assertEqual(entry.sp_namp, entry[0])
317db96d56Sopenharmony_ci        self.assertEqual(entry.sp_namp, entry.sp_nam)
327db96d56Sopenharmony_ci        self.assertIsInstance(entry.sp_pwdp, str)
337db96d56Sopenharmony_ci        self.assertEqual(entry.sp_pwdp, entry[1])
347db96d56Sopenharmony_ci        self.assertEqual(entry.sp_pwdp, entry.sp_pwd)
357db96d56Sopenharmony_ci        self.assertIsInstance(entry.sp_lstchg, int)
367db96d56Sopenharmony_ci        self.assertEqual(entry.sp_lstchg, entry[2])
377db96d56Sopenharmony_ci        self.assertIsInstance(entry.sp_min, int)
387db96d56Sopenharmony_ci        self.assertEqual(entry.sp_min, entry[3])
397db96d56Sopenharmony_ci        self.assertIsInstance(entry.sp_max, int)
407db96d56Sopenharmony_ci        self.assertEqual(entry.sp_max, entry[4])
417db96d56Sopenharmony_ci        self.assertIsInstance(entry.sp_warn, int)
427db96d56Sopenharmony_ci        self.assertEqual(entry.sp_warn, entry[5])
437db96d56Sopenharmony_ci        self.assertIsInstance(entry.sp_inact, int)
447db96d56Sopenharmony_ci        self.assertEqual(entry.sp_inact, entry[6])
457db96d56Sopenharmony_ci        self.assertIsInstance(entry.sp_expire, int)
467db96d56Sopenharmony_ci        self.assertEqual(entry.sp_expire, entry[7])
477db96d56Sopenharmony_ci        self.assertIsInstance(entry.sp_flag, int)
487db96d56Sopenharmony_ci        self.assertEqual(entry.sp_flag, entry[8])
497db96d56Sopenharmony_ci        with self.assertRaises(KeyError) as cx:
507db96d56Sopenharmony_ci            spwd.getspnam('invalid user name')
517db96d56Sopenharmony_ci        self.assertEqual(str(cx.exception), "'getspnam(): name not found'")
527db96d56Sopenharmony_ci        self.assertRaises(TypeError, spwd.getspnam)
537db96d56Sopenharmony_ci        self.assertRaises(TypeError, spwd.getspnam, 0)
547db96d56Sopenharmony_ci        self.assertRaises(TypeError, spwd.getspnam, random_name, 0)
557db96d56Sopenharmony_ci        try:
567db96d56Sopenharmony_ci            bytes_name = os.fsencode(random_name)
577db96d56Sopenharmony_ci        except UnicodeEncodeError:
587db96d56Sopenharmony_ci            pass
597db96d56Sopenharmony_ci        else:
607db96d56Sopenharmony_ci            self.assertRaises(TypeError, spwd.getspnam, bytes_name)
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci@unittest.skipUnless(hasattr(os, 'geteuid') and os.geteuid() != 0,
647db96d56Sopenharmony_ci                     'non-root user required')
657db96d56Sopenharmony_ciclass TestSpwdNonRoot(unittest.TestCase):
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci    def test_getspnam_exception(self):
687db96d56Sopenharmony_ci        name = 'bin'
697db96d56Sopenharmony_ci        try:
707db96d56Sopenharmony_ci            with self.assertRaises(PermissionError) as cm:
717db96d56Sopenharmony_ci                spwd.getspnam(name)
727db96d56Sopenharmony_ci        except KeyError as exc:
737db96d56Sopenharmony_ci            self.skipTest("spwd entry %r doesn't exist: %s" % (name, exc))
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ciif __name__ == "__main__":
777db96d56Sopenharmony_ci    unittest.main()
78