diff --git a/Makefile.am b/Makefile.am index a240dc5126786e858345f0bc250991bd968b9263..bccae3d0c9af4d6dae2fbafd431d7cbbf6d93691 100644 --- a/Makefile.am +++ b/Makefile.am @@ -742,6 +742,9 @@ python_tests = \ test/docs_unittest.py \ test/pycurl_reset_unittest.py \ test/tempfile_fork_unittest.py +if HAS_FAKEROOT +python_tests += test/ganeti.utils.io_unittest-runasroot.py +endif haskell_tests = htools/test diff --git a/test/ganeti.utils.io_unittest-runasroot.py b/test/ganeti.utils.io_unittest-runasroot.py new file mode 100644 index 0000000000000000000000000000000000000000..909c08e7c5f291cbe9099b32f69b9260ebe9d5f5 --- /dev/null +++ b/test/ganeti.utils.io_unittest-runasroot.py @@ -0,0 +1,97 @@ +#!/usr/bin/python +# + +# Copyright (C) 2006, 2007, 2010, 2011 Google Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + + +"""Script for testing ganeti.utils.io (tests that require root access)""" + +import os +import tempfile +import shutil +import errno + +from ganeti import constants +from ganeti import utils +from ganeti import compat +from ganeti import errors + +import testutils + + +class TestWriteFile(testutils.GanetiTestCase): + def setUp(self): + testutils.GanetiTestCase.setUp(self) + self.tmpdir = None + self.tfile = tempfile.NamedTemporaryFile() + self.did_pre = False + self.did_post = False + self.did_write = False + + def tearDown(self): + testutils.GanetiTestCase.tearDown(self) + if self.tmpdir: + shutil.rmtree(self.tmpdir) + + def testFileUid(self): + self.tmpdir = tempfile.mkdtemp() + target = utils.PathJoin(self.tmpdir, "target") + tuid = os.geteuid() + 1 + utils.WriteFile(target, data="data", uid=tuid + 1) + self.assertFileUid(target, tuid + 1) + utils.WriteFile(target, data="data", uid=tuid) + self.assertFileUid(target, tuid) + utils.WriteFile(target, data="data", uid=tuid + 1, + keep_perms=utils.KP_IF_EXISTS) + self.assertFileUid(target, tuid) + utils.WriteFile(target, data="data", keep_perms=utils.KP_ALWAYS) + self.assertFileUid(target, tuid) + + def testNewFileUid(self): + self.tmpdir = tempfile.mkdtemp() + target = utils.PathJoin(self.tmpdir, "target") + tuid = os.geteuid() + 1 + utils.WriteFile(target, data="data", uid=tuid, + keep_perms=utils.KP_IF_EXISTS) + self.assertFileUid(target, tuid) + + def testFileGid(self): + self.tmpdir = tempfile.mkdtemp() + target = utils.PathJoin(self.tmpdir, "target") + tgid = os.getegid() + 1 + utils.WriteFile(target, data="data", gid=tgid + 1) + self.assertFileGid(target, tgid + 1) + utils.WriteFile(target, data="data", gid=tgid) + self.assertFileGid(target, tgid) + utils.WriteFile(target, data="data", gid=tgid + 1, + keep_perms=utils.KP_IF_EXISTS) + self.assertFileGid(target, tgid) + utils.WriteFile(target, data="data", keep_perms=utils.KP_ALWAYS) + self.assertFileGid(target, tgid) + + def testNewFileGid(self): + self.tmpdir = tempfile.mkdtemp() + target = utils.PathJoin(self.tmpdir, "target") + tgid = os.getegid() + 1 + utils.WriteFile(target, data="data", gid=tgid, + keep_perms=utils.KP_IF_EXISTS) + self.assertFileGid(target, tgid) + + +if __name__ == "__main__": + testutils.GanetiTestProgram() diff --git a/test/testutils.py b/test/testutils.py index 2578c3d8b83f6737ebdc83ac1cec340ab53262f4..1a47a66b0b36132c229813fa24b8830a7edbd95b 100644 --- a/test/testutils.py +++ b/test/testutils.py @@ -136,6 +136,32 @@ class GanetiTestCase(unittest.TestCase): actual_mode = stat.S_IMODE(st.st_mode) self.assertEqual(actual_mode, expected_mode) + def assertFileUid(self, file_name, expected_uid): + """Checks that the user id of a file is what we expect. + + @type file_name: str + @param file_name: the file whose contents we should check + @type expected_uid: int + @param expected_uid: the user id we expect + + """ + st = os.stat(file_name) + actual_uid = st.st_uid + self.assertEqual(actual_uid, expected_uid) + + def assertFileGid(self, file_name, expected_gid): + """Checks that the group id of a file is what we expect. + + @type file_name: str + @param file_name: the file whose contents we should check + @type expected_gid: int + @param expected_gid: the group id we expect + + """ + st = os.stat(file_name) + actual_gid = st.st_gid + self.assertEqual(actual_gid, expected_gid) + def assertEqualValues(self, first, second, msg=None): """Compares two values whether they're equal.