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()