X-Git-Url: http://git.samba.org/?p=samba.git;a=blobdiff_plain;f=python%2Fsamba%2Ftests%2Fsamba_tool%2Fgroup.py;h=9862251ff01ef39d4c93ce25b4c12f366fba01d1;hp=6753691fd9c2c17e62b2d4cc9ce186d98d7dccc1;hb=d662c411e12fe9a81cdb2504af2a81d1d7b8c092;hpb=5d532543abdcb605fd1432eeaa36135bdac8a884 diff --git a/python/samba/tests/samba_tool/group.py b/python/samba/tests/samba_tool/group.py index 6753691fd9c..9862251ff01 100644 --- a/python/samba/tests/samba_tool/group.py +++ b/python/samba/tests/samba_tool/group.py @@ -24,6 +24,7 @@ from samba import ( dsdb ) + class GroupCmdTestCase(SambaToolCmdTest): """Tests for samba-tool group subcommands""" groups = [] @@ -61,7 +62,6 @@ class GroupCmdTestCase(SambaToolCmdTest): if self._find_group(group["name"]): self.runsubcmd("group", "delete", group["name"]) - def test_newgroup(self): """This tests the "group add" and "group delete" commands""" # try to add all the groups again, this should fail @@ -81,14 +81,14 @@ class GroupCmdTestCase(SambaToolCmdTest): # test adding groups for group in self.groups: - (result, out, err) = self.runsubcmd("group", "add", group["name"], - "--description=%s" % group["description"], - "-H", "ldap://%s" % os.environ["DC_SERVER"], - "-U%s%%%s" % (os.environ["DC_USERNAME"], - os.environ["DC_PASSWORD"])) + (result, out, err) = self.runsubcmd("group", "add", group["name"], + "--description=%s" % group["description"], + "-H", "ldap://%s" % os.environ["DC_SERVER"], + "-U%s%%%s" % (os.environ["DC_USERNAME"], + os.environ["DC_PASSWORD"])) self.assertCmdSuccess(result, out, err) - self.assertEquals(err,"","There shouldn't be any error message") + self.assertEquals(err, "", "There shouldn't be any error message") self.assertIn("Added group %s" % group["name"], out) found = self._find_group(group["name"]) @@ -96,7 +96,6 @@ class GroupCmdTestCase(SambaToolCmdTest): self.assertEquals("%s" % found.get("samaccountname"), "%s" % group["name"]) - def test_list(self): (result, out, err) = self.runsubcmd("group", "list", "-H", "ldap://%s" % os.environ["DC_SERVER"], @@ -114,10 +113,51 @@ class GroupCmdTestCase(SambaToolCmdTest): self.assertTrue(len(grouplist) > 0, "no groups found in samdb") for groupobj in grouplist: - name = groupobj.get("samaccountname", idx=0) + name = str(groupobj.get("samaccountname", idx=0)) found = self.assertMatch(out, name, "group '%s' not found" % name) + def test_list_verbose(self): + (result, out, err) = self.runsubcmd("group", "list", "--verbose", + "-H", "ldap://%s" % os.environ["DC_SERVER"], + "-U%s%%%s" % (os.environ["DC_USERNAME"], + os.environ["DC_PASSWORD"])) + self.assertCmdSuccess(result, out, err, "Error running list --verbose") + + # use the output to build a dictionary, where key=group-name, + # value=num-members + output_memberships = {} + + # split the output by line, skipping the first 2 header lines + group_lines = out.split('\n')[2:-1] + for line in group_lines: + # split line by column whitespace (but keep the group name together + # if it contains spaces) + values = line.split(" ") + name = values[0] + num_members = int(values[-1]) + output_memberships[name] = num_members + + # build up a similar dict using an LDAP search + search_filter = "(objectClass=group)" + grouplist = self.samdb.search(base=self.samdb.domain_dn(), + scope=ldb.SCOPE_SUBTREE, + expression=search_filter, + attrs=["samaccountname", "member"]) + self.assertTrue(len(grouplist) > 0, "no groups found in samdb") + + ldap_memberships = {} + for groupobj in grouplist: + name = str(groupobj.get("samaccountname", idx=0)) + num_members = len(groupobj.get("member", default=[])) + ldap_memberships[name] = num_members + + # check the command output matches LDAP + self.assertTrue(output_memberships == ldap_memberships, + "Command output doesn't match LDAP results.\n" + + "Command='%s'\nLDAP='%s'" %(output_memberships, + ldap_memberships)) + def test_listmembers(self): (result, out, err) = self.runsubcmd("group", "listmembers", "Domain Users", "-H", "ldap://%s" % os.environ["DC_SERVER"], @@ -135,12 +175,12 @@ class GroupCmdTestCase(SambaToolCmdTest): self.assertTrue(len(grouplist) > 0, "no groups found in samdb") for groupobj in grouplist: - name = groupobj.get("samAccountName", idx=0) + name = str(groupobj.get("samAccountName", idx=0)) found = self.assertMatch(out, name, "group '%s' not found" % name) def test_move(self): full_ou_dn = str(self.samdb.normalize_dn_in_domain("OU=movetest")) - (result, out, err) = self.runsubcmd("ou", "create", full_ou_dn) + (result, out, err) = self.runsubcmd("ou", "create", full_ou_dn) self.assertCmdSuccess(result, out, err) self.assertEquals(err, "", "There shouldn't be any error message") self.assertIn('Created ou "%s"' % full_ou_dn, out) @@ -153,7 +193,7 @@ class GroupCmdTestCase(SambaToolCmdTest): (group["name"], full_ou_dn), out) # Should fail as groups objects are in OU - (result, out, err) = self.runsubcmd("ou", "delete", full_ou_dn) + (result, out, err) = self.runsubcmd("ou", "delete", full_ou_dn) self.assertCmdFail(result) self.assertIn(("subtree_delete: Unable to delete a non-leaf node " "(it has %d children)!") % len(self.groups), err) @@ -177,7 +217,7 @@ class GroupCmdTestCase(SambaToolCmdTest): "-U%s%%%s" % (os.environ["DC_USERNAME"], os.environ["DC_PASSWORD"])) self.assertCmdSuccess(result, out, err) - self.assertEquals(err,"","Shouldn't be any error messages") + self.assertEquals(err, "", "Shouldn't be any error messages") self.assertIn("dn: CN=Domain Users,CN=Users,DC=samba,DC=example,DC=com", out) def _randomGroup(self, base={}): @@ -209,3 +249,21 @@ class GroupCmdTestCase(SambaToolCmdTest): return grouplist[0] else: return None + + def test_stats(self): + (result, out, err) = self.runsubcmd("group", "stats", + "-H", "ldap://%s" % os.environ["DC_SERVER"], + "-U%s%%%s" % (os.environ["DC_USERNAME"], + os.environ["DC_PASSWORD"])) + self.assertCmdSuccess(result, out, err, "Error running stats") + + # sanity-check the command reports 'total groups' correctly + search_filter = "(objectClass=group)" + grouplist = self.samdb.search(base=self.samdb.domain_dn(), + scope=ldb.SCOPE_SUBTREE, + expression=search_filter, + attrs=[]) + + total_groups = len(grouplist) + self.assertTrue("Total groups: {0}".format(total_groups) in out, + "Total groups not reported correctly")