addon-sdk/source/python-lib/cuddlefish/tests/test_linker.py

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rwxr-xr-x

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

mercurial