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

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/addon-sdk/source/python-lib/cuddlefish/tests/test_init.py	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,241 @@
     1.4 +# This Source Code Form is subject to the terms of the Mozilla Public
     1.5 +# License, v. 2.0. If a copy of the MPL was not distributed with this
     1.6 +# file, You can obtain one at http://mozilla.org/MPL/2.0/.
     1.7 +
     1.8 +import os, unittest, shutil
     1.9 +import zipfile
    1.10 +from StringIO import StringIO
    1.11 +from cuddlefish import initializer
    1.12 +from cuddlefish.templates import TEST_MAIN_JS, PACKAGE_JSON
    1.13 +
    1.14 +tests_path = os.path.abspath(os.path.dirname(__file__))
    1.15 +
    1.16 +class TestInit(unittest.TestCase):
    1.17 +
    1.18 +    def run_init_in_subdir(self, dirname, f, *args, **kwargs):
    1.19 +        top = os.path.abspath(os.getcwd())
    1.20 +        basedir = os.path.abspath(os.path.join(".test_tmp",self.id(),dirname))
    1.21 +        if os.path.isdir(basedir):
    1.22 +            assert basedir.startswith(top)
    1.23 +            shutil.rmtree(basedir)
    1.24 +        os.makedirs(basedir)
    1.25 +        try:
    1.26 +            os.chdir(basedir)
    1.27 +            return f(basedir, *args, **kwargs)
    1.28 +        finally:
    1.29 +            os.chdir(top)
    1.30 +
    1.31 +    def do_test_init(self,basedir):
    1.32 +        # Let's init the addon, no error admitted
    1.33 +        f = open(".ignoreme","w")
    1.34 +        f.write("stuff")
    1.35 +        f.close()
    1.36 +
    1.37 +        out, err = StringIO(), StringIO()
    1.38 +        init_run = initializer(None, ["init"], out, err)
    1.39 +        out, err = out.getvalue(), err.getvalue()
    1.40 +        self.assertEqual(init_run["result"], 0)
    1.41 +        self.assertTrue("* lib directory created" in out)
    1.42 +        self.assertTrue("* data directory created" in out)
    1.43 +        self.assertTrue("Have fun!" in out)
    1.44 +        self.assertEqual(err,"")
    1.45 +        self.assertTrue(len(os.listdir(basedir))>0)
    1.46 +        main_js = os.path.join(basedir,"lib","main.js")
    1.47 +        package_json = os.path.join(basedir,"package.json")
    1.48 +        test_main_js = os.path.join(basedir,"test","test-main.js")
    1.49 +        self.assertTrue(os.path.exists(main_js))
    1.50 +        self.assertTrue(os.path.exists(package_json))
    1.51 +        self.assertTrue(os.path.exists(test_main_js))
    1.52 +        self.assertEqual(open(main_js,"r").read(),"")
    1.53 +        self.assertEqual(open(package_json,"r").read() % {"id":"tmp_addon_id" },
    1.54 +                         PACKAGE_JSON % {"name":"tmp_addon_sample",
    1.55 +                                         "title": "tmp_addon_SAMPLE",
    1.56 +                                         "id":init_run["jid"] })
    1.57 +        self.assertEqual(open(test_main_js,"r").read(),TEST_MAIN_JS)
    1.58 +
    1.59 +        # Let's check that the addon is initialized
    1.60 +        out, err = StringIO(), StringIO()
    1.61 +        init_run = initializer(None, ["init"], out, err)
    1.62 +        out, err = out.getvalue(), err.getvalue()
    1.63 +        self.failIfEqual(init_run["result"],0)
    1.64 +        self.assertTrue("This command must be run in an empty directory." in err)
    1.65 +
    1.66 +    def test_initializer(self):
    1.67 +        self.run_init_in_subdir("tmp_addon_SAMPLE",self.do_test_init)
    1.68 +
    1.69 +    def do_test_args(self, basedir):
    1.70 +        # check that running it with spurious arguments will fail
    1.71 +        out,err = StringIO(), StringIO()
    1.72 +        init_run = initializer(None, ["init", "specified-dirname", "extra-arg"], out, err)
    1.73 +        out, err = out.getvalue(), err.getvalue()
    1.74 +        self.failIfEqual(init_run["result"], 0)
    1.75 +        self.assertTrue("Too many arguments" in err)
    1.76 +
    1.77 +    def test_args(self):
    1.78 +        self.run_init_in_subdir("tmp_addon_sample", self.do_test_args)
    1.79 +
    1.80 +    def _test_existing_files(self, basedir):
    1.81 +        f = open("pay_attention_to_me","w")
    1.82 +        f.write("stuff")
    1.83 +        f.close()
    1.84 +        out,err = StringIO(), StringIO()
    1.85 +        rc = initializer(None, ["init"], out, err)
    1.86 +        out, err = out.getvalue(), err.getvalue()
    1.87 +        self.assertEqual(rc["result"], 1)
    1.88 +        self.failUnless("This command must be run in an empty directory" in err,
    1.89 +                        err)
    1.90 +        self.failIf(os.path.exists("lib"))
    1.91 +
    1.92 +    def test_existing_files(self):
    1.93 +        self.run_init_in_subdir("existing_files", self._test_existing_files)
    1.94 +
    1.95 +    def test_init_subdir(self):
    1.96 +        parent = os.path.abspath(os.path.join(".test_tmp", self.id()))
    1.97 +        basedir = os.path.join(parent, "init-basedir")
    1.98 +        if os.path.exists(parent):
    1.99 +            shutil.rmtree(parent)
   1.100 +        os.makedirs(parent)
   1.101 +
   1.102 +        # if the basedir exists and is not empty, init should refuse
   1.103 +        os.makedirs(basedir)
   1.104 +        f = open(os.path.join(basedir, "boo"), "w")
   1.105 +        f.write("stuff")
   1.106 +        f.close()
   1.107 +        out, err = StringIO(), StringIO()
   1.108 +        rc = initializer(None, ["init", basedir], out, err)
   1.109 +        out, err = out.getvalue(), err.getvalue()
   1.110 +        self.assertEqual(rc["result"], 1)
   1.111 +        self.assertTrue("testing if directory is empty" in out, out)
   1.112 +        self.assertTrue("This command must be run in an empty directory." in err,
   1.113 +                        err)
   1.114 +
   1.115 +        # a .dotfile should be tolerated
   1.116 +        os.rename(os.path.join(basedir, "boo"), os.path.join(basedir, ".phew"))
   1.117 +        out, err = StringIO(), StringIO()
   1.118 +        rc = initializer(None, ["init", basedir], out, err)
   1.119 +        out, err = out.getvalue(), err.getvalue()
   1.120 +        self.assertEqual(rc["result"], 0)
   1.121 +        self.assertTrue("* data directory created" in out, out)
   1.122 +        self.assertTrue("Have fun!" in out)
   1.123 +        self.assertEqual(err,"")
   1.124 +        self.assertTrue(os.listdir(basedir))
   1.125 +        main_js = os.path.join(basedir,"lib","main.js")
   1.126 +        package_json = os.path.join(basedir,"package.json")
   1.127 +        self.assertTrue(os.path.exists(main_js))
   1.128 +        self.assertTrue(os.path.exists(package_json))
   1.129 +        shutil.rmtree(basedir)
   1.130 +
   1.131 +        # init should create directories that don't exist already
   1.132 +        out, err = StringIO(), StringIO()
   1.133 +        rc = initializer(None, ["init", basedir], out, err)
   1.134 +        out, err = out.getvalue(), err.getvalue()
   1.135 +        self.assertEqual(rc["result"], 0)
   1.136 +        self.assertTrue("* data directory created" in out)
   1.137 +        self.assertTrue("Have fun!" in out)
   1.138 +        self.assertEqual(err,"")
   1.139 +        self.assertTrue(os.listdir(basedir))
   1.140 +        main_js = os.path.join(basedir,"lib","main.js")
   1.141 +        package_json = os.path.join(basedir,"package.json")
   1.142 +        self.assertTrue(os.path.exists(main_js))
   1.143 +        self.assertTrue(os.path.exists(package_json))
   1.144 +
   1.145 +
   1.146 +class TestCfxQuits(unittest.TestCase):
   1.147 +
   1.148 +    def run_cfx(self, addon_path, command):
   1.149 +        old_cwd = os.getcwd()
   1.150 +        os.chdir(addon_path)
   1.151 +        import sys
   1.152 +        old_stdout = sys.stdout
   1.153 +        old_stderr = sys.stderr
   1.154 +        sys.stdout = out = StringIO()
   1.155 +        sys.stderr = err = StringIO()
   1.156 +        rc = 0
   1.157 +        try:
   1.158 +            import cuddlefish
   1.159 +            args = list(command)
   1.160 +            # Pass arguments given to cfx so that cfx can find firefox path
   1.161 +            # if --binary option is given:
   1.162 +            args.extend(sys.argv[1:])
   1.163 +            cuddlefish.run(arguments=args)
   1.164 +        except SystemExit, e:
   1.165 +            if "code" in e:
   1.166 +                rc = e.code
   1.167 +            elif "args" in e and len(e.args)>0:
   1.168 +                rc = e.args[0]
   1.169 +            else:
   1.170 +                rc = 0
   1.171 +        finally:
   1.172 +            sys.stdout = old_stdout
   1.173 +            sys.stderr = old_stderr
   1.174 +            os.chdir(old_cwd)
   1.175 +        out.flush()
   1.176 +        err.flush()
   1.177 +        return rc, out.getvalue(), err.getvalue()
   1.178 +
   1.179 +    # this method doesn't exists in python 2.5,
   1.180 +    # implements our own
   1.181 +    def assertIn(self, member, container):
   1.182 +        """Just like self.assertTrue(a in b), but with a nicer default message."""
   1.183 +        if member not in container:
   1.184 +            standardMsg = '"%s" not found in "%s"' % (member,
   1.185 +                                                  container)
   1.186 +            self.fail(standardMsg)
   1.187 +
   1.188 +    def test_cfx_run(self):
   1.189 +        addon_path = os.path.join(tests_path,
   1.190 +                                  "addons", "simplest-test")
   1.191 +        rc, out, err = self.run_cfx(addon_path, ["run"])
   1.192 +        self.assertEqual(rc, 0)
   1.193 +        self.assertIn("Program terminated successfully.", err)
   1.194 +
   1.195 +    def test_cfx_test(self):
   1.196 +        addon_path = os.path.join(tests_path,
   1.197 +                                  "addons", "simplest-test")
   1.198 +        rc, out, err = self.run_cfx(addon_path, ["test"])
   1.199 +        self.assertEqual(rc, 0)
   1.200 +        self.assertIn("1 of 1 tests passed.", err)
   1.201 +        self.assertIn("Program terminated successfully.", err)
   1.202 +
   1.203 +    def test_cfx_xpi(self):
   1.204 +        addon_path = os.path.join(tests_path,
   1.205 +                                  "addons", "simplest-test")
   1.206 +        rc, out, err = self.run_cfx(addon_path, \
   1.207 +          ["xpi", "--manifest-overload", "manifest-overload.json"])
   1.208 +        self.assertEqual(rc, 0)
   1.209 +        # Ensure that the addon version from our manifest overload is used
   1.210 +        # in install.rdf
   1.211 +        xpi_path = os.path.join(addon_path, "simplest-test.xpi")
   1.212 +        xpi = zipfile.ZipFile(xpi_path, "r")
   1.213 +        manifest = xpi.read("install.rdf")
   1.214 +        self.assertIn("<em:version>1.0-nightly</em:version>", manifest)
   1.215 +        xpi.close()
   1.216 +        os.remove(xpi_path)
   1.217 +
   1.218 +    def test_cfx_init(self):
   1.219 +        # Create an empty test directory
   1.220 +        addon_path = os.path.abspath(os.path.join(".test_tmp", "test-cfx-init"))
   1.221 +        if os.path.isdir(addon_path):
   1.222 +            shutil.rmtree(addon_path)
   1.223 +        os.makedirs(addon_path)
   1.224 +
   1.225 +        # Fake a call to cfx init
   1.226 +        old_cwd = os.getcwd()
   1.227 +        os.chdir(addon_path)
   1.228 +        out, err = StringIO(), StringIO()
   1.229 +        rc = initializer(None, ["init"], out, err)
   1.230 +        os.chdir(old_cwd)
   1.231 +        out, err = out.getvalue(), err.getvalue()
   1.232 +        self.assertEqual(rc["result"], 0)
   1.233 +        self.assertTrue("Have fun!" in out)
   1.234 +        self.assertEqual(err,"")
   1.235 +
   1.236 +        # run cfx test
   1.237 +        rc, out, err = self.run_cfx(addon_path, ["test"])
   1.238 +        self.assertEqual(rc, 0)
   1.239 +        self.assertIn("2 of 2 tests passed.", err)
   1.240 +        self.assertIn("Program terminated successfully.", err)
   1.241 +
   1.242 +
   1.243 +if __name__ == "__main__":
   1.244 +    unittest.main()

mercurial