#!/usr/bin/env python

import unittest
import winbind
import string
import grp

def is_domain_group(group):
    """Return true if group is a domain group"""

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

class grent(unittest.TestCase):
    """Test get/set/endgrent"""

    def setUp(self):
        self.gr = grp.getgrall()

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

        num_domain_groups = 0

        for group in self.gr:

            if is_domain_group(group[0]):

                num_domain_groups = num_domain_groups + 1

                # Check gid

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

        # We must have at least two domain groups - Domain Admins,
        # Domain Guests and Domain Users

        self.failIf(
            num_domain_groups < 3,
            "Not enough domain groups, %d returned" % num_domain_groups)
        
    def test_getgrnam(self):
        """Test get/set/endgrent consistent with getgrnam"""

        for group in self.gr:
            if is_domain_group(group[0]):

                grnam = grp.getgrnam(group[0])

                self.failIf(grnam != group, "group %s: %s != %s" %
                            (group[0], grnam, group))

    def test_getgrgid(self):
        """Test get/set/endgrent consistent with getgrnam"""

        for group in self.gr:
            if is_domain_group(group[0]):

                grgid = grp.getgrgid(group[2])

                self.failIf(grgid != group, "gid %d: %s != %s" %
                            (group[2], grgid, group))

    def test_grmem(self):
        """Test group membership consists of only domain groups"""

        import pwd

        for group in self.gr:
            if is_domain_group(group[0]):
                for member in group[3]:
                    user = pwd.getpwnam(member)
                    self.failIf(user[2] < winbind.config["uid_low"] or
                                user[2] > winbind.config["uid_high"],
                                "group %s contains non-domain member %s" %
                                (group[0], member))
            
if __name__ == "__main__":
    unittest.main()
