tor-browser

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

test_convert_directory.py (9535B)


      1 #!/usr/bin/env python
      2 
      3 # This Source Code Form is subject to the terms of the Mozilla Public
      4 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
      5 # You can obtain one at http://mozilla.org/MPL/2.0/.
      6 
      7 import os
      8 import shutil
      9 import tempfile
     10 import unittest
     11 
     12 import mozunit
     13 from manifestparser import ManifestParser, convert
     14 
     15 here = os.path.dirname(os.path.abspath(__file__))
     16 
     17 # In some cases tempfile.mkdtemp() may returns a path which contains
     18 # symlinks. Some tests here will then break, as the manifestparser.convert
     19 # function returns paths that does not contains symlinks.
     20 #
     21 # Workaround is to use the following function, if absolute path of temp dir
     22 # must be compared.
     23 
     24 
     25 def create_realpath_tempdir():
     26    """
     27    Create a tempdir without symlinks.
     28    """
     29    return os.path.realpath(tempfile.mkdtemp())
     30 
     31 
     32 class TestDirectoryConversion(unittest.TestCase):
     33    """test conversion of a directory tree to a manifest structure"""
     34 
     35    def create_stub(self, directory=None):
     36        """stub out a directory with files in it"""
     37 
     38        files = ("foo", "bar", "fleem")
     39        if directory is None:
     40            directory = create_realpath_tempdir()
     41        for i in files:
     42            open(os.path.join(directory, i), "w").write(i)
     43        subdir = os.path.join(directory, "subdir")
     44        os.mkdir(subdir)
     45        open(os.path.join(subdir, "subfile"), "w").write("baz")
     46        return directory
     47 
     48    def test_directory_to_manifest(self):
     49        """
     50        Test our ability to convert a static directory structure to a
     51        manifest.
     52        """
     53 
     54        # create a stub directory
     55        stub = self.create_stub()
     56        try:
     57            stub = stub.replace(os.path.sep, "/")
     58            self.assertTrue(os.path.exists(stub) and os.path.isdir(stub))
     59 
     60            # Make a manifest for it
     61            manifest = convert([stub])
     62            out_tmpl = """[%(stub)s/bar]
     63 
     64 [%(stub)s/fleem]
     65 
     66 [%(stub)s/foo]
     67 
     68 [%(stub)s/subdir/subfile]
     69 
     70 """  # noqa
     71            self.assertEqual(str(manifest), out_tmpl % dict(stub=stub))
     72        except BaseException:
     73            raise
     74        finally:
     75            shutil.rmtree(stub)  # cleanup
     76 
     77    def test_convert_directory_manifests_in_place(self):
     78        """
     79        keep the manifests in place
     80        """
     81 
     82        stub = self.create_stub()
     83        try:
     84            ManifestParser.populate_directory_manifests([stub], filename="manifest.ini")
     85            self.assertEqual(
     86                sorted(os.listdir(stub)),
     87                ["bar", "fleem", "foo", "manifest.ini", "subdir"],
     88            )
     89            parser = ManifestParser()
     90            parser.read(os.path.join(stub, "manifest.ini"))
     91            self.assertEqual(
     92                [i["name"] for i in parser.tests], ["subfile", "bar", "fleem", "foo"]
     93            )
     94            parser = ManifestParser()
     95            parser.read(os.path.join(stub, "subdir", "manifest.ini"))
     96            self.assertEqual(len(parser.tests), 1)
     97            self.assertEqual(parser.tests[0]["name"], "subfile")
     98        except BaseException:
     99            raise
    100        finally:
    101            shutil.rmtree(stub)
    102 
    103    def test_convert_directory_manifests_in_place_toml(self):
    104        """
    105        keep the manifests in place (TOML)
    106        """
    107 
    108        stub = self.create_stub()
    109        try:
    110            ManifestParser.populate_directory_manifests([stub], filename="manifest.ini")
    111            self.assertEqual(
    112                sorted(os.listdir(stub)),
    113                ["bar", "fleem", "foo", "manifest.ini", "subdir"],
    114            )
    115            parser = ManifestParser(use_toml=True)
    116            parser.read(os.path.join(stub, "manifest.ini"))
    117            self.assertEqual(
    118                [i["name"] for i in parser.tests], ["subfile", "bar", "fleem", "foo"]
    119            )
    120            parser = ManifestParser(use_toml=True)
    121            parser.read(os.path.join(stub, "subdir", "manifest.ini"))
    122            self.assertEqual(len(parser.tests), 1)
    123            self.assertEqual(parser.tests[0]["name"], "subfile")
    124        except BaseException:
    125            raise
    126        finally:
    127            shutil.rmtree(stub)
    128 
    129    def test_manifest_ignore(self):
    130        """test manifest `ignore` parameter for ignoring directories"""
    131 
    132        stub = self.create_stub()
    133        try:
    134            ManifestParser.populate_directory_manifests(
    135                [stub], filename="manifest.ini", ignore=("subdir",)
    136            )
    137            parser = ManifestParser(use_toml=False)
    138            parser.read(os.path.join(stub, "manifest.ini"))
    139            self.assertEqual([i["name"] for i in parser.tests], ["bar", "fleem", "foo"])
    140            self.assertFalse(
    141                os.path.exists(os.path.join(stub, "subdir", "manifest.ini"))
    142            )
    143        except BaseException:
    144            raise
    145        finally:
    146            shutil.rmtree(stub)
    147 
    148    def test_manifest_ignore_toml(self):
    149        """test manifest `ignore` parameter for ignoring directories  (TOML)"""
    150 
    151        stub = self.create_stub()
    152        try:
    153            ManifestParser.populate_directory_manifests(
    154                [stub], filename="manifest.ini", ignore=("subdir",)
    155            )
    156            parser = ManifestParser(use_toml=True)
    157            parser.read(os.path.join(stub, "manifest.ini"))
    158            self.assertEqual([i["name"] for i in parser.tests], ["bar", "fleem", "foo"])
    159            self.assertFalse(
    160                os.path.exists(os.path.join(stub, "subdir", "manifest.ini"))
    161            )
    162        except BaseException:
    163            raise
    164        finally:
    165            shutil.rmtree(stub)
    166 
    167    def test_pattern(self):
    168        """test directory -> manifest with a file pattern"""
    169 
    170        stub = self.create_stub()
    171        try:
    172            parser = convert([stub], pattern="f*", relative_to=stub)
    173            self.assertEqual([i["name"] for i in parser.tests], ["fleem", "foo"])
    174 
    175            # test multiple patterns
    176            parser = convert([stub], pattern=("f*", "s*"), relative_to=stub)
    177            self.assertEqual(
    178                [i["name"] for i in parser.tests], ["fleem", "foo", "subdir/subfile"]
    179            )
    180        except BaseException:
    181            raise
    182        finally:
    183            shutil.rmtree(stub)
    184 
    185    def test_update(self):
    186        """
    187        Test our ability to update tests from a manifest and a directory of
    188        files
    189        """
    190 
    191        # boilerplate
    192        tempdir = create_realpath_tempdir()
    193        for i in range(10):
    194            open(os.path.join(tempdir, str(i)), "w").write(str(i))
    195 
    196        # otherwise empty directory with a manifest file
    197        newtempdir = create_realpath_tempdir()
    198        manifest_file = os.path.join(newtempdir, "manifest.ini")
    199        manifest_contents = str(convert([tempdir], relative_to=tempdir))
    200        with open(manifest_file, "w") as f:
    201            f.write(manifest_contents)
    202 
    203        # get the manifest
    204        manifest = ManifestParser(manifests=(manifest_file,), use_toml=False)
    205 
    206        # All of the tests are initially missing:
    207        paths = [str(i) for i in range(10)]
    208        self.assertEqual([i["name"] for i in manifest.missing()], paths)
    209 
    210        # But then we copy one over:
    211        self.assertEqual(manifest.get("name", name="1"), ["1"])
    212        manifest.update(tempdir, name="1")
    213        self.assertEqual(sorted(os.listdir(newtempdir)), ["1", "manifest.ini"])
    214 
    215        # Update that one file and copy all the "tests":
    216        open(os.path.join(tempdir, "1"), "w").write("secret door")
    217        manifest.update(tempdir)
    218        self.assertEqual(
    219            sorted(os.listdir(newtempdir)),
    220            ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "manifest.ini"],
    221        )
    222        self.assertEqual(
    223            open(os.path.join(newtempdir, "1")).read().strip(), "secret door"
    224        )
    225 
    226        # clean up:
    227        shutil.rmtree(tempdir)
    228        shutil.rmtree(newtempdir)
    229 
    230    def test_update_toml(self):
    231        """
    232        Test our ability to update tests from a manifest and a directory of
    233        files (TOML)
    234        """
    235 
    236        # boilerplate
    237        tempdir = create_realpath_tempdir()
    238        for i in range(10):
    239            open(os.path.join(tempdir, str(i)), "w").write(str(i))
    240 
    241        # otherwise empty directory with a manifest file
    242        newtempdir = create_realpath_tempdir()
    243        manifest_file = os.path.join(newtempdir, "manifest.toml")
    244        manifest_contents = str(convert([tempdir], relative_to=tempdir))
    245        with open(manifest_file, "w") as f:
    246            f.write(manifest_contents)
    247 
    248        # get the manifest
    249        manifest = ManifestParser(manifests=(manifest_file,), use_toml=True)
    250 
    251        # All of the tests are initially missing:
    252        paths = [str(i) for i in range(10)]
    253        self.assertEqual([i["name"] for i in manifest.missing()], paths)
    254 
    255        # But then we copy one over:
    256        self.assertEqual(manifest.get("name", name="1"), ["1"])
    257        manifest.update(tempdir, name="1")
    258        self.assertEqual(sorted(os.listdir(newtempdir)), ["1", "manifest.toml"])
    259 
    260        # Update that one file and copy all the "tests":
    261        open(os.path.join(tempdir, "1"), "w").write("secret door")
    262        manifest.update(tempdir)
    263        self.assertEqual(
    264            sorted(os.listdir(newtempdir)),
    265            ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "manifest.toml"],
    266        )
    267        self.assertEqual(
    268            open(os.path.join(newtempdir, "1")).read().strip(), "secret door"
    269        )
    270 
    271        # clean up:
    272        shutil.rmtree(tempdir)
    273        shutil.rmtree(newtempdir)
    274 
    275 
    276 if __name__ == "__main__":
    277    mozunit.main()