from test_support import verbose
import pwd

print 'pwd.getpwall()'
entries = pwd.getpwall()

for e in entries:
    name = e[0]
    uid = e[2]
    if verbose:
        print name, uid
    print 'pwd.getpwuid()'
    dbuid = pwd.getpwuid(uid)
    if dbuid[0] != name:
        print 'Mismatch in pwd.getpwuid()'
    print 'pwd.getpwnam()'
    dbname = pwd.getpwnam(name)
    if dbname[2] != uid:
        print 'Mismatch in pwd.getpwnam()'
    else:
        print 'name matches uid'
    break

# try to get some errors
bynames = {}
byuids = {}
for n, p, u, g, gecos, d, s in entries:
    bynames[n] = u
    byuids[u] = n

allnames = bynames.keys()
namei = 0
fakename = allnames[namei]
while bynames.has_key(fakename):
    chars = map(None, fakename)
    for i in range(len(chars)):
        if chars[i] == 'z':
            chars[i] = 'A'
            break
        elif chars[i] == 'Z':
            continue
        else:
            chars[i] = chr(ord(chars[i]) + 1)
            break
    else:
        namei = namei + 1
        try:
            fakename = allnames[namei]
        except IndexError:
            # should never happen... if so, just forget it
            break
    fakename = ''.join(map(None, chars))

try:
    pwd.getpwnam(fakename)
except KeyError:
    print 'caught expected exception'
else:
    print 'fakename', fakename, 'did not except pwd.getpwnam()'

# Choose a non-existent uid.
fakeuid = 4127
while byuids.has_key(fakeuid):
    fakeuid = (fakeuid * 3) % 0x10000

try:
    pwd.getpwuid(fakeuid)
except KeyError:
    print 'caught expected exception'
else:
    print 'fakeuid', fakeuid, 'did not except pwd.getpwuid()'
