addon-sdk/source/python-lib/cuddlefish/tests/test_preflight.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_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()

mercurial