|
1 | 1 | """Test script for the grp module.""" |
2 | 2 |
|
| 3 | +import random |
| 4 | +import string |
3 | 5 | import unittest |
4 | 6 | from test.support import import_helper |
5 | 7 |
|
@@ -47,64 +49,55 @@ def test_values_extended(self): |
47 | 49 | # Discovered on Ubuntu 5.04 (custom). |
48 | 50 | self.assertEqual(e2.gr_name.lower(), name.lower()) |
49 | 51 |
|
| 52 | + @unittest.expectedFailure # TODO: RUSTPYTHON; KeyError: 'getgrgid: group id 340282366920938463463374607431768211456 not found' |
50 | 53 | def test_errors(self): |
51 | 54 | self.assertRaises(TypeError, grp.getgrgid) |
52 | 55 | self.assertRaises(TypeError, grp.getgrgid, 3.14) |
| 56 | + self.assertRaises(TypeError, grp.getgrgid, 0.0) |
| 57 | + self.assertRaises(TypeError, grp.getgrgid, 0, 0) |
| 58 | + # should be out of gid_t range |
| 59 | + self.assertRaises(OverflowError, grp.getgrgid, 2**128) |
| 60 | + self.assertRaises(OverflowError, grp.getgrgid, -2**128) |
53 | 61 | self.assertRaises(TypeError, grp.getgrnam) |
54 | 62 | self.assertRaises(TypeError, grp.getgrnam, 42) |
55 | | - self.assertRaises(TypeError, grp.getgrall, 42) |
| 63 | + self.assertRaises(TypeError, grp.getgrnam, b'root') |
| 64 | + self.assertRaises(TypeError, grp.getgrnam, 'root', 0) |
56 | 65 | # embedded null character |
57 | 66 | self.assertRaisesRegex(ValueError, 'null', grp.getgrnam, 'a\x00b') |
| 67 | + self.assertRaisesRegex(ValueError, 'null', grp.getgrnam, 'root\x00') |
| 68 | + self.assertRaises(UnicodeEncodeError, grp.getgrnam, 'roo\udc74') |
| 69 | + self.assertRaises(KeyError, grp.getgrnam, '') |
| 70 | + self.assertRaises(TypeError, grp.getgrall, 42) |
58 | 71 |
|
59 | | - # try to get some errors |
60 | | - bynames = {} |
61 | | - bygids = {} |
62 | | - for (n, p, g, mem) in grp.getgrall(): |
63 | | - if not n or n == '+': |
64 | | - continue # skip NIS entries etc. |
65 | | - bynames[n] = g |
66 | | - bygids[g] = n |
67 | | - |
68 | | - allnames = list(bynames.keys()) |
69 | | - namei = 0 |
70 | | - fakename = allnames[namei] |
71 | | - while fakename in bynames: |
72 | | - chars = list(fakename) |
73 | | - for i in range(len(chars)): |
74 | | - if chars[i] == 'z': |
75 | | - chars[i] = 'A' |
76 | | - break |
77 | | - elif chars[i] == 'Z': |
78 | | - continue |
| 72 | + # Find a non-existent group name. |
| 73 | + # getgrall() will not necessarily report all existing groups |
| 74 | + # (typical for LDAP based directories in big organizations). |
| 75 | + for _ in range(30): |
| 76 | + fakename = ''.join(random.choices(string.ascii_lowercase, k=6)) |
| 77 | + try: |
| 78 | + grp.getgrnam(fakename) |
| 79 | + except KeyError: |
| 80 | + break |
| 81 | + else: |
| 82 | + self.fail('Cannot find non-existent group name') |
| 83 | + |
| 84 | + # Find a non-existent gid. |
| 85 | + maxgid = 2**31 |
| 86 | + for _ in range(30): |
| 87 | + fakegid = random.randrange(maxgid) |
| 88 | + try: |
| 89 | + grp.getgrgid(fakegid) |
| 90 | + except KeyError: |
| 91 | + break |
| 92 | + except OverflowError: |
| 93 | + if maxgid == 2**31: |
| 94 | + maxgid = 2**16-1 |
| 95 | + elif maxgid == 2**16-1: |
| 96 | + maxgid = 2**15 |
79 | 97 | else: |
80 | | - chars[i] = chr(ord(chars[i]) + 1) |
81 | | - break |
82 | | - else: |
83 | | - namei = namei + 1 |
84 | | - try: |
85 | | - fakename = allnames[namei] |
86 | | - except IndexError: |
87 | | - # should never happen... if so, just forget it |
88 | | - break |
89 | | - fakename = ''.join(chars) |
90 | | - |
91 | | - self.assertRaises(KeyError, grp.getgrnam, fakename) |
92 | | - |
93 | | - # Choose a non-existent gid. |
94 | | - fakegid = 4127 |
95 | | - while fakegid in bygids: |
96 | | - fakegid = (fakegid * 3) % 0x10000 |
97 | | - |
98 | | - self.assertRaises(KeyError, grp.getgrgid, fakegid) |
99 | | - |
100 | | - def test_noninteger_gid(self): |
101 | | - entries = grp.getgrall() |
102 | | - if not entries: |
103 | | - self.skipTest('no groups') |
104 | | - # Choose an existent gid. |
105 | | - gid = entries[0][2] |
106 | | - self.assertRaises(TypeError, grp.getgrgid, float(gid)) |
107 | | - self.assertRaises(TypeError, grp.getgrgid, str(gid)) |
| 98 | + raise |
| 99 | + else: |
| 100 | + self.fail('Cannot find non-existent gid') |
108 | 101 |
|
109 | 102 |
|
110 | 103 | if __name__ == "__main__": |
|
0 commit comments