Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions tests/system/framework/utils/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -388,8 +388,8 @@ def __init__(
self,
name: str | None,
password: str | None,
administrators: str | None,
members: str | None,
administrators: list[str],
members: list[str],
) -> None:
self.name: str | None = name
"""
Expand All @@ -401,18 +401,18 @@ def __init__(
Group password.
"""

self.administrators: str | None = administrators
self.administrators: list[str] = administrators
"""
Group administrators.
"""

self.members: str | None = members
self.members: list[str] = members
"""
Group members.
"""

def __str__(self) -> str:
return f"({self.name}:{self.password}:{self.administrators}:" f"{self.members})"
return f"({self.name}:{self.password}:" f"{self.administrators}:" f"{self.members})"

def __repr__(self) -> str:
return str(self)
Expand All @@ -422,7 +422,7 @@ def FromDict(cls, d: dict[str, Any]) -> GShadowEntry:
return cls(
name=d.get("group_name", None),
password=d.get("password", None),
administrators=d.get("administrators", None),
administrators=d.get("administrators", []),
members=d.get("members", []),
)

Expand Down
60 changes: 60 additions & 0 deletions tests/system/tests/test_groupmod.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,63 @@ def test_groupmod__u_option_empty_string_clears_members(shadow: Shadow):
assert gshadow_entry is not None, "Group should be found"
assert gshadow_entry.name == "tgroup", "Incorrect groupname"
assert not gshadow_entry.members, "Group should have no members"


@pytest.mark.topology(KnownTopology.Shadow)
def test_groupmod__u_option_with_user_list(shadow: Shadow):
"""
:title: Test groupmod -U option with user list to set group membership
:setup:
1. Create three test users
2. Create test group
:steps:
1. Set group membership to all three users using groupmod -U
2. Verify all three users are members in group and gshadow entry
3. Modify group membership to only two users using groupmod -U
4. Verify updated membership in group and gshadow entries
:expectedresults:
1. Initial groupmod -U command sets membership correctly for all three users
2. group and gshadow entries show correct membership
3. Second groupmod -U command updates membership correctly
4. Updated group and gshadow entries reflect new membership
:customerscenario: False
"""
shadow.useradd("tuser1")
shadow.useradd("tuser2")
shadow.useradd("tuser3")
shadow.groupadd("tgroup")
shadow.groupmod("-U tuser1,tuser2,tuser3 tgroup")

group_entry = shadow.tools.getent.group("tgroup")
assert group_entry is not None, "Group should be found"
assert group_entry.name == "tgroup", "Incorrect groupname"
assert len(group_entry.members) == 3, f"Group should have 3 members, but has {len(group_entry.members)}"
assert "tuser1" in group_entry.members, "tuser1 should be a member of tgroup"
assert "tuser2" in group_entry.members, "tuser2 should be a member of tgroup"
assert "tuser3" in group_entry.members, "tuser3 should be a member of tgroup"

if shadow.host.features["gshadow"]:
gshadow_entry = shadow.tools.getent.gshadow("tgroup")
assert gshadow_entry is not None, "Group should be found"
assert gshadow_entry.name == "tgroup", "Incorrect groupname"
assert len(gshadow_entry.members) == 3, f"Group should have 3 members, but has {len(gshadow_entry.members)}"
assert "tuser1" in gshadow_entry.members, "tuser1 should be a member of tgroup"
assert "tuser2" in gshadow_entry.members, "tuser2 should be a member of tgroup"
assert "tuser3" in gshadow_entry.members, "tuser3 should be a member of tgroup"

shadow.groupmod("-U tuser1,tuser2 tgroup")

group_entry = shadow.tools.getent.group("tgroup")
assert group_entry is not None, "Group should be found"
assert group_entry.name == "tgroup", "Incorrect groupname"
assert len(group_entry.members) == 2, f"Group should have 2 members, but has {len(group_entry.members)}"
assert "tuser1" in group_entry.members, "tuser1 should be a member of tgroup"
assert "tuser2" in group_entry.members, "tuser2 should be a member of tgroup"

if shadow.host.features["gshadow"]:
gshadow_entry = shadow.tools.getent.gshadow("tgroup")
assert gshadow_entry is not None, "Group should be found"
assert gshadow_entry.name == "tgroup", "Incorrect groupname"
assert len(gshadow_entry.members) == 2, f"Group should have 2 members, but has {len(gshadow_entry.members)}"
assert "tuser1" in gshadow_entry.members, "tuser1 should be a member of tgroup"
assert "tuser2" in gshadow_entry.members, "tuser2 should be a member of tgroup"
Loading