|
| 1 | +import random |
| 2 | +import string |
1 | 3 | import sys |
2 | 4 | import unittest |
3 | 5 | from test.support import import_helper |
@@ -56,61 +58,57 @@ def test_values_extended(self): |
56 | 58 | def test_errors(self): |
57 | 59 | self.assertRaises(TypeError, pwd.getpwuid) |
58 | 60 | self.assertRaises(TypeError, pwd.getpwuid, 3.14) |
| 61 | + self.assertRaises(TypeError, pwd.getpwuid, 0.0) |
| 62 | + self.assertRaises(TypeError, pwd.getpwuid, 0, 0) |
| 63 | + # should be out of uid_t range |
| 64 | + self.assertRaises(KeyError, pwd.getpwuid, 2**128) |
| 65 | + self.assertRaises(KeyError, pwd.getpwuid, -2**128) |
59 | 66 | self.assertRaises(TypeError, pwd.getpwnam) |
60 | 67 | self.assertRaises(TypeError, pwd.getpwnam, 42) |
61 | | - self.assertRaises(TypeError, pwd.getpwall, 42) |
| 68 | + self.assertRaises(TypeError, pwd.getpwnam, b'root') |
| 69 | + self.assertRaises(TypeError, pwd.getpwnam, 'root', 0) |
62 | 70 | # embedded null character |
63 | 71 | self.assertRaisesRegex(ValueError, 'null', pwd.getpwnam, 'a\x00b') |
| 72 | + self.assertRaisesRegex(ValueError, 'null', pwd.getpwnam, 'root\x00') |
| 73 | + self.assertRaises(UnicodeEncodeError, pwd.getpwnam, 'roo\udc74') |
| 74 | + self.assertRaises(KeyError, pwd.getpwnam, '') |
| 75 | + self.assertRaises(TypeError, pwd.getpwall, 42) |
64 | 76 |
|
65 | | - # try to get some errors |
66 | | - bynames = {} |
67 | | - byuids = {} |
68 | | - for (n, p, u, g, gecos, d, s) in pwd.getpwall(): |
69 | | - bynames[n] = u |
70 | | - byuids[u] = n |
71 | | - |
72 | | - allnames = list(bynames.keys()) |
73 | | - namei = 0 |
74 | | - fakename = allnames[namei] if allnames else "invaliduser" |
75 | | - while fakename in bynames: |
76 | | - chars = list(fakename) |
77 | | - for i in range(len(chars)): |
78 | | - if chars[i] == 'z': |
79 | | - chars[i] = 'A' |
80 | | - break |
81 | | - elif chars[i] == 'Z': |
82 | | - continue |
83 | | - else: |
84 | | - chars[i] = chr(ord(chars[i]) + 1) |
85 | | - break |
86 | | - else: |
87 | | - namei = namei + 1 |
88 | | - try: |
89 | | - fakename = allnames[namei] |
90 | | - except IndexError: |
91 | | - # should never happen... if so, just forget it |
92 | | - break |
93 | | - fakename = ''.join(chars) |
94 | | - |
95 | | - self.assertRaises(KeyError, pwd.getpwnam, fakename) |
96 | | - |
97 | | - # In some cases, byuids isn't a complete list of all users in the |
98 | | - # system, so if we try to pick a value not in byuids (via a perturbing |
99 | | - # loop, say), pwd.getpwuid() might still be able to find data for that |
100 | | - # uid. Using sys.maxint may provoke the same problems, but hopefully |
101 | | - # it will be a more repeatable failure. |
102 | | - fakeuid = sys.maxsize |
103 | | - self.assertNotIn(fakeuid, byuids) |
104 | | - self.assertRaises(KeyError, pwd.getpwuid, fakeuid) |
| 77 | + # Find a non-existent user name. |
| 78 | + # getpwall() will not necessarily report all existing users |
| 79 | + # (typical for LDAP based directories in big organizations). |
| 80 | + for _ in range(30): |
| 81 | + fakename = ''.join(random.choices(string.ascii_lowercase, k=6)) |
| 82 | + try: |
| 83 | + pwd.getpwnam(fakename) |
| 84 | + except KeyError: |
| 85 | + break |
| 86 | + else: |
| 87 | + self.fail('Cannot find non-existent user name') |
| 88 | + |
| 89 | + # Find a non-existent uid. |
| 90 | + maxuid = max(e.pw_uid for e in pwd.getpwall()) |
| 91 | + if maxuid < 2**15: |
| 92 | + maxuid = 2**15 |
| 93 | + elif maxuid < 2**16: |
| 94 | + maxuid = 2**16-1 |
| 95 | + else: |
| 96 | + maxuid = 2**31 |
| 97 | + for _ in range(30): |
| 98 | + fakeuid = random.randrange(maxuid) |
| 99 | + try: |
| 100 | + pwd.getpwuid(fakeuid) |
| 101 | + except KeyError: |
| 102 | + break |
| 103 | + else: |
| 104 | + self.fail('Cannot find non-existent uid') |
105 | 105 |
|
106 | 106 | # On Cygwin, getpwuid(-1) returns 'Unknown+User' user |
107 | 107 | if sys.platform != 'cygwin': |
108 | 108 | # -1 shouldn't be a valid uid because it has a special meaning in many |
109 | 109 | # uid-related functions |
110 | 110 | self.assertRaises(KeyError, pwd.getpwuid, -1) |
111 | | - # should be out of uid_t range |
112 | | - self.assertRaises(KeyError, pwd.getpwuid, 2**128) |
113 | | - self.assertRaises(KeyError, pwd.getpwuid, -2**128) |
| 111 | + |
114 | 112 |
|
115 | 113 | if __name__ == "__main__": |
116 | 114 | unittest.main() |
0 commit comments