blob: 7592e3335c5fd98b7be3daaba23da948787aa7f2 [file] [log] [blame]
# Copyright 2015 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Test that our interface to the user and group database works."""
import os
from chromite.lib import cros_test_lib
from chromite.lib import osutils
from chromite.lib import user_db
from chromite.utils import os_util
MOCK_PASSWD_CONTENTS = "root:x:0:0:root:/root:/bin/bash"
MOCK_GROUP_CONTENTS = "root:x:0:"
class UserDBTest(cros_test_lib.MockTempDirTestCase):
"""Tests for chromite.lib.user_db."""
def _SetupDatabases(self, passwd_contents, group_contents):
osutils.WriteFile(
os.path.join(self.tempdir, "etc", "passwd"),
passwd_contents,
makedirs=True,
)
osutils.WriteFile(
os.path.join(self.tempdir, "etc", "group"),
group_contents,
makedirs=True,
)
def setUp(self):
"""Set up a test environment."""
self._SetupDatabases(MOCK_PASSWD_CONTENTS, MOCK_GROUP_CONTENTS)
self._user_db = user_db.UserDB(self.tempdir)
self.PatchObject(os_util, "is_root_user", return_value=True)
def testAcceptsKnownUser(self):
"""Check that we do appropriate things with valid users."""
self.assertTrue(self._user_db.UserExists("root"))
self.assertEqual(0, self._user_db.ResolveUsername("root"))
def testAcceptsKnownGroup(self):
"""Check that we do appropriate things with valid groups."""
self.assertTrue(self._user_db.GroupExists("root"))
self.assertEqual(0, self._user_db.ResolveGroupname("root"))
def testRejectsUnknownUser(self):
"""Check that we do appropriate things with invalid users."""
self.assertFalse(self._user_db.UserExists("foot"))
self.assertRaises(ValueError, self._user_db.ResolveUsername, "foot")
def testRejectsUnknownGroup(self):
"""Check that we do appropriate things with invalid groups."""
self.assertFalse(self._user_db.GroupExists("wheel"))
self.assertRaises(ValueError, self._user_db.ResolveGroupname, "wheel")
def testToleratesMalformedLines(self):
"""Check that skip over invalid lines in databases."""
bad_user_contents = "\n".join(
[
"no colon on this line",
"::::::",
"root:x:not a uid:0:root:/root:/bin/bash",
"root:x:0:not a gid:root:/root:/bin/bash",
"root:x:0:0:root:/root",
"root:x:0:0:root:/root:/bin/bash:",
"bar:x:1:1:bar user:/home/bar:/bin/sh",
]
)
bad_group_contents = "\n".join(
[
"no colon on this line",
":::",
"root:x:not a gid:",
"root:x:0",
"root:x:0::",
"bar:x:1:",
]
)
self._SetupDatabases(bad_user_contents, bad_group_contents)
db = user_db.UserDB(self.tempdir)
self.assertTrue(db.UserExists("bar"))
self.assertTrue(db.GroupExists("bar"))
self.assertFalse(db.UserExists("root"))
self.assertFalse(db.GroupExists("root"))
def testCanAddUser(self):
"""Test that we can correctly add a user to a database."""
new_user = user_db.User(
user="foo",
password="!",
uid=1000,
gid=1000,
gecos="test",
home="/dev/null",
shell="/bin/false",
)
self.assertFalse(self._user_db.UserExists(new_user.user))
self._user_db.AddUser(new_user)
self.assertTrue(self._user_db.UserExists(new_user.user))
# New instances should just see the new user.
new_db = user_db.UserDB(self.tempdir)
self.assertTrue(new_db.UserExists(new_user.user))
def testCanAddGroup(self):
"""Test that we can correctly add a group to a database."""
new_group = user_db.Group(group="foo", password="!", gid=1000, users=[])
self.assertFalse(self._user_db.GroupExists(new_group.group))
self._user_db.AddGroup(new_group)
self.assertTrue(self._user_db.GroupExists(new_group.group))
# New instances should just see the new group.
new_db = user_db.UserDB(self.tempdir)
self.assertTrue(new_db.GroupExists(new_group.group))