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: michael@0: import os, shutil michael@0: import simplejson as json michael@0: import unittest michael@0: import hashlib michael@0: import base64 michael@0: from cuddlefish import preflight michael@0: from StringIO import StringIO michael@0: michael@0: class Util(unittest.TestCase): michael@0: def get_basedir(self): michael@0: return os.path.join(".test_tmp", self.id()) michael@0: def make_basedir(self): michael@0: basedir = self.get_basedir() michael@0: if os.path.isdir(basedir): michael@0: here = os.path.abspath(os.getcwd()) michael@0: assert os.path.abspath(basedir).startswith(here) # safety michael@0: shutil.rmtree(basedir) michael@0: os.makedirs(basedir) michael@0: return basedir michael@0: michael@0: def test_base62(self): michael@0: for i in range(1000): michael@0: h = hashlib.sha1(str(i)).digest() michael@0: s1 = base64.b64encode(h, "AB").strip("=") michael@0: s2 = base64.b64encode(h).strip("=").replace("+","A").replace("/","B") michael@0: self.failUnlessEqual(s1, s2) michael@0: michael@0: def write(self, config): michael@0: basedir = self.get_basedir() michael@0: fn = os.path.join(basedir, "package.json") michael@0: open(fn,"w").write(config) michael@0: def read(self): michael@0: basedir = self.get_basedir() michael@0: fn = os.path.join(basedir, "package.json") michael@0: return open(fn,"r").read() michael@0: michael@0: def get_cfg(self): michael@0: cfg = json.loads(self.read()) michael@0: if "name" not in cfg: michael@0: # the cfx parser always provides a name, even if package.json michael@0: # doesn't contain one michael@0: cfg["name"] = "pretend name" michael@0: return cfg michael@0: michael@0: def parse(self, keydata): michael@0: fields = {} michael@0: fieldnames = [] michael@0: for line in keydata.split("\n"): michael@0: if line.strip(): michael@0: k,v = line.split(":", 1) michael@0: k = k.strip() ; v = v.strip() michael@0: fields[k] = v michael@0: fieldnames.append(k) michael@0: return fields, fieldnames michael@0: michael@0: def test_preflight(self): michael@0: basedir = self.make_basedir() michael@0: fn = os.path.join(basedir, "package.json") michael@0: michael@0: # empty config is not ok: need id (name is automatically supplied) michael@0: config_orig = "{}" michael@0: self.write(config_orig) michael@0: out = StringIO() michael@0: cfg = self.get_cfg() michael@0: config_was_ok, modified = preflight.preflight_config(cfg, fn, michael@0: stderr=out) michael@0: self.failUnlessEqual(config_was_ok, False) michael@0: self.failUnlessEqual(modified, True) michael@0: backup_fn = os.path.join(basedir, "package.json.backup") michael@0: config_backup = open(backup_fn,"r").read() michael@0: self.failUnlessEqual(config_backup, config_orig) michael@0: config = json.loads(self.read()) michael@0: self.failIf("name" in config) michael@0: self.failUnless("id" in config) michael@0: self.failUnless(config["id"].startswith("jid1-"), config["id"]) michael@0: self.failUnlessEqual(out.getvalue().strip(), michael@0: "No 'id' in package.json: creating a new ID for you.") michael@0: os.unlink(backup_fn) michael@0: michael@0: # just a name? we add the id michael@0: config_orig = '{"name": "my-awesome-package"}' michael@0: self.write(config_orig) michael@0: out = StringIO() michael@0: cfg = self.get_cfg() michael@0: config_was_ok, modified = preflight.preflight_config(cfg, fn, michael@0: stderr=out) michael@0: self.failUnlessEqual(config_was_ok, False) michael@0: self.failUnlessEqual(modified, True) michael@0: backup_fn = os.path.join(basedir, "package.json.backup") michael@0: config_backup = open(backup_fn,"r").read() michael@0: self.failUnlessEqual(config_backup, config_orig) michael@0: config = json.loads(self.read()) michael@0: self.failUnlessEqual(config["name"], "my-awesome-package") michael@0: self.failUnless("id" in config) michael@0: self.failUnless(config["id"].startswith("jid1-"), config["id"]) michael@0: jid = str(config["id"]) michael@0: self.failUnlessEqual(out.getvalue().strip(), michael@0: "No 'id' in package.json: creating a new ID for you.") michael@0: os.unlink(backup_fn) michael@0: michael@0: # name and valid id? great! ship it! michael@0: config2 = '{"name": "my-awesome-package", "id": "%s"}' % jid michael@0: self.write(config2) michael@0: out = StringIO() michael@0: cfg = self.get_cfg() michael@0: config_was_ok, modified = preflight.preflight_config(cfg, fn, michael@0: stderr=out) michael@0: self.failUnlessEqual(config_was_ok, True) michael@0: self.failUnlessEqual(modified, False) michael@0: config2a = self.read() michael@0: self.failUnlessEqual(config2a, config2) michael@0: self.failUnlessEqual(out.getvalue().strip(), "") michael@0: michael@0: # name and anonymous ID? without asking to see its papers, ship it michael@0: config3 = '{"name": "my-old-skool-package", "id": "anonid0-deadbeef"}' michael@0: self.write(config3) michael@0: out = StringIO() michael@0: cfg = self.get_cfg() michael@0: config_was_ok, modified = preflight.preflight_config(cfg, fn, michael@0: stderr=out) michael@0: self.failUnlessEqual(config_was_ok, True) michael@0: self.failUnlessEqual(modified, False) michael@0: config3a = self.read() michael@0: self.failUnlessEqual(config3a, config3) michael@0: self.failUnlessEqual(out.getvalue().strip(), "") michael@0: michael@0: # name and old-style ID? with nostalgic trepidation, ship it michael@0: config4 = '{"name": "my-old-skool-package", "id": "foo@bar.baz"}' michael@0: self.write(config4) michael@0: out = StringIO() michael@0: cfg = self.get_cfg() michael@0: config_was_ok, modified = preflight.preflight_config(cfg, fn, michael@0: stderr=out) michael@0: self.failUnlessEqual(config_was_ok, True) michael@0: self.failUnlessEqual(modified, False) michael@0: config4a = self.read() michael@0: self.failUnlessEqual(config4a, config4) michael@0: self.failUnlessEqual(out.getvalue().strip(), "") michael@0: michael@0: michael@0: if __name__ == '__main__': michael@0: unittest.main()