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