1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/addon-sdk/source/python-lib/cuddlefish/tests/test_preflight.py Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,147 @@ 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 + 1.9 +import os, shutil 1.10 +import simplejson as json 1.11 +import unittest 1.12 +import hashlib 1.13 +import base64 1.14 +from cuddlefish import preflight 1.15 +from StringIO import StringIO 1.16 + 1.17 +class Util(unittest.TestCase): 1.18 + def get_basedir(self): 1.19 + return os.path.join(".test_tmp", self.id()) 1.20 + def make_basedir(self): 1.21 + basedir = self.get_basedir() 1.22 + if os.path.isdir(basedir): 1.23 + here = os.path.abspath(os.getcwd()) 1.24 + assert os.path.abspath(basedir).startswith(here) # safety 1.25 + shutil.rmtree(basedir) 1.26 + os.makedirs(basedir) 1.27 + return basedir 1.28 + 1.29 + def test_base62(self): 1.30 + for i in range(1000): 1.31 + h = hashlib.sha1(str(i)).digest() 1.32 + s1 = base64.b64encode(h, "AB").strip("=") 1.33 + s2 = base64.b64encode(h).strip("=").replace("+","A").replace("/","B") 1.34 + self.failUnlessEqual(s1, s2) 1.35 + 1.36 + def write(self, config): 1.37 + basedir = self.get_basedir() 1.38 + fn = os.path.join(basedir, "package.json") 1.39 + open(fn,"w").write(config) 1.40 + def read(self): 1.41 + basedir = self.get_basedir() 1.42 + fn = os.path.join(basedir, "package.json") 1.43 + return open(fn,"r").read() 1.44 + 1.45 + def get_cfg(self): 1.46 + cfg = json.loads(self.read()) 1.47 + if "name" not in cfg: 1.48 + # the cfx parser always provides a name, even if package.json 1.49 + # doesn't contain one 1.50 + cfg["name"] = "pretend name" 1.51 + return cfg 1.52 + 1.53 + def parse(self, keydata): 1.54 + fields = {} 1.55 + fieldnames = [] 1.56 + for line in keydata.split("\n"): 1.57 + if line.strip(): 1.58 + k,v = line.split(":", 1) 1.59 + k = k.strip() ; v = v.strip() 1.60 + fields[k] = v 1.61 + fieldnames.append(k) 1.62 + return fields, fieldnames 1.63 + 1.64 + def test_preflight(self): 1.65 + basedir = self.make_basedir() 1.66 + fn = os.path.join(basedir, "package.json") 1.67 + 1.68 + # empty config is not ok: need id (name is automatically supplied) 1.69 + config_orig = "{}" 1.70 + self.write(config_orig) 1.71 + out = StringIO() 1.72 + cfg = self.get_cfg() 1.73 + config_was_ok, modified = preflight.preflight_config(cfg, fn, 1.74 + stderr=out) 1.75 + self.failUnlessEqual(config_was_ok, False) 1.76 + self.failUnlessEqual(modified, True) 1.77 + backup_fn = os.path.join(basedir, "package.json.backup") 1.78 + config_backup = open(backup_fn,"r").read() 1.79 + self.failUnlessEqual(config_backup, config_orig) 1.80 + config = json.loads(self.read()) 1.81 + self.failIf("name" in config) 1.82 + self.failUnless("id" in config) 1.83 + self.failUnless(config["id"].startswith("jid1-"), config["id"]) 1.84 + self.failUnlessEqual(out.getvalue().strip(), 1.85 + "No 'id' in package.json: creating a new ID for you.") 1.86 + os.unlink(backup_fn) 1.87 + 1.88 + # just a name? we add the id 1.89 + config_orig = '{"name": "my-awesome-package"}' 1.90 + self.write(config_orig) 1.91 + out = StringIO() 1.92 + cfg = self.get_cfg() 1.93 + config_was_ok, modified = preflight.preflight_config(cfg, fn, 1.94 + stderr=out) 1.95 + self.failUnlessEqual(config_was_ok, False) 1.96 + self.failUnlessEqual(modified, True) 1.97 + backup_fn = os.path.join(basedir, "package.json.backup") 1.98 + config_backup = open(backup_fn,"r").read() 1.99 + self.failUnlessEqual(config_backup, config_orig) 1.100 + config = json.loads(self.read()) 1.101 + self.failUnlessEqual(config["name"], "my-awesome-package") 1.102 + self.failUnless("id" in config) 1.103 + self.failUnless(config["id"].startswith("jid1-"), config["id"]) 1.104 + jid = str(config["id"]) 1.105 + self.failUnlessEqual(out.getvalue().strip(), 1.106 + "No 'id' in package.json: creating a new ID for you.") 1.107 + os.unlink(backup_fn) 1.108 + 1.109 + # name and valid id? great! ship it! 1.110 + config2 = '{"name": "my-awesome-package", "id": "%s"}' % jid 1.111 + self.write(config2) 1.112 + out = StringIO() 1.113 + cfg = self.get_cfg() 1.114 + config_was_ok, modified = preflight.preflight_config(cfg, fn, 1.115 + stderr=out) 1.116 + self.failUnlessEqual(config_was_ok, True) 1.117 + self.failUnlessEqual(modified, False) 1.118 + config2a = self.read() 1.119 + self.failUnlessEqual(config2a, config2) 1.120 + self.failUnlessEqual(out.getvalue().strip(), "") 1.121 + 1.122 + # name and anonymous ID? without asking to see its papers, ship it 1.123 + config3 = '{"name": "my-old-skool-package", "id": "anonid0-deadbeef"}' 1.124 + self.write(config3) 1.125 + out = StringIO() 1.126 + cfg = self.get_cfg() 1.127 + config_was_ok, modified = preflight.preflight_config(cfg, fn, 1.128 + stderr=out) 1.129 + self.failUnlessEqual(config_was_ok, True) 1.130 + self.failUnlessEqual(modified, False) 1.131 + config3a = self.read() 1.132 + self.failUnlessEqual(config3a, config3) 1.133 + self.failUnlessEqual(out.getvalue().strip(), "") 1.134 + 1.135 + # name and old-style ID? with nostalgic trepidation, ship it 1.136 + config4 = '{"name": "my-old-skool-package", "id": "foo@bar.baz"}' 1.137 + self.write(config4) 1.138 + out = StringIO() 1.139 + cfg = self.get_cfg() 1.140 + config_was_ok, modified = preflight.preflight_config(cfg, fn, 1.141 + stderr=out) 1.142 + self.failUnlessEqual(config_was_ok, True) 1.143 + self.failUnlessEqual(modified, False) 1.144 + config4a = self.read() 1.145 + self.failUnlessEqual(config4a, config4) 1.146 + self.failUnlessEqual(out.getvalue().strip(), "") 1.147 + 1.148 + 1.149 +if __name__ == '__main__': 1.150 + unittest.main()