import os import unittest from test import test_support spwd = test_support.import_module('spwd') @unittest.skipUnless(hasattr(os, 'geteuid') and os.geteuid() == 0, 'root privileges required') class TestSpwdRoot(unittest.TestCase): def test_getspall(self): entries = spwd.getspall() self.assertIsInstance(entries, list) for entry in entries: self.assertIsInstance(entry, spwd.struct_spwd) def test_getspnam(self): entries = spwd.getspall() if not entries: self.skipTest('empty shadow password database') random_name = entries[0].sp_nam entry = spwd.getspnam(random_name) self.assertIsInstance(entry, spwd.struct_spwd) self.assertEqual(entry.sp_nam, random_name) self.assertEqual(entry.sp_nam, entry[0]) self.assertIsInstance(entry.sp_pwd, str) self.assertEqual(entry.sp_pwd, entry[1]) self.assertIsInstance(entry.sp_lstchg, int) self.assertEqual(entry.sp_lstchg, entry[2]) self.assertIsInstance(entry.sp_min, int) self.assertEqual(entry.sp_min, entry[3]) self.assertIsInstance(entry.sp_max, int) self.assertEqual(entry.sp_max, entry[4]) self.assertIsInstance(entry.sp_warn, int) self.assertEqual(entry.sp_warn, entry[5]) self.assertIsInstance(entry.sp_inact, int) self.assertEqual(entry.sp_inact, entry[6]) self.assertIsInstance(entry.sp_expire, int) self.assertEqual(entry.sp_expire, entry[7]) self.assertIsInstance(entry.sp_flag, int) self.assertEqual(entry.sp_flag, entry[8]) with self.assertRaises(KeyError) as cx: spwd.getspnam('invalid user name') self.assertEqual(str(cx.exception), "'getspnam(): name not found'") self.assertRaises(TypeError, spwd.getspnam) self.assertRaises(TypeError, spwd.getspnam, 0) self.assertRaises(TypeError, spwd.getspnam, random_name, 0) if test_support.have_unicode: try: unicode_name = unicode(random_name) except UnicodeDecodeError: pass else: self.assertEqual(spwd.getspnam(unicode_name), entry) def test_main(): test_support.run_unittest(TestSpwdRoot) if __name__ == "__main__": test_main()