Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
michael@0 | 1 | # This Source Code Form is subject to the terms of the Mozilla Public |
michael@0 | 2 | # License, v. 2.0. If a copy of the MPL was not distributed with this |
michael@0 | 3 | # file, You can obtain one at http://mozilla.org/MPL/2.0/. |
michael@0 | 4 | |
michael@0 | 5 | import os.path |
michael@0 | 6 | import shutil |
michael@0 | 7 | import zipfile |
michael@0 | 8 | from StringIO import StringIO |
michael@0 | 9 | import simplejson as json |
michael@0 | 10 | import unittest |
michael@0 | 11 | import cuddlefish |
michael@0 | 12 | from cuddlefish import packaging, manifest |
michael@0 | 13 | |
michael@0 | 14 | def up(path, generations=1): |
michael@0 | 15 | for i in range(generations): |
michael@0 | 16 | path = os.path.dirname(path) |
michael@0 | 17 | return path |
michael@0 | 18 | |
michael@0 | 19 | ROOT = up(os.path.abspath(__file__), 4) |
michael@0 | 20 | def get_linker_files_dir(name): |
michael@0 | 21 | return os.path.join(up(os.path.abspath(__file__)), "linker-files", name) |
michael@0 | 22 | |
michael@0 | 23 | class Basic(unittest.TestCase): |
michael@0 | 24 | def get_pkg(self, name): |
michael@0 | 25 | d = get_linker_files_dir(name) |
michael@0 | 26 | return packaging.get_config_in_dir(d) |
michael@0 | 27 | |
michael@0 | 28 | def test_deps(self): |
michael@0 | 29 | target_cfg = self.get_pkg("one") |
michael@0 | 30 | pkg_cfg = packaging.build_config(ROOT, target_cfg) |
michael@0 | 31 | deps = packaging.get_deps_for_targets(pkg_cfg, ["one"]) |
michael@0 | 32 | self.failUnlessEqual(deps, ["one"]) |
michael@0 | 33 | deps = packaging.get_deps_for_targets(pkg_cfg, |
michael@0 | 34 | [target_cfg.name, "addon-sdk"]) |
michael@0 | 35 | self.failUnlessEqual(deps, ["addon-sdk", "one"]) |
michael@0 | 36 | |
michael@0 | 37 | def test_manifest(self): |
michael@0 | 38 | target_cfg = self.get_pkg("one") |
michael@0 | 39 | pkg_cfg = packaging.build_config(ROOT, target_cfg) |
michael@0 | 40 | deps = packaging.get_deps_for_targets(pkg_cfg, |
michael@0 | 41 | [target_cfg.name, "addon-sdk"]) |
michael@0 | 42 | self.failUnlessEqual(deps, ["addon-sdk", "one"]) |
michael@0 | 43 | # target_cfg.dependencies is not provided, so we'll search through |
michael@0 | 44 | # all known packages (everything in 'deps'). |
michael@0 | 45 | m = manifest.build_manifest(target_cfg, pkg_cfg, deps, scan_tests=False) |
michael@0 | 46 | m = m.get_harness_options_manifest(False) |
michael@0 | 47 | |
michael@0 | 48 | def assertReqIs(modname, reqname, path): |
michael@0 | 49 | reqs = m["one/%s" % modname]["requirements"] |
michael@0 | 50 | self.failUnlessEqual(reqs[reqname], path) |
michael@0 | 51 | assertReqIs("main", "sdk/panel", "sdk/panel") |
michael@0 | 52 | assertReqIs("main", "two.js", "one/two") |
michael@0 | 53 | assertReqIs("main", "./two", "one/two") |
michael@0 | 54 | assertReqIs("main", "sdk/tabs.js", "sdk/tabs") |
michael@0 | 55 | assertReqIs("main", "./subdir/three", "one/subdir/three") |
michael@0 | 56 | assertReqIs("two", "main", "one/main") |
michael@0 | 57 | assertReqIs("subdir/three", "../main", "one/main") |
michael@0 | 58 | |
michael@0 | 59 | target_cfg.dependencies = [] |
michael@0 | 60 | # now, because .dependencies *is* provided, we won't search 'deps', |
michael@0 | 61 | # so we'll get a link error |
michael@0 | 62 | self.assertRaises(manifest.ModuleNotFoundError, |
michael@0 | 63 | manifest.build_manifest, |
michael@0 | 64 | target_cfg, pkg_cfg, deps, scan_tests=False) |
michael@0 | 65 | |
michael@0 | 66 | def test_main_in_deps(self): |
michael@0 | 67 | target_cfg = self.get_pkg("three") |
michael@0 | 68 | package_path = [get_linker_files_dir("three-deps")] |
michael@0 | 69 | pkg_cfg = packaging.build_config(ROOT, target_cfg, |
michael@0 | 70 | packagepath=package_path) |
michael@0 | 71 | deps = packaging.get_deps_for_targets(pkg_cfg, |
michael@0 | 72 | [target_cfg.name, "addon-sdk"]) |
michael@0 | 73 | self.failUnlessEqual(deps, ["addon-sdk", "three"]) |
michael@0 | 74 | m = manifest.build_manifest(target_cfg, pkg_cfg, deps, scan_tests=False) |
michael@0 | 75 | m = m.get_harness_options_manifest(False) |
michael@0 | 76 | def assertReqIs(modname, reqname, path): |
michael@0 | 77 | reqs = m["three/%s" % modname]["requirements"] |
michael@0 | 78 | self.failUnlessEqual(reqs[reqname], path) |
michael@0 | 79 | assertReqIs("main", "three-a", "three-a/main") |
michael@0 | 80 | assertReqIs("main", "three-b", "three-b/main") |
michael@0 | 81 | assertReqIs("main", "three-c", "three-c/main") |
michael@0 | 82 | |
michael@0 | 83 | def test_relative_main_in_top(self): |
michael@0 | 84 | target_cfg = self.get_pkg("five") |
michael@0 | 85 | package_path = [] |
michael@0 | 86 | pkg_cfg = packaging.build_config(ROOT, target_cfg, |
michael@0 | 87 | packagepath=package_path) |
michael@0 | 88 | deps = packaging.get_deps_for_targets(pkg_cfg, |
michael@0 | 89 | [target_cfg.name, "addon-sdk"]) |
michael@0 | 90 | self.failUnlessEqual(deps, ["addon-sdk", "five"]) |
michael@0 | 91 | # all we care about is that this next call doesn't raise an exception |
michael@0 | 92 | m = manifest.build_manifest(target_cfg, pkg_cfg, deps, scan_tests=False) |
michael@0 | 93 | m = m.get_harness_options_manifest(False) |
michael@0 | 94 | reqs = m["five/main"]["requirements"] |
michael@0 | 95 | self.failUnlessEqual(reqs, {}); |
michael@0 | 96 | |
michael@0 | 97 | def test_unreachable_relative_main_in_top(self): |
michael@0 | 98 | target_cfg = self.get_pkg("six") |
michael@0 | 99 | package_path = [] |
michael@0 | 100 | pkg_cfg = packaging.build_config(ROOT, target_cfg, |
michael@0 | 101 | packagepath=package_path) |
michael@0 | 102 | deps = packaging.get_deps_for_targets(pkg_cfg, |
michael@0 | 103 | [target_cfg.name, "addon-sdk"]) |
michael@0 | 104 | self.failUnlessEqual(deps, ["addon-sdk", "six"]) |
michael@0 | 105 | self.assertRaises(manifest.UnreachablePrefixError, |
michael@0 | 106 | manifest.build_manifest, |
michael@0 | 107 | target_cfg, pkg_cfg, deps, scan_tests=False) |
michael@0 | 108 | |
michael@0 | 109 | def test_unreachable_in_deps(self): |
michael@0 | 110 | target_cfg = self.get_pkg("four") |
michael@0 | 111 | package_path = [get_linker_files_dir("four-deps")] |
michael@0 | 112 | pkg_cfg = packaging.build_config(ROOT, target_cfg, |
michael@0 | 113 | packagepath=package_path) |
michael@0 | 114 | deps = packaging.get_deps_for_targets(pkg_cfg, |
michael@0 | 115 | [target_cfg.name, "addon-sdk"]) |
michael@0 | 116 | self.failUnlessEqual(deps, ["addon-sdk", "four"]) |
michael@0 | 117 | self.assertRaises(manifest.UnreachablePrefixError, |
michael@0 | 118 | manifest.build_manifest, |
michael@0 | 119 | target_cfg, pkg_cfg, deps, scan_tests=False) |
michael@0 | 120 | |
michael@0 | 121 | class Contents(unittest.TestCase): |
michael@0 | 122 | |
michael@0 | 123 | def run_in_subdir(self, dirname, f, *args, **kwargs): |
michael@0 | 124 | top = os.path.abspath(os.getcwd()) |
michael@0 | 125 | basedir = os.path.abspath(os.path.join(".test_tmp",self.id(),dirname)) |
michael@0 | 126 | if os.path.isdir(basedir): |
michael@0 | 127 | assert basedir.startswith(top) |
michael@0 | 128 | shutil.rmtree(basedir) |
michael@0 | 129 | os.makedirs(basedir) |
michael@0 | 130 | try: |
michael@0 | 131 | os.chdir(basedir) |
michael@0 | 132 | return f(basedir, *args, **kwargs) |
michael@0 | 133 | finally: |
michael@0 | 134 | os.chdir(top) |
michael@0 | 135 | |
michael@0 | 136 | def assertIn(self, what, inside_what): |
michael@0 | 137 | self.failUnless(what in inside_what, inside_what) |
michael@0 | 138 | |
michael@0 | 139 | def test_jetpackID(self): |
michael@0 | 140 | # this uses "id": "jid7", to which a @jetpack should be appended |
michael@0 | 141 | seven = get_linker_files_dir("seven") |
michael@0 | 142 | def _test(basedir): |
michael@0 | 143 | stdout = StringIO() |
michael@0 | 144 | shutil.copytree(seven, "seven") |
michael@0 | 145 | os.chdir("seven") |
michael@0 | 146 | try: |
michael@0 | 147 | # regrettably, run() always finishes with sys.exit() |
michael@0 | 148 | cuddlefish.run(["xpi", "--no-strip-xpi"], |
michael@0 | 149 | stdout=stdout) |
michael@0 | 150 | except SystemExit, e: |
michael@0 | 151 | self.failUnlessEqual(e.args[0], 0) |
michael@0 | 152 | zf = zipfile.ZipFile("seven.xpi", "r") |
michael@0 | 153 | hopts = json.loads(zf.read("harness-options.json")) |
michael@0 | 154 | self.failUnlessEqual(hopts["jetpackID"], "jid7@jetpack") |
michael@0 | 155 | self.run_in_subdir("x", _test) |
michael@0 | 156 | |
michael@0 | 157 | def test_jetpackID_suffix(self): |
michael@0 | 158 | # this uses "id": "jid1@jetpack", so no suffix should be appended |
michael@0 | 159 | one = get_linker_files_dir("one") |
michael@0 | 160 | def _test(basedir): |
michael@0 | 161 | stdout = StringIO() |
michael@0 | 162 | shutil.copytree(one, "one") |
michael@0 | 163 | os.chdir("one") |
michael@0 | 164 | try: |
michael@0 | 165 | # regrettably, run() always finishes with sys.exit() |
michael@0 | 166 | cuddlefish.run(["xpi", "--no-strip-xpi"], |
michael@0 | 167 | stdout=stdout) |
michael@0 | 168 | except SystemExit, e: |
michael@0 | 169 | self.failUnlessEqual(e.args[0], 0) |
michael@0 | 170 | zf = zipfile.ZipFile("one.xpi", "r") |
michael@0 | 171 | hopts = json.loads(zf.read("harness-options.json")) |
michael@0 | 172 | self.failUnlessEqual(hopts["jetpackID"], "jid1@jetpack") |
michael@0 | 173 | self.run_in_subdir("x", _test) |
michael@0 | 174 | |
michael@0 | 175 | def test_strip_default(self): |
michael@0 | 176 | seven = get_linker_files_dir("seven") |
michael@0 | 177 | # now run 'cfx xpi' in that directory, except put the generated .xpi |
michael@0 | 178 | # elsewhere |
michael@0 | 179 | def _test(basedir): |
michael@0 | 180 | stdout = StringIO() |
michael@0 | 181 | shutil.copytree(seven, "seven") |
michael@0 | 182 | os.chdir("seven") |
michael@0 | 183 | try: |
michael@0 | 184 | # regrettably, run() always finishes with sys.exit() |
michael@0 | 185 | cuddlefish.run(["xpi"], # --strip-xpi is now the default |
michael@0 | 186 | stdout=stdout) |
michael@0 | 187 | except SystemExit, e: |
michael@0 | 188 | self.failUnlessEqual(e.args[0], 0) |
michael@0 | 189 | zf = zipfile.ZipFile("seven.xpi", "r") |
michael@0 | 190 | names = zf.namelist() |
michael@0 | 191 | # problem found in bug 664840 was that an addon |
michael@0 | 192 | # without an explicit tests/ directory would copy all files from |
michael@0 | 193 | # the package into a bogus JID-PKGNAME-tests/ directory, so check |
michael@0 | 194 | # for that |
michael@0 | 195 | testfiles = [fn for fn in names if "seven/tests" in fn] |
michael@0 | 196 | self.failUnlessEqual([], testfiles) |
michael@0 | 197 | # another problem was that data files were being stripped from |
michael@0 | 198 | # the XPI. Note that data/ is only supposed to be included if a |
michael@0 | 199 | # module that actually gets used does a require("self") . |
michael@0 | 200 | self.assertIn("resources/seven/data/text.data", |
michael@0 | 201 | names) |
michael@0 | 202 | self.failIf("seven/lib/unused.js" |
michael@0 | 203 | in names, names) |
michael@0 | 204 | self.run_in_subdir("x", _test) |
michael@0 | 205 | |
michael@0 | 206 | def test_no_strip(self): |
michael@0 | 207 | seven = get_linker_files_dir("seven") |
michael@0 | 208 | def _test(basedir): |
michael@0 | 209 | stdout = StringIO() |
michael@0 | 210 | shutil.copytree(seven, "seven") |
michael@0 | 211 | os.chdir("seven") |
michael@0 | 212 | try: |
michael@0 | 213 | # regrettably, run() always finishes with sys.exit() |
michael@0 | 214 | cuddlefish.run(["xpi", "--no-strip-xpi"], |
michael@0 | 215 | stdout=stdout) |
michael@0 | 216 | except SystemExit, e: |
michael@0 | 217 | self.failUnlessEqual(e.args[0], 0) |
michael@0 | 218 | zf = zipfile.ZipFile("seven.xpi", "r") |
michael@0 | 219 | names = zf.namelist() |
michael@0 | 220 | self.assertIn("resources/addon-sdk/lib/sdk/loader/cuddlefish.js", names) |
michael@0 | 221 | testfiles = [fn for fn in names if "seven/tests" in fn] |
michael@0 | 222 | self.failUnlessEqual([], testfiles) |
michael@0 | 223 | self.assertIn("resources/seven/data/text.data", |
michael@0 | 224 | names) |
michael@0 | 225 | self.failUnless("resources/seven/lib/unused.js" |
michael@0 | 226 | in names, names) |
michael@0 | 227 | self.run_in_subdir("x", _test) |
michael@0 | 228 | |
michael@0 | 229 | |
michael@0 | 230 | if __name__ == '__main__': |
michael@0 | 231 | unittest.main() |