michael@0: # This Source Code Form is subject to the terms of the Mozilla Public michael@0: # License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: # file, You can obtain one at http://mozilla.org/MPL/2.0/. michael@0: michael@0: import os, unittest, shutil michael@0: import zipfile michael@0: from StringIO import StringIO michael@0: from cuddlefish import initializer michael@0: from cuddlefish.templates import TEST_MAIN_JS, PACKAGE_JSON michael@0: michael@0: tests_path = os.path.abspath(os.path.dirname(__file__)) michael@0: michael@0: class TestInit(unittest.TestCase): michael@0: michael@0: def run_init_in_subdir(self, dirname, f, *args, **kwargs): michael@0: top = os.path.abspath(os.getcwd()) michael@0: basedir = os.path.abspath(os.path.join(".test_tmp",self.id(),dirname)) michael@0: if os.path.isdir(basedir): michael@0: assert basedir.startswith(top) michael@0: shutil.rmtree(basedir) michael@0: os.makedirs(basedir) michael@0: try: michael@0: os.chdir(basedir) michael@0: return f(basedir, *args, **kwargs) michael@0: finally: michael@0: os.chdir(top) michael@0: michael@0: def do_test_init(self,basedir): michael@0: # Let's init the addon, no error admitted michael@0: f = open(".ignoreme","w") michael@0: f.write("stuff") michael@0: f.close() michael@0: michael@0: out, err = StringIO(), StringIO() michael@0: init_run = initializer(None, ["init"], out, err) michael@0: out, err = out.getvalue(), err.getvalue() michael@0: self.assertEqual(init_run["result"], 0) michael@0: self.assertTrue("* lib directory created" in out) michael@0: self.assertTrue("* data directory created" in out) michael@0: self.assertTrue("Have fun!" in out) michael@0: self.assertEqual(err,"") michael@0: self.assertTrue(len(os.listdir(basedir))>0) michael@0: main_js = os.path.join(basedir,"lib","main.js") michael@0: package_json = os.path.join(basedir,"package.json") michael@0: test_main_js = os.path.join(basedir,"test","test-main.js") michael@0: self.assertTrue(os.path.exists(main_js)) michael@0: self.assertTrue(os.path.exists(package_json)) michael@0: self.assertTrue(os.path.exists(test_main_js)) michael@0: self.assertEqual(open(main_js,"r").read(),"") michael@0: self.assertEqual(open(package_json,"r").read() % {"id":"tmp_addon_id" }, michael@0: PACKAGE_JSON % {"name":"tmp_addon_sample", michael@0: "title": "tmp_addon_SAMPLE", michael@0: "id":init_run["jid"] }) michael@0: self.assertEqual(open(test_main_js,"r").read(),TEST_MAIN_JS) michael@0: michael@0: # Let's check that the addon is initialized michael@0: out, err = StringIO(), StringIO() michael@0: init_run = initializer(None, ["init"], out, err) michael@0: out, err = out.getvalue(), err.getvalue() michael@0: self.failIfEqual(init_run["result"],0) michael@0: self.assertTrue("This command must be run in an empty directory." in err) michael@0: michael@0: def test_initializer(self): michael@0: self.run_init_in_subdir("tmp_addon_SAMPLE",self.do_test_init) michael@0: michael@0: def do_test_args(self, basedir): michael@0: # check that running it with spurious arguments will fail michael@0: out,err = StringIO(), StringIO() michael@0: init_run = initializer(None, ["init", "specified-dirname", "extra-arg"], out, err) michael@0: out, err = out.getvalue(), err.getvalue() michael@0: self.failIfEqual(init_run["result"], 0) michael@0: self.assertTrue("Too many arguments" in err) michael@0: michael@0: def test_args(self): michael@0: self.run_init_in_subdir("tmp_addon_sample", self.do_test_args) michael@0: michael@0: def _test_existing_files(self, basedir): michael@0: f = open("pay_attention_to_me","w") michael@0: f.write("stuff") michael@0: f.close() michael@0: out,err = StringIO(), StringIO() michael@0: rc = initializer(None, ["init"], out, err) michael@0: out, err = out.getvalue(), err.getvalue() michael@0: self.assertEqual(rc["result"], 1) michael@0: self.failUnless("This command must be run in an empty directory" in err, michael@0: err) michael@0: self.failIf(os.path.exists("lib")) michael@0: michael@0: def test_existing_files(self): michael@0: self.run_init_in_subdir("existing_files", self._test_existing_files) michael@0: michael@0: def test_init_subdir(self): michael@0: parent = os.path.abspath(os.path.join(".test_tmp", self.id())) michael@0: basedir = os.path.join(parent, "init-basedir") michael@0: if os.path.exists(parent): michael@0: shutil.rmtree(parent) michael@0: os.makedirs(parent) michael@0: michael@0: # if the basedir exists and is not empty, init should refuse michael@0: os.makedirs(basedir) michael@0: f = open(os.path.join(basedir, "boo"), "w") michael@0: f.write("stuff") michael@0: f.close() michael@0: out, err = StringIO(), StringIO() michael@0: rc = initializer(None, ["init", basedir], out, err) michael@0: out, err = out.getvalue(), err.getvalue() michael@0: self.assertEqual(rc["result"], 1) michael@0: self.assertTrue("testing if directory is empty" in out, out) michael@0: self.assertTrue("This command must be run in an empty directory." in err, michael@0: err) michael@0: michael@0: # a .dotfile should be tolerated michael@0: os.rename(os.path.join(basedir, "boo"), os.path.join(basedir, ".phew")) michael@0: out, err = StringIO(), StringIO() michael@0: rc = initializer(None, ["init", basedir], out, err) michael@0: out, err = out.getvalue(), err.getvalue() michael@0: self.assertEqual(rc["result"], 0) michael@0: self.assertTrue("* data directory created" in out, out) michael@0: self.assertTrue("Have fun!" in out) michael@0: self.assertEqual(err,"") michael@0: self.assertTrue(os.listdir(basedir)) michael@0: main_js = os.path.join(basedir,"lib","main.js") michael@0: package_json = os.path.join(basedir,"package.json") michael@0: self.assertTrue(os.path.exists(main_js)) michael@0: self.assertTrue(os.path.exists(package_json)) michael@0: shutil.rmtree(basedir) michael@0: michael@0: # init should create directories that don't exist already michael@0: out, err = StringIO(), StringIO() michael@0: rc = initializer(None, ["init", basedir], out, err) michael@0: out, err = out.getvalue(), err.getvalue() michael@0: self.assertEqual(rc["result"], 0) michael@0: self.assertTrue("* data directory created" in out) michael@0: self.assertTrue("Have fun!" in out) michael@0: self.assertEqual(err,"") michael@0: self.assertTrue(os.listdir(basedir)) michael@0: main_js = os.path.join(basedir,"lib","main.js") michael@0: package_json = os.path.join(basedir,"package.json") michael@0: self.assertTrue(os.path.exists(main_js)) michael@0: self.assertTrue(os.path.exists(package_json)) michael@0: michael@0: michael@0: class TestCfxQuits(unittest.TestCase): michael@0: michael@0: def run_cfx(self, addon_path, command): michael@0: old_cwd = os.getcwd() michael@0: os.chdir(addon_path) michael@0: import sys michael@0: old_stdout = sys.stdout michael@0: old_stderr = sys.stderr michael@0: sys.stdout = out = StringIO() michael@0: sys.stderr = err = StringIO() michael@0: rc = 0 michael@0: try: michael@0: import cuddlefish michael@0: args = list(command) michael@0: # Pass arguments given to cfx so that cfx can find firefox path michael@0: # if --binary option is given: michael@0: args.extend(sys.argv[1:]) michael@0: cuddlefish.run(arguments=args) michael@0: except SystemExit, e: michael@0: if "code" in e: michael@0: rc = e.code michael@0: elif "args" in e and len(e.args)>0: michael@0: rc = e.args[0] michael@0: else: michael@0: rc = 0 michael@0: finally: michael@0: sys.stdout = old_stdout michael@0: sys.stderr = old_stderr michael@0: os.chdir(old_cwd) michael@0: out.flush() michael@0: err.flush() michael@0: return rc, out.getvalue(), err.getvalue() michael@0: michael@0: # this method doesn't exists in python 2.5, michael@0: # implements our own michael@0: def assertIn(self, member, container): michael@0: """Just like self.assertTrue(a in b), but with a nicer default message.""" michael@0: if member not in container: michael@0: standardMsg = '"%s" not found in "%s"' % (member, michael@0: container) michael@0: self.fail(standardMsg) michael@0: michael@0: def test_cfx_run(self): michael@0: addon_path = os.path.join(tests_path, michael@0: "addons", "simplest-test") michael@0: rc, out, err = self.run_cfx(addon_path, ["run"]) michael@0: self.assertEqual(rc, 0) michael@0: self.assertIn("Program terminated successfully.", err) michael@0: michael@0: def test_cfx_test(self): michael@0: addon_path = os.path.join(tests_path, michael@0: "addons", "simplest-test") michael@0: rc, out, err = self.run_cfx(addon_path, ["test"]) michael@0: self.assertEqual(rc, 0) michael@0: self.assertIn("1 of 1 tests passed.", err) michael@0: self.assertIn("Program terminated successfully.", err) michael@0: michael@0: def test_cfx_xpi(self): michael@0: addon_path = os.path.join(tests_path, michael@0: "addons", "simplest-test") michael@0: rc, out, err = self.run_cfx(addon_path, \ michael@0: ["xpi", "--manifest-overload", "manifest-overload.json"]) michael@0: self.assertEqual(rc, 0) michael@0: # Ensure that the addon version from our manifest overload is used michael@0: # in install.rdf michael@0: xpi_path = os.path.join(addon_path, "simplest-test.xpi") michael@0: xpi = zipfile.ZipFile(xpi_path, "r") michael@0: manifest = xpi.read("install.rdf") michael@0: self.assertIn("1.0-nightly", manifest) michael@0: xpi.close() michael@0: os.remove(xpi_path) michael@0: michael@0: def test_cfx_init(self): michael@0: # Create an empty test directory michael@0: addon_path = os.path.abspath(os.path.join(".test_tmp", "test-cfx-init")) michael@0: if os.path.isdir(addon_path): michael@0: shutil.rmtree(addon_path) michael@0: os.makedirs(addon_path) michael@0: michael@0: # Fake a call to cfx init michael@0: old_cwd = os.getcwd() michael@0: os.chdir(addon_path) michael@0: out, err = StringIO(), StringIO() michael@0: rc = initializer(None, ["init"], out, err) michael@0: os.chdir(old_cwd) michael@0: out, err = out.getvalue(), err.getvalue() michael@0: self.assertEqual(rc["result"], 0) michael@0: self.assertTrue("Have fun!" in out) michael@0: self.assertEqual(err,"") michael@0: michael@0: # run cfx test michael@0: rc, out, err = self.run_cfx(addon_path, ["test"]) michael@0: self.assertEqual(rc, 0) michael@0: self.assertIn("2 of 2 tests passed.", err) michael@0: self.assertIn("Program terminated successfully.", err) michael@0: michael@0: michael@0: if __name__ == "__main__": michael@0: unittest.main()