17db96d56Sopenharmony_ci"""Test script for the grp module."""
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ciimport unittest
47db96d56Sopenharmony_cifrom test.support import import_helper
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_cigrp = import_helper.import_module('grp')
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ciclass GroupDatabaseTestCase(unittest.TestCase):
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci    def check_value(self, value):
127db96d56Sopenharmony_ci        # check that a grp tuple has the entries and
137db96d56Sopenharmony_ci        # attributes promised by the docs
147db96d56Sopenharmony_ci        self.assertEqual(len(value), 4)
157db96d56Sopenharmony_ci        self.assertEqual(value[0], value.gr_name)
167db96d56Sopenharmony_ci        self.assertIsInstance(value.gr_name, str)
177db96d56Sopenharmony_ci        self.assertEqual(value[1], value.gr_passwd)
187db96d56Sopenharmony_ci        self.assertIsInstance(value.gr_passwd, str)
197db96d56Sopenharmony_ci        self.assertEqual(value[2], value.gr_gid)
207db96d56Sopenharmony_ci        self.assertIsInstance(value.gr_gid, int)
217db96d56Sopenharmony_ci        self.assertEqual(value[3], value.gr_mem)
227db96d56Sopenharmony_ci        self.assertIsInstance(value.gr_mem, list)
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci    def test_values(self):
257db96d56Sopenharmony_ci        entries = grp.getgrall()
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ci        for e in entries:
287db96d56Sopenharmony_ci            self.check_value(e)
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci    def test_values_extended(self):
317db96d56Sopenharmony_ci        entries = grp.getgrall()
327db96d56Sopenharmony_ci        if len(entries) > 1000:  # Huge group file (NIS?) -- skip the rest
337db96d56Sopenharmony_ci            self.skipTest('huge group file, extended test skipped')
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci        for e in entries:
367db96d56Sopenharmony_ci            e2 = grp.getgrgid(e.gr_gid)
377db96d56Sopenharmony_ci            self.check_value(e2)
387db96d56Sopenharmony_ci            self.assertEqual(e2.gr_gid, e.gr_gid)
397db96d56Sopenharmony_ci            name = e.gr_name
407db96d56Sopenharmony_ci            if name.startswith('+') or name.startswith('-'):
417db96d56Sopenharmony_ci                # NIS-related entry
427db96d56Sopenharmony_ci                continue
437db96d56Sopenharmony_ci            e2 = grp.getgrnam(name)
447db96d56Sopenharmony_ci            self.check_value(e2)
457db96d56Sopenharmony_ci            # There are instances where getgrall() returns group names in
467db96d56Sopenharmony_ci            # lowercase while getgrgid() returns proper casing.
477db96d56Sopenharmony_ci            # Discovered on Ubuntu 5.04 (custom).
487db96d56Sopenharmony_ci            self.assertEqual(e2.gr_name.lower(), name.lower())
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci    def test_errors(self):
517db96d56Sopenharmony_ci        self.assertRaises(TypeError, grp.getgrgid)
527db96d56Sopenharmony_ci        self.assertRaises(TypeError, grp.getgrgid, 3.14)
537db96d56Sopenharmony_ci        self.assertRaises(TypeError, grp.getgrnam)
547db96d56Sopenharmony_ci        self.assertRaises(TypeError, grp.getgrnam, 42)
557db96d56Sopenharmony_ci        self.assertRaises(TypeError, grp.getgrall, 42)
567db96d56Sopenharmony_ci        # embedded null character
577db96d56Sopenharmony_ci        self.assertRaisesRegex(ValueError, 'null', grp.getgrnam, 'a\x00b')
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci        # try to get some errors
607db96d56Sopenharmony_ci        bynames = {}
617db96d56Sopenharmony_ci        bygids = {}
627db96d56Sopenharmony_ci        for (n, p, g, mem) in grp.getgrall():
637db96d56Sopenharmony_ci            if not n or n == '+':
647db96d56Sopenharmony_ci                continue # skip NIS entries etc.
657db96d56Sopenharmony_ci            bynames[n] = g
667db96d56Sopenharmony_ci            bygids[g] = n
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci        allnames = list(bynames.keys())
697db96d56Sopenharmony_ci        namei = 0
707db96d56Sopenharmony_ci        fakename = allnames[namei]
717db96d56Sopenharmony_ci        while fakename in bynames:
727db96d56Sopenharmony_ci            chars = list(fakename)
737db96d56Sopenharmony_ci            for i in range(len(chars)):
747db96d56Sopenharmony_ci                if chars[i] == 'z':
757db96d56Sopenharmony_ci                    chars[i] = 'A'
767db96d56Sopenharmony_ci                    break
777db96d56Sopenharmony_ci                elif chars[i] == 'Z':
787db96d56Sopenharmony_ci                    continue
797db96d56Sopenharmony_ci                else:
807db96d56Sopenharmony_ci                    chars[i] = chr(ord(chars[i]) + 1)
817db96d56Sopenharmony_ci                    break
827db96d56Sopenharmony_ci            else:
837db96d56Sopenharmony_ci                namei = namei + 1
847db96d56Sopenharmony_ci                try:
857db96d56Sopenharmony_ci                    fakename = allnames[namei]
867db96d56Sopenharmony_ci                except IndexError:
877db96d56Sopenharmony_ci                    # should never happen... if so, just forget it
887db96d56Sopenharmony_ci                    break
897db96d56Sopenharmony_ci            fakename = ''.join(chars)
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_ci        self.assertRaises(KeyError, grp.getgrnam, fakename)
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci        # Choose a non-existent gid.
947db96d56Sopenharmony_ci        fakegid = 4127
957db96d56Sopenharmony_ci        while fakegid in bygids:
967db96d56Sopenharmony_ci            fakegid = (fakegid * 3) % 0x10000
977db96d56Sopenharmony_ci
987db96d56Sopenharmony_ci        self.assertRaises(KeyError, grp.getgrgid, fakegid)
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_ci    def test_noninteger_gid(self):
1017db96d56Sopenharmony_ci        entries = grp.getgrall()
1027db96d56Sopenharmony_ci        if not entries:
1037db96d56Sopenharmony_ci            self.skipTest('no groups')
1047db96d56Sopenharmony_ci        # Choose an existent gid.
1057db96d56Sopenharmony_ci        gid = entries[0][2]
1067db96d56Sopenharmony_ci        self.assertRaises(TypeError, grp.getgrgid, float(gid))
1077db96d56Sopenharmony_ci        self.assertRaises(TypeError, grp.getgrgid, str(gid))
1087db96d56Sopenharmony_ci
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ciif __name__ == "__main__":
1117db96d56Sopenharmony_ci    unittest.main()
112