t_plat.py revision 402
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch#!/usr/bin/python
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch#
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch# CDDL HEADER START
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch#
4219de12b28f1936219e27501b9c4b27a4f8d53cStephan Bosch# The contents of this file are subject to the terms of the
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch# Common Development and Distribution License (the "License").
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch# You may not use this file except in compliance with the License.
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch#
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch# or http://www.opensolaris.org/os/licensing.
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch# See the License for the specific language governing permissions
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch# and limitations under the License.
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch#
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch# When distributing Covered Code, include this CDDL HEADER in each
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
5257840e8d31a6cb7051703b4cb0931c82aba638Stephan Bosch# If applicable, add the following below this CDDL HEADER, with the
5257840e8d31a6cb7051703b4cb0931c82aba638Stephan Bosch# fields enclosed by brackets "[]" replaced with your own identifying
fe2b0e3de834dd40b698bb579adc5357d5789ec9Stephan Bosch# information: Portions Copyright [yyyy] [name of copyright owner]
94d1b08c9e20d637db568a3eab3dfc2b9e96e62aStephan Bosch#
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch# CDDL HEADER END
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch#
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch# Use is subject to license terms.
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Boschimport os
7384b4e78eaab44693c985192276e31322155e32Stephan Boschimport unittest
de96afeeaa5242cffe89f1966457e935806b5746Stephan Boschimport subprocess
7384b4e78eaab44693c985192276e31322155e32Stephan Boschimport shutil
7384b4e78eaab44693c985192276e31322155e32Stephan Boschimport tempfile
7384b4e78eaab44693c985192276e31322155e32Stephan Boschimport pkg.fmri as fmri
7384b4e78eaab44693c985192276e31322155e32Stephan Boschimport pkg.client.image as image
de96afeeaa5242cffe89f1966457e935806b5746Stephan Boschimport pkg.portable.util as util
fc94140acba51adafedafbc8491a3223a51db7a8Stephan Boschimport pkg.portable as portable
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Boschclass TestPlat(unittest.TestCase):
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch def setUp(self):
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch pass
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch def testbasic(self):
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch portable.get_isainfo()
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch portable.get_release()
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch portable.get_platform()
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch def testGroup(self):
e47c2f17d8136c4d972d1074a3f84ba2ecef4fdcStephan Bosch if os.path.exists("/etc/group"):
ede750711f27ca9d9037a7ab9f016411b57f1ad9Stephan Bosch self.assertRaises(KeyError, portable.get_group_by_name,
ede750711f27ca9d9037a7ab9f016411b57f1ad9Stephan Bosch "ThisShouldNotExist", "/", True)
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch self.assertRaises(KeyError, portable.get_name_by_gid,
fc94140acba51adafedafbc8491a3223a51db7a8Stephan Bosch 87285, "/", True)
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch
ede750711f27ca9d9037a7ab9f016411b57f1ad9Stephan Bosch def testUser(self):
ede750711f27ca9d9037a7ab9f016411b57f1ad9Stephan Bosch if os.path.exists("/etc/passwd"):
ede750711f27ca9d9037a7ab9f016411b57f1ad9Stephan Bosch self.assertRaises(KeyError, portable.get_user_by_name,
ede750711f27ca9d9037a7ab9f016411b57f1ad9Stephan Bosch "ThisShouldNotExist", "/", True)
ede750711f27ca9d9037a7ab9f016411b57f1ad9Stephan Bosch
ede750711f27ca9d9037a7ab9f016411b57f1ad9Stephan Bosch self.assertRaises(KeyError, portable.get_name_by_uid,
ede750711f27ca9d9037a7ab9f016411b57f1ad9Stephan Bosch 87285, "/", True)
ede750711f27ca9d9037a7ab9f016411b57f1ad9Stephan Bosch
ede750711f27ca9d9037a7ab9f016411b57f1ad9Stephan Bosch
ede750711f27ca9d9037a7ab9f016411b57f1ad9Stephan Bosch def testAdmin(self):
fc94140acba51adafedafbc8491a3223a51db7a8Stephan Bosch if os.name == 'posix' and os.getuid() == 0:
fc94140acba51adafedafbc8491a3223a51db7a8Stephan Bosch self.assert_(portable.is_admin())
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch if os.name == 'posix' and os.getuid() != 0:
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch self.assert_(not portable.is_admin())
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch def testUtils(self):
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch self.assertNotEqual("unknown", util.get_canonical_os_type())
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch self.assertNotEqual("unknown", util.get_canonical_os_name())
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
4219de12b28f1936219e27501b9c4b27a4f8d53cStephan Bosch def testRelease(self):
47a53a80656dc400ff8effdc1432a69fbf5ae8baTimo Sirainen rel = util.get_os_release()
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch # make sure it can be used in an fmri
a991cfe2157e58ee43bc580f517ce9ef0dfb7acfStephan Bosch test_fmri = fmri.PkgFmri("testpkg", build_release = rel)
a991cfe2157e58ee43bc580f517ce9ef0dfb7acfStephan Bosch
4219de12b28f1936219e27501b9c4b27a4f8d53cStephan Bosch def testForcibleRename(self):
4219de12b28f1936219e27501b9c4b27a4f8d53cStephan Bosch # rename a file on top of another file which already exists
30f35cf5d1e1374d7fab4231e86144fc106a8e79Stephan Bosch (fd1, path1) = tempfile.mkstemp()
4219de12b28f1936219e27501b9c4b27a4f8d53cStephan Bosch os.write(fd1, "foo")
ede750711f27ca9d9037a7ab9f016411b57f1ad9Stephan Bosch (fd2, path2) = tempfile.mkstemp()
4219de12b28f1936219e27501b9c4b27a4f8d53cStephan Bosch os.write(fd2, "bar")
4219de12b28f1936219e27501b9c4b27a4f8d53cStephan Bosch os.close(fd1)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch os.close(fd2)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch portable.rename(path1, path2)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch self.failIf(os.path.exists(path1))
de96afeeaa5242cffe89f1966457e935806b5746Stephan Bosch self.failUnless(os.path.exists(path2))
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch fd2 = os.open(path2, os.O_RDONLY)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch self.assertEquals(os.read(fd2, 3), "foo")
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch os.close(fd2)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch os.unlink(path2)
6d573191bea1a64d6046be070487a5705a2d0204Stephan Bosch
6d573191bea1a64d6046be070487a5705a2d0204Stephan Bosch def testRenameOfRunningExecutable(self):
65c0e43da8cfc730eeb4634f8aa384081bbfa4e7Timo Sirainen if util.get_canonical_os_type() != 'windows':
65c0e43da8cfc730eeb4634f8aa384081bbfa4e7Timo Sirainen return
65c0e43da8cfc730eeb4634f8aa384081bbfa4e7Timo Sirainen import pkg.portable.os_windows as os_windows
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch exefilesrc = 'C:\\Windows\\system32\\more.com'
93cc87bb22386e020cee1093b6bd59295e0b33f0Stephan Bosch self.assert_(os.path.exists(exefilesrc))
31fa529029f35f65451fb1d119ed1d5435b62e46Timo Sirainen
31fa529029f35f65451fb1d119ed1d5435b62e46Timo Sirainen # create an image, copy an executable into it,
31fa529029f35f65451fb1d119ed1d5435b62e46Timo Sirainen # run the executable, replace the executable
b66def5dadd3e7c250313a938d26ad113663f86bStephan Bosch tdir1 = tempfile.mkdtemp()
b66def5dadd3e7c250313a938d26ad113663f86bStephan Bosch img1 = image.Image()
93cc87bb22386e020cee1093b6bd59295e0b33f0Stephan Bosch img1.set_attrs(image.IMG_USER, tdir1, False, "test",
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch "http://localhost:10000")
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch exefile = os.path.join(tdir1, 'less.com')
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch shutil.copyfile(exefilesrc, exefile)
6bc9fb43cc1ac24693d030a6cbfa43bc7cbc82cbTimo Sirainen proc = subprocess.Popen([exefile], stdin = subprocess.PIPE)
6bc9fb43cc1ac24693d030a6cbfa43bc7cbc82cbTimo Sirainen self.assertRaises(OSError, os.unlink, exefile)
6bc9fb43cc1ac24693d030a6cbfa43bc7cbc82cbTimo Sirainen fd1, path1 = tempfile.mkstemp(dir = tdir1)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch os.write(fd1, "foo")
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch os.close(fd1)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch portable.rename(path1, exefile)
4124bebe6daab2cd05acb0416096fc47cb9abd92Timo Sirainen fd2 = os.open(exefile, os.O_RDONLY)
4124bebe6daab2cd05acb0416096fc47cb9abd92Timo Sirainen self.assertEquals(os.read(fd2, 3), "foo")
4124bebe6daab2cd05acb0416096fc47cb9abd92Timo Sirainen os.close(fd2)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch proc.communicate()
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch
30f35cf5d1e1374d7fab4231e86144fc106a8e79Stephan Bosch # Make sure that the moved executable gets deleted
87c121a4c05b9cee46f1f757ec6999d441519abfStephan Bosch # First do a rename in another image
8aa91c0f70ea2893d82a16a8b8d0171caccce74cStephan Bosch tdir2 = tempfile.mkdtemp()
8aa91c0f70ea2893d82a16a8b8d0171caccce74cStephan Bosch img2 = image.Image()
8aa91c0f70ea2893d82a16a8b8d0171caccce74cStephan Bosch img2.set_attrs(image.IMG_USER, tdir2, False, "test",
8aa91c0f70ea2893d82a16a8b8d0171caccce74cStephan Bosch "http://localhost:10000")
b99130e4cf4af4e6b103b949456222f3a2dff424Timo Sirainen fd2, path2 = tempfile.mkstemp(dir = tdir2)
87c121a4c05b9cee46f1f757ec6999d441519abfStephan Bosch os.write(fd2, "bar")
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch os.close(fd2)
e1d8d185fa74752ba6807e415a9c82ebfdb2082cStephan Bosch portable.rename(path2, os.path.join(tdir2, "bar"))
65c0e43da8cfc730eeb4634f8aa384081bbfa4e7Timo Sirainen # Now do another rename in the original image
eb325a5a90c1d2655e74972bde0de6a699d2c864Stephan Bosch # This should cause the executable to deleted from the trash
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch portable.rename(exefile, os.path.join(tdir1, "foo"))
6bc9fb43cc1ac24693d030a6cbfa43bc7cbc82cbTimo Sirainen self.assert_(not os.path.exists(os.path.join(img1.imgdir,
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch os_windows.trashname)))
a62fe4b300e2f591e939993aec4cac1e7ae30ad1Stephan Bosch
e47c2f17d8136c4d972d1074a3f84ba2ecef4fdcStephan Bosch # cleanup
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch shutil.rmtree(img1.get_root())
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch shutil.rmtree(img2.get_root())
de96afeeaa5242cffe89f1966457e935806b5746Stephan Bosch
de96afeeaa5242cffe89f1966457e935806b5746Stephan Boschif __name__ == "__main__":
de96afeeaa5242cffe89f1966457e935806b5746Stephan Bosch unittest.main()
de96afeeaa5242cffe89f1966457e935806b5746Stephan Bosch