#!/usr/bin/env python

import unittest
import winbind
import string
import pwd, grp
import os

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

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

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

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

def car(x):
    """Return the first item of a list"""
    return x[0]

class envvar(unittest.TestCase):
    """Test operation of winbind environment variables"""

    def setUp(self):

        if os.environ.has_key("WINBINDD_DOMAIN"):
            del os.environ["WINBINDD_DOMAIN"] # Start clean
        
        self.pwd = map(car, pwd.getpwall())
        self.grp = map(car, grp.getgrall())

        self.pwd.sort()
        self.grp.sort()

        got_dom_user = 0
        got_dom_group = 0

        for user in self.pwd:
            if is_domain_user(user):
                got_dom_user = 1
                break

        for group in self.grp:
            if is_domain_group(user):
                got_dom_group = 1
                break

        self.failIf(not got_dom_user, "No domain users found")
        self.failIf(not got_dom_group, "No domain groups found")

    def tearDown(self):
        if os.environ.has_key("WINBINDD_DOMAIN"):
            del os.environ["WINBINDD_DOMAIN"] # Clear environment for next test

    def test_own_workgroup(self):
        """Test WINBINDD_DOMAIN set to own domain works"""

        os.environ["WINBINDD_DOMAIN"] = winbind.config["workgroup"]

        new_pwd = map(car, pwd.getpwall())
        new_grp = map(car, grp.getgrall())

        new_pwd.sort()
        new_grp.sort()

        self.failIf(self.pwd != new_pwd,
                    "Domain users not identical")
        self.failIf(self.grp != new_grp, "Domain groups not identical")

    def test_dummy(self):
        """Test dummy workgroup doesn't produce any output"""
        
        os.environ["WINBINDD_DOMAIN"] = "asmithee"

        for user in pwd.getpwall():
            self.failIf(is_domain_user(user[0]), "Domain user %s returned" %
                        user[0])

        for group in grp.getgrall():
            self.failIf(is_domain_group(group[0]), "Domain group %s returned" %
                        group[0])

    def test_dummy2(self):
        """Test two dummy workgroups doesn't produce any output"""
        
        os.environ["WINBINDD_DOMAIN"] = "asmithee,moose"

        for user in pwd.getpwall():
            self.failIf(is_domain_user(user[0]), "Domain user %s returned" %
                        user[0])

        for group in grp.getgrall():
            self.failIf(is_domain_group(group[0]), "Domain group %s returned" %
                        group[0])

    def test_own_workgroup_with_dummy(self):
        """Test own workgroup and dummy produces full output"""

        os.environ["WINBINDD_DOMAIN"] = "%s,asmithee" % \
                                        winbind.config["workgroup"]

        new_pwd = map(car, pwd.getpwall())
        new_grp = map(car, grp.getgrall())

        new_pwd.sort()
        new_grp.sort()

        self.failIf(self.pwd != new_pwd, "Domain users not identical %s != " \
                    "%s" % (self.pwd, new_pwd))
        self.failIf(self.grp != new_grp, "Domain groups not identical")

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