#!/usr/bin/env python

import unittest
import winbind
import string
import pwd

def is_domain_user(user):
    """Return true if user is a domain user"""

    return string.find(user, winbind.config["workgroup"] +
                       winbind.config["separator"]) == 0

class pwent(unittest.TestCase):
    """Test get/set/endpwent"""

    def setUp(self):
        self.pw = pwd.getpwall()

    def test(self):
        """Test get/set/endpwent output consistent"""

        num_domain_users = 0

        for user in self.pw:

            if is_domain_user(user[0]):

                num_domain_users = num_domain_users + 1

                # Check uid and gid

                self.failIf(user[2] < winbind.config["uid_low"] or \
                            user[2] > winbind.config["uid_high"],
                            "%s: uid %d outside %d,%d" %
                            (user[0], user[2], winbind.config["uid_low"],
                             winbind.config["uid_high"]))

                self.failIf(user[3] < winbind.config["gid_low"] or \
                            user[3] > winbind.config["gid_high"],
                            "%s: gid %d outside %d,%d" %
                            (user[0], user[3], winbind.config["gid_low"],
                             winbind.config["gid_high"]))

        # We must have at least two domain users - Administrator and Guest

        self.failIf(num_domain_users < 2,
                    "Not enough domain users, %d returned" % num_domain_users)

    def test_getpwnam(self):
        """Test get/set/endpwent consistent with getpwnam"""

        for user in self.pw:
            if is_domain_user(user[0]):

                pwnam = pwd.getpwnam(user[0])

                # The primary groups may be different as there is no
                # efficient way to determine the group membership when
                # using getpwent.  )-:

                if pwnam != user and not (pwnam[3] != user[3]):
                    self.fail("user %s: %s != %s" % (user[0], pwnam, user))

    def test_getpwuid(self):
        """Test get/set/endpwent consistent with getpwuid"""

        for user in self.pw:
            if is_domain_user(user[0]):

                # Check against getpwnam()

                pwuid = pwd.getpwuid(user[2])

                if pwuid != user and not (pwuid[3] != user[3]):
                    self.fail("uid %d: %s != %s" % (user[2], pwuid, user))

if __name__ == "__main__":
    unittest.main()
