|
1 # This Source Code Form is subject to the terms of the Mozilla Public |
|
2 # License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. |
|
4 |
|
5 |
|
6 import os, shutil |
|
7 import simplejson as json |
|
8 import unittest |
|
9 import hashlib |
|
10 import base64 |
|
11 from cuddlefish import preflight |
|
12 from StringIO import StringIO |
|
13 |
|
14 class Util(unittest.TestCase): |
|
15 def get_basedir(self): |
|
16 return os.path.join(".test_tmp", self.id()) |
|
17 def make_basedir(self): |
|
18 basedir = self.get_basedir() |
|
19 if os.path.isdir(basedir): |
|
20 here = os.path.abspath(os.getcwd()) |
|
21 assert os.path.abspath(basedir).startswith(here) # safety |
|
22 shutil.rmtree(basedir) |
|
23 os.makedirs(basedir) |
|
24 return basedir |
|
25 |
|
26 def test_base62(self): |
|
27 for i in range(1000): |
|
28 h = hashlib.sha1(str(i)).digest() |
|
29 s1 = base64.b64encode(h, "AB").strip("=") |
|
30 s2 = base64.b64encode(h).strip("=").replace("+","A").replace("/","B") |
|
31 self.failUnlessEqual(s1, s2) |
|
32 |
|
33 def write(self, config): |
|
34 basedir = self.get_basedir() |
|
35 fn = os.path.join(basedir, "package.json") |
|
36 open(fn,"w").write(config) |
|
37 def read(self): |
|
38 basedir = self.get_basedir() |
|
39 fn = os.path.join(basedir, "package.json") |
|
40 return open(fn,"r").read() |
|
41 |
|
42 def get_cfg(self): |
|
43 cfg = json.loads(self.read()) |
|
44 if "name" not in cfg: |
|
45 # the cfx parser always provides a name, even if package.json |
|
46 # doesn't contain one |
|
47 cfg["name"] = "pretend name" |
|
48 return cfg |
|
49 |
|
50 def parse(self, keydata): |
|
51 fields = {} |
|
52 fieldnames = [] |
|
53 for line in keydata.split("\n"): |
|
54 if line.strip(): |
|
55 k,v = line.split(":", 1) |
|
56 k = k.strip() ; v = v.strip() |
|
57 fields[k] = v |
|
58 fieldnames.append(k) |
|
59 return fields, fieldnames |
|
60 |
|
61 def test_preflight(self): |
|
62 basedir = self.make_basedir() |
|
63 fn = os.path.join(basedir, "package.json") |
|
64 |
|
65 # empty config is not ok: need id (name is automatically supplied) |
|
66 config_orig = "{}" |
|
67 self.write(config_orig) |
|
68 out = StringIO() |
|
69 cfg = self.get_cfg() |
|
70 config_was_ok, modified = preflight.preflight_config(cfg, fn, |
|
71 stderr=out) |
|
72 self.failUnlessEqual(config_was_ok, False) |
|
73 self.failUnlessEqual(modified, True) |
|
74 backup_fn = os.path.join(basedir, "package.json.backup") |
|
75 config_backup = open(backup_fn,"r").read() |
|
76 self.failUnlessEqual(config_backup, config_orig) |
|
77 config = json.loads(self.read()) |
|
78 self.failIf("name" in config) |
|
79 self.failUnless("id" in config) |
|
80 self.failUnless(config["id"].startswith("jid1-"), config["id"]) |
|
81 self.failUnlessEqual(out.getvalue().strip(), |
|
82 "No 'id' in package.json: creating a new ID for you.") |
|
83 os.unlink(backup_fn) |
|
84 |
|
85 # just a name? we add the id |
|
86 config_orig = '{"name": "my-awesome-package"}' |
|
87 self.write(config_orig) |
|
88 out = StringIO() |
|
89 cfg = self.get_cfg() |
|
90 config_was_ok, modified = preflight.preflight_config(cfg, fn, |
|
91 stderr=out) |
|
92 self.failUnlessEqual(config_was_ok, False) |
|
93 self.failUnlessEqual(modified, True) |
|
94 backup_fn = os.path.join(basedir, "package.json.backup") |
|
95 config_backup = open(backup_fn,"r").read() |
|
96 self.failUnlessEqual(config_backup, config_orig) |
|
97 config = json.loads(self.read()) |
|
98 self.failUnlessEqual(config["name"], "my-awesome-package") |
|
99 self.failUnless("id" in config) |
|
100 self.failUnless(config["id"].startswith("jid1-"), config["id"]) |
|
101 jid = str(config["id"]) |
|
102 self.failUnlessEqual(out.getvalue().strip(), |
|
103 "No 'id' in package.json: creating a new ID for you.") |
|
104 os.unlink(backup_fn) |
|
105 |
|
106 # name and valid id? great! ship it! |
|
107 config2 = '{"name": "my-awesome-package", "id": "%s"}' % jid |
|
108 self.write(config2) |
|
109 out = StringIO() |
|
110 cfg = self.get_cfg() |
|
111 config_was_ok, modified = preflight.preflight_config(cfg, fn, |
|
112 stderr=out) |
|
113 self.failUnlessEqual(config_was_ok, True) |
|
114 self.failUnlessEqual(modified, False) |
|
115 config2a = self.read() |
|
116 self.failUnlessEqual(config2a, config2) |
|
117 self.failUnlessEqual(out.getvalue().strip(), "") |
|
118 |
|
119 # name and anonymous ID? without asking to see its papers, ship it |
|
120 config3 = '{"name": "my-old-skool-package", "id": "anonid0-deadbeef"}' |
|
121 self.write(config3) |
|
122 out = StringIO() |
|
123 cfg = self.get_cfg() |
|
124 config_was_ok, modified = preflight.preflight_config(cfg, fn, |
|
125 stderr=out) |
|
126 self.failUnlessEqual(config_was_ok, True) |
|
127 self.failUnlessEqual(modified, False) |
|
128 config3a = self.read() |
|
129 self.failUnlessEqual(config3a, config3) |
|
130 self.failUnlessEqual(out.getvalue().strip(), "") |
|
131 |
|
132 # name and old-style ID? with nostalgic trepidation, ship it |
|
133 config4 = '{"name": "my-old-skool-package", "id": "foo@bar.baz"}' |
|
134 self.write(config4) |
|
135 out = StringIO() |
|
136 cfg = self.get_cfg() |
|
137 config_was_ok, modified = preflight.preflight_config(cfg, fn, |
|
138 stderr=out) |
|
139 self.failUnlessEqual(config_was_ok, True) |
|
140 self.failUnlessEqual(modified, False) |
|
141 config4a = self.read() |
|
142 self.failUnlessEqual(config4a, config4) |
|
143 self.failUnlessEqual(out.getvalue().strip(), "") |
|
144 |
|
145 |
|
146 if __name__ == '__main__': |
|
147 unittest.main() |