11f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchakaimport os
21f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchakaimport unittest
31f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchakafrom test import test_support
41f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka
51f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchakaspwd = test_support.import_module('spwd')
61f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka
71f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka
81f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka@unittest.skipUnless(hasattr(os, 'geteuid') and os.geteuid() == 0,
91f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka                     'root privileges required')
101f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchakaclass TestSpwdRoot(unittest.TestCase):
111f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka
121f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka    def test_getspall(self):
131f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        entries = spwd.getspall()
141f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertIsInstance(entries, list)
151f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        for entry in entries:
161f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka            self.assertIsInstance(entry, spwd.struct_spwd)
171f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka
181f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka    def test_getspnam(self):
191f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        entries = spwd.getspall()
201f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        if not entries:
211f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka            self.skipTest('empty shadow password database')
221f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        random_name = entries[0].sp_nam
231f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        entry = spwd.getspnam(random_name)
241f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertIsInstance(entry, spwd.struct_spwd)
251f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertEqual(entry.sp_nam, random_name)
261f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertEqual(entry.sp_nam, entry[0])
271f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertIsInstance(entry.sp_pwd, str)
281f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertEqual(entry.sp_pwd, entry[1])
291f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertIsInstance(entry.sp_lstchg, int)
301f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertEqual(entry.sp_lstchg, entry[2])
311f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertIsInstance(entry.sp_min, int)
321f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertEqual(entry.sp_min, entry[3])
331f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertIsInstance(entry.sp_max, int)
341f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertEqual(entry.sp_max, entry[4])
351f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertIsInstance(entry.sp_warn, int)
361f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertEqual(entry.sp_warn, entry[5])
371f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertIsInstance(entry.sp_inact, int)
381f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertEqual(entry.sp_inact, entry[6])
391f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertIsInstance(entry.sp_expire, int)
401f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertEqual(entry.sp_expire, entry[7])
411f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertIsInstance(entry.sp_flag, int)
421f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertEqual(entry.sp_flag, entry[8])
431f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        with self.assertRaises(KeyError) as cx:
441f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka            spwd.getspnam('invalid user name')
451f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertEqual(str(cx.exception), "'getspnam(): name not found'")
461f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertRaises(TypeError, spwd.getspnam)
471f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertRaises(TypeError, spwd.getspnam, 0)
481f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        self.assertRaises(TypeError, spwd.getspnam, random_name, 0)
491f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka        if test_support.have_unicode:
501f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka            try:
511f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka                unicode_name = unicode(random_name)
521f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka            except UnicodeDecodeError:
531f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka                pass
541f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka            else:
551f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka                self.assertEqual(spwd.getspnam(unicode_name), entry)
561f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka
571f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka
581f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchakadef test_main():
591f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka    test_support.run_unittest(TestSpwdRoot)
601f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka
611f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchakaif __name__ == "__main__":
621f94efc6265c77e9b45058a88eb86f8d49c2c7c7Serhiy Storchaka    test_main()
63