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