tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

unit-nsinstall.py (6193B)


      1 import os
      2 import os.path
      3 import subprocess
      4 import sys
      5 import time
      6 import unittest
      7 from shutil import rmtree
      8 from tempfile import mkdtemp
      9 
     10 import mozunit
     11 import nsinstall as nsinstall_module
     12 from nsinstall import nsinstall
     13 
     14 NSINSTALL_PATH = nsinstall_module.__file__
     15 
     16 # Run the non-ASCII tests on (a) Windows, or (b) any platform with
     17 # sys.stdin.encoding set to UTF-8
     18 import codecs
     19 
     20 RUN_NON_ASCII_TESTS = sys.platform == "win32" or (
     21    sys.stdin.encoding is not None
     22    and codecs.lookup(sys.stdin.encoding) == codecs.lookup("utf-8")
     23 )
     24 
     25 
     26 class TestNsinstall(unittest.TestCase):
     27    """
     28    Unit tests for nsinstall.py
     29    """
     30 
     31    def setUp(self):
     32        self.tmpdir = mkdtemp()
     33 
     34    def tearDown(self):
     35        rmtree(self.tmpdir)
     36 
     37    # utility methods for tests
     38    def touch(self, file, dir=None):
     39        if dir is None:
     40            dir = self.tmpdir
     41        f = os.path.join(dir, file)
     42        open(f, "w").close()
     43        return f
     44 
     45    def mkdirs(self, dir):
     46        d = os.path.join(self.tmpdir, dir)
     47        os.makedirs(d)
     48        return d
     49 
     50    def test_nsinstall_D(self):
     51        "Test nsinstall -D <dir>"
     52        testdir = os.path.join(self.tmpdir, "test")
     53        self.assertEqual(nsinstall(["-D", testdir]), 0)
     54        self.assertTrue(os.path.isdir(testdir))
     55 
     56    def test_nsinstall_basic(self):
     57        "Test nsinstall <file> <dir>"
     58        testfile = self.touch("testfile")
     59        testdir = self.mkdirs("testdir")
     60        self.assertEqual(nsinstall([testfile, testdir]), 0)
     61        self.assertTrue(os.path.isfile(os.path.join(testdir, "testfile")))
     62 
     63    def test_nsinstall_basic_recursive(self):
     64        "Test nsinstall <dir> <dest dir>"
     65        sourcedir = self.mkdirs("sourcedir")
     66        self.touch("testfile", sourcedir)
     67        Xfile = self.touch("Xfile", sourcedir)
     68        copieddir = self.mkdirs("sourcedir/copieddir")
     69        self.touch("testfile2", copieddir)
     70        Xdir = self.mkdirs("sourcedir/Xdir")
     71        self.touch("testfile3", Xdir)
     72 
     73        destdir = self.mkdirs("destdir")
     74 
     75        self.assertEqual(nsinstall([sourcedir, destdir, "-X", Xfile, "-X", Xdir]), 0)
     76 
     77        testdir = os.path.join(destdir, "sourcedir")
     78        self.assertTrue(os.path.isdir(testdir))
     79        self.assertTrue(os.path.isfile(os.path.join(testdir, "testfile")))
     80        self.assertTrue(not os.path.exists(os.path.join(testdir, "Xfile")))
     81        self.assertTrue(os.path.isdir(os.path.join(testdir, "copieddir")))
     82        self.assertTrue(os.path.isfile(os.path.join(testdir, "copieddir", "testfile2")))
     83        self.assertTrue(not os.path.exists(os.path.join(testdir, "Xdir")))
     84 
     85    def test_nsinstall_multiple(self):
     86        "Test nsinstall <three files> <dest dir>"
     87        testfiles = [
     88            self.touch("testfile1"),
     89            self.touch("testfile2"),
     90            self.touch("testfile3"),
     91        ]
     92        testdir = self.mkdirs("testdir")
     93        self.assertEqual(nsinstall(testfiles + [testdir]), 0)
     94        for f in testfiles:
     95            self.assertTrue(os.path.isfile(os.path.join(testdir, os.path.basename(f))))
     96 
     97    def test_nsinstall_dir_exists(self):
     98        "Test nsinstall <dir> <dest dir>, where <dest dir>/<dir> already exists"
     99        srcdir = self.mkdirs("test")
    100        destdir = self.mkdirs("testdir/test")
    101        self.assertEqual(nsinstall([srcdir, os.path.dirname(destdir)]), 0)
    102        self.assertTrue(os.path.isdir(destdir))
    103 
    104    def test_nsinstall_t(self):
    105        "Test that nsinstall -t works (preserve timestamp)"
    106        testfile = self.touch("testfile")
    107        testdir = self.mkdirs("testdir")
    108        # set mtime to now - 30 seconds
    109        t = int(time.time()) - 30
    110        os.utime(testfile, (t, t))
    111        self.assertEqual(nsinstall(["-t", testfile, testdir]), 0)
    112        destfile = os.path.join(testdir, "testfile")
    113        self.assertTrue(os.path.isfile(destfile))
    114        self.assertEqual(os.stat(testfile).st_mtime, os.stat(destfile).st_mtime)
    115 
    116    @unittest.skipIf(sys.platform == "win32", "Windows doesn't have real file modes")
    117    def test_nsinstall_m(self):
    118        "Test that nsinstall -m works (set mode)"
    119        testfile = self.touch("testfile")
    120        mode = 0o600
    121        os.chmod(testfile, mode)
    122        testdir = self.mkdirs("testdir")
    123        self.assertEqual(nsinstall(["-m", f"{mode:04o}", testfile, testdir]), 0)
    124        destfile = os.path.join(testdir, "testfile")
    125        self.assertTrue(os.path.isfile(destfile))
    126        self.assertEqual(os.stat(testfile).st_mode, os.stat(destfile).st_mode)
    127 
    128    def test_nsinstall_d(self):
    129        "Test that nsinstall -d works (create directories in target)"
    130        # -d makes no sense to me, but ok!
    131        testfile = self.touch("testfile")
    132        testdir = self.mkdirs("testdir")
    133        destdir = os.path.join(testdir, "subdir")
    134        self.assertEqual(nsinstall(["-d", testfile, destdir]), 0)
    135        self.assertTrue(os.path.isdir(os.path.join(destdir, "testfile")))
    136 
    137    @unittest.skipIf(not RUN_NON_ASCII_TESTS, "Skipping non ascii tests")
    138    def test_nsinstall_non_ascii(self):
    139        "Test that nsinstall handles non-ASCII files"
    140        filename = "\u2325\u3452\u2415\u5081"
    141        testfile = self.touch(filename)
    142        testdir = self.mkdirs("\u4241\u1d04\u1414")
    143        self.assertEqual(
    144            nsinstall([testfile.encode("utf-8"), testdir.encode("utf-8")]), 0
    145        )
    146 
    147        destfile = os.path.join(testdir, filename)
    148        self.assertTrue(os.path.isfile(destfile))
    149 
    150    # Executing nsinstall.py with python 2 is not supported.
    151    @unittest.skipIf(
    152        not RUN_NON_ASCII_TESTS or sys.version_info[0] == 2, "Skipping non ascii tests"
    153    )
    154    def test_nsinstall_non_ascii_subprocess(self):
    155        "Test that nsinstall as a subprocess handles non-ASCII files"
    156        filename = "\u2325\u3452\u2415\u5081"
    157        testfile = self.touch(filename)
    158        testdir = self.mkdirs("\u4241\u1d04\u1414")
    159        p = subprocess.Popen([sys.executable, NSINSTALL_PATH, testfile, testdir])
    160        rv = p.wait()
    161 
    162        self.assertEqual(rv, 0)
    163        destfile = os.path.join(testdir, filename)
    164        self.assertTrue(os.path.isfile(destfile))
    165 
    166    # TODO: implement -R, -l, -L and test them!
    167 
    168 
    169 if __name__ == "__main__":
    170    mozunit.main()