config/tests/unit-nsinstall.py

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/config/tests/unit-nsinstall.py	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,174 @@
     1.4 +import unittest
     1.5 +
     1.6 +import os, sys, os.path, time
     1.7 +from tempfile import mkdtemp
     1.8 +from shutil import rmtree
     1.9 +import mozunit
    1.10 +from mozprocess import processhandler
    1.11 +
    1.12 +from nsinstall import nsinstall
    1.13 +import nsinstall as nsinstall_module
    1.14 +NSINSTALL_PATH = nsinstall_module.__file__
    1.15 +
    1.16 +# Run the non-ASCII tests on (a) Windows, or (b) any platform with
    1.17 +# sys.stdin.encoding set to UTF-8
    1.18 +import codecs
    1.19 +RUN_NON_ASCII_TESTS = (sys.platform == "win32" or
    1.20 +                       (sys.stdin.encoding is not None and
    1.21 +                        codecs.lookup(sys.stdin.encoding) == codecs.lookup("utf-8")))
    1.22 +
    1.23 +class TestNsinstall(unittest.TestCase):
    1.24 +    """
    1.25 +    Unit tests for nsinstall.py
    1.26 +    """
    1.27 +    def setUp(self):
    1.28 +        self.tmpdir = mkdtemp()
    1.29 +
    1.30 +    def tearDown(self):
    1.31 +        # Unicode strings means non-ASCII children can be deleted properly on
    1.32 +        # Windows
    1.33 +        if sys.stdin.encoding is None:
    1.34 +            tmpdir = unicode(self.tmpdir)
    1.35 +        else:
    1.36 +            tmpdir = unicode(self.tmpdir, sys.stdin.encoding)
    1.37 +        rmtree(tmpdir)
    1.38 +
    1.39 +    # utility methods for tests
    1.40 +    def touch(self, file, dir=None):
    1.41 +        if dir is None:
    1.42 +            dir = self.tmpdir
    1.43 +        f = os.path.join(dir, file)
    1.44 +        open(f, 'w').close()
    1.45 +        return f
    1.46 +
    1.47 +    def mkdirs(self, dir):
    1.48 +        d = os.path.join(self.tmpdir, dir)
    1.49 +        os.makedirs(d)
    1.50 +        return d
    1.51 +
    1.52 +    def test_nsinstall_D(self):
    1.53 +        "Test nsinstall -D <dir>"
    1.54 +        testdir = os.path.join(self.tmpdir, "test")
    1.55 +        self.assertEqual(nsinstall(["-D", testdir]), 0)
    1.56 +        self.assert_(os.path.isdir(testdir))
    1.57 +
    1.58 +    def test_nsinstall_basic(self):
    1.59 +        "Test nsinstall <file> <dir>"
    1.60 +        testfile = self.touch("testfile")
    1.61 +        testdir = self.mkdirs("testdir")
    1.62 +        self.assertEqual(nsinstall([testfile, testdir]), 0)
    1.63 +        self.assert_(os.path.isfile(os.path.join(testdir, "testfile")))
    1.64 +
    1.65 +    def test_nsinstall_basic_recursive(self):
    1.66 +        "Test nsinstall <dir> <dest dir>"
    1.67 +        sourcedir = self.mkdirs("sourcedir")
    1.68 +        self.touch("testfile", sourcedir)
    1.69 +        Xfile = self.touch("Xfile", sourcedir)
    1.70 +        copieddir = self.mkdirs("sourcedir/copieddir")
    1.71 +        self.touch("testfile2", copieddir)
    1.72 +        Xdir = self.mkdirs("sourcedir/Xdir")
    1.73 +        self.touch("testfile3", Xdir)
    1.74 +
    1.75 +        destdir = self.mkdirs("destdir")
    1.76 +
    1.77 +        self.assertEqual(nsinstall([sourcedir, destdir,
    1.78 +                                    '-X', Xfile,
    1.79 +                                    '-X', Xdir]), 0)
    1.80 +
    1.81 +        testdir = os.path.join(destdir, "sourcedir")
    1.82 +        self.assert_(os.path.isdir(testdir))
    1.83 +        self.assert_(os.path.isfile(os.path.join(testdir, "testfile")))
    1.84 +        self.assert_(not os.path.exists(os.path.join(testdir, "Xfile")))
    1.85 +        self.assert_(os.path.isdir(os.path.join(testdir, "copieddir")))
    1.86 +        self.assert_(os.path.isfile(os.path.join(testdir, "copieddir", "testfile2")))
    1.87 +        self.assert_(not os.path.exists(os.path.join(testdir, "Xdir")))
    1.88 +
    1.89 +    def test_nsinstall_multiple(self):
    1.90 +        "Test nsinstall <three files> <dest dir>"
    1.91 +        testfiles = [self.touch("testfile1"),
    1.92 +                     self.touch("testfile2"),
    1.93 +                     self.touch("testfile3")]
    1.94 +        testdir = self.mkdirs("testdir")
    1.95 +        self.assertEqual(nsinstall(testfiles + [testdir]), 0)
    1.96 +        for f in testfiles:
    1.97 +            self.assert_(os.path.isfile(os.path.join(testdir,
    1.98 +                                                     os.path.basename(f))))
    1.99 +
   1.100 +    def test_nsinstall_dir_exists(self):
   1.101 +        "Test nsinstall <dir> <dest dir>, where <dest dir>/<dir> already exists"
   1.102 +        srcdir = self.mkdirs("test")
   1.103 +        destdir = self.mkdirs("testdir/test")
   1.104 +        self.assertEqual(nsinstall([srcdir, os.path.dirname(destdir)]), 0)
   1.105 +        self.assert_(os.path.isdir(destdir))
   1.106 +
   1.107 +    def test_nsinstall_t(self):
   1.108 +        "Test that nsinstall -t works (preserve timestamp)"
   1.109 +        testfile = self.touch("testfile")
   1.110 +        testdir = self.mkdirs("testdir")
   1.111 +        # set mtime to now - 30 seconds
   1.112 +        t = int(time.time()) - 30
   1.113 +        os.utime(testfile, (t, t))
   1.114 +        self.assertEqual(nsinstall(["-t", testfile, testdir]), 0)
   1.115 +        destfile = os.path.join(testdir, "testfile")
   1.116 +        self.assert_(os.path.isfile(destfile))
   1.117 +        self.assertEqual(os.stat(testfile).st_mtime,
   1.118 +                         os.stat(destfile).st_mtime)
   1.119 +
   1.120 +    if sys.platform != "win32":
   1.121 +        # can't run this test on windows, don't have real file modes there
   1.122 +        def test_nsinstall_m(self):
   1.123 +            "Test that nsinstall -m works (set mode)"
   1.124 +            testfile = self.touch("testfile")
   1.125 +            mode = 0600
   1.126 +            os.chmod(testfile, mode)
   1.127 +            testdir = self.mkdirs("testdir")
   1.128 +            self.assertEqual(nsinstall(["-m", "{0:04o}"
   1.129 +                                        .format(mode), testfile, testdir]), 0)
   1.130 +            destfile = os.path.join(testdir, "testfile")
   1.131 +            self.assert_(os.path.isfile(destfile))
   1.132 +            self.assertEqual(os.stat(testfile).st_mode,
   1.133 +                             os.stat(destfile).st_mode)
   1.134 +
   1.135 +    def test_nsinstall_d(self):
   1.136 +        "Test that nsinstall -d works (create directories in target)"
   1.137 +        # -d makes no sense to me, but ok!
   1.138 +        testfile = self.touch("testfile")
   1.139 +        testdir = self.mkdirs("testdir")
   1.140 +        destdir = os.path.join(testdir, "subdir")
   1.141 +        self.assertEqual(nsinstall(["-d", testfile, destdir]), 0)
   1.142 +        self.assert_(os.path.isdir(os.path.join(destdir, "testfile")))
   1.143 +
   1.144 +    if RUN_NON_ASCII_TESTS:
   1.145 +        def test_nsinstall_non_ascii(self):
   1.146 +            "Test that nsinstall handles non-ASCII files"
   1.147 +            filename = u"\u2325\u3452\u2415\u5081"
   1.148 +            testfile = self.touch(filename)
   1.149 +            testdir = self.mkdirs(u"\u4241\u1D04\u1414")
   1.150 +            self.assertEqual(nsinstall([testfile.encode("utf-8"),
   1.151 +                                        testdir.encode("utf-8")]), 0)
   1.152 +
   1.153 +            destfile = os.path.join(testdir, filename)
   1.154 +            self.assert_(os.path.isfile(destfile))
   1.155 +
   1.156 +        def test_nsinstall_non_ascii_subprocess(self):
   1.157 +            "Test that nsinstall as a subprocess handles non-ASCII files"
   1.158 +            filename = u"\u2325\u3452\u2415\u5081"
   1.159 +            testfile = self.touch(filename)
   1.160 +            testdir = self.mkdirs(u"\u4241\u1D04\u1414")
   1.161 +            # We don't use subprocess because it can't handle Unicode on
   1.162 +            # Windows <http://bugs.python.org/issue1759845>. mozprocess calls
   1.163 +            # CreateProcessW directly so it's perfect.
   1.164 +            p = processhandler.ProcessHandlerMixin([sys.executable,
   1.165 +                                                    NSINSTALL_PATH,
   1.166 +                                                    testfile, testdir])
   1.167 +            p.run()
   1.168 +            rv = p.waitForFinish()
   1.169 +
   1.170 +            self.assertEqual(rv, 0)
   1.171 +            destfile = os.path.join(testdir, filename)
   1.172 +            self.assert_(os.path.isfile(destfile))
   1.173 +
   1.174 +    #TODO: implement -R, -l, -L and test them!
   1.175 +
   1.176 +if __name__ == '__main__':
   1.177 +  mozunit.main()

mercurial