Two small simplifications
[zeroinstall/zeroinstall-mseaborn.git] / tests / testlaunch.py
blobe76041ed2cc7782c285b5cee9938a47ef6fd9d88
1 #!/usr/bin/env python2.4
2 from basetest import BaseTest
3 import sys, tempfile, os
4 from StringIO import StringIO
5 import unittest
6 import logging
8 foo_iface_uri = 'http://foo'
10 sys.path.insert(0, '..')
11 from zeroinstall.injector import autopolicy, model, cli
12 from zeroinstall.zerostore import Store; Store._add_with_helper = lambda *unused: False
13 from zeroinstall.support import basedir
15 class SilenceLogger(logging.Filter):
16 def filter(self, record):
17 return 0
18 silenceLogger = SilenceLogger()
20 class TestLaunch(BaseTest):
21 def cache_iface(self, name, data):
22 cached_ifaces = basedir.save_cache_path('0install.net',
23 'interfaces')
25 f = file(os.path.join(cached_ifaces, model.escape(name)), 'w')
26 f.write(data)
27 f.close()
29 def run_0launch(self, args):
30 old_stdout = sys.stdout
31 old_stderr = sys.stderr
32 try:
33 sys.stdout = StringIO()
34 sys.stderr = StringIO()
35 ex = None
36 try:
37 cli.main(args)
38 print "Finished"
39 except NameError:
40 raise
41 except SystemExit:
42 pass
43 except TypeError:
44 raise
45 except AttributeError:
46 raise
47 except AssertionError:
48 raise
49 except Exception, ex:
50 pass
51 out = sys.stdout.getvalue()
52 err = sys.stderr.getvalue()
53 if ex is not None:
54 err += str(ex.__class__)
55 finally:
56 sys.stdout = old_stdout
57 sys.stderr = old_stderr
58 return (out, err)
60 def testHelp(self):
61 out, err = self.run_0launch([])
62 assert out.lower().startswith("usage:")
63 assert not err
65 def testList(self):
66 out, err = self.run_0launch(['--list'])
67 assert not err
68 self.assertEquals("Finished\n", out)
69 cached_ifaces = os.path.join(self.cache_home,
70 '0install.net', 'interfaces')
72 os.makedirs(cached_ifaces)
73 file(os.path.join(cached_ifaces, 'file%3a%2f%2ffoo'), 'w').close()
75 out, err = self.run_0launch(['--list'])
76 assert not err
77 self.assertEquals("file://foo\nFinished\n", out)
79 out, err = self.run_0launch(['--list', 'foo'])
80 assert not err
81 self.assertEquals("file://foo\nFinished\n", out)
83 out, err = self.run_0launch(['--list', 'bar'])
84 assert not err
85 self.assertEquals("Finished\n", out)
87 out, err = self.run_0launch(['--list', 'one', 'two'])
88 assert not err
89 assert out.lower().startswith("usage:")
91 def testVersion(self):
92 out, err = self.run_0launch(['--version'])
93 assert not err
94 assert out.startswith("0launch (zero-install)")
96 def testInvalid(self):
97 a = tempfile.NamedTemporaryFile()
98 out, err = self.run_0launch(['-q', a.name])
99 assert err
101 def testOK(self):
102 out, err = self.run_0launch(['--dry-run', 'http://foo/d'])
103 self.assertEquals("Would download 'http://foo/d'\nFinished\n", out)
104 self.assertEquals("", err)
106 def testOffline(self):
107 out, err = self.run_0launch(['--offline', 'http://foo/d'])
108 self.assertEquals("Can't find all required implementations:\n- <Interface http://foo/d> -> None\n", err)
109 self.assertEquals("", out)
111 def testDisplay(self):
112 os.environ['DISPLAY'] = ':foo'
113 out, err = self.run_0launch(['--dry-run', 'http://foo/d'])
114 # Uses local copy of GUI
115 assert out.startswith("Would execute: ")
116 assert 'basetest.py' in out
117 self.assertEquals("", err)
119 del os.environ['DISPLAY']
120 out, err = self.run_0launch(['--gui', '--dry-run'])
121 self.assertEquals("", err)
122 self.assertEquals("Finished\n", out)
124 def testRefreshDisplay(self):
125 os.environ['DISPLAY'] = ':foo'
126 out, err = self.run_0launch(['--dry-run', '--refresh', 'http://foo/d'])
127 assert out.startswith("Would execute: ")
128 assert 'basetest.py' in out
129 self.assertEquals("", err)
131 def testNeedDownload(self):
132 policy = autopolicy.AutoPolicy(foo_iface_uri)
133 policy.save_config()
134 os.environ['DISPLAY'] = ':foo'
135 out, err = self.run_0launch(['--download-only', '--dry-run', 'Foo.xml'])
136 self.assertEquals("", err)
137 self.assertEquals("Finished\n", out)
139 def testHello(self):
140 out, err = self.run_0launch(['--dry-run', 'Foo.xml'])
141 self.assertEquals("", err)
142 assert out.startswith("Would execute: ")
144 out, err = self.run_0launch(['Foo.xml'])
145 # (Foo.xml tries to run a directory; plash gives a different error)
146 assert "Permission denied" in err or "Is a directory" in err
148 def testSource(self):
149 out, err = self.run_0launch(['--dry-run', '--source', 'Source.xml'])
150 self.assertEquals("", err)
151 assert 'Compiler.xml' in out
153 def testRanges(self):
154 out, err = self.run_0launch(['--dry-run', '--before=1', '--not-before=0.2', 'Foo.xml'])
155 assert 'tests/two' in err, err
156 self.assertEquals("", out)
158 def testLogging(self):
159 log = logging.getLogger()
160 log.addFilter(silenceLogger)
162 out, err = self.run_0launch(['-v', '--list', 'UNKNOWN'])
163 self.assertEquals(logging.INFO, log.level)
165 out, err = self.run_0launch(['-vv', '--version'])
166 self.assertEquals(logging.DEBUG, log.level)
168 log.removeFilter(silenceLogger)
169 log.setLevel(logging.WARN)
171 def testHelp(self):
172 out, err = self.run_0launch(['--help'])
173 self.assertEquals("", err)
174 assert 'options:' in out.lower()
176 out, err = self.run_0launch([])
177 self.assertEquals("", err)
178 assert 'options:' in out.lower()
180 def testBadFD(self):
181 copy = os.dup(1)
182 try:
183 os.close(1)
184 cli.main(['--list', 'UNKNOWN'])
185 finally:
186 os.dup2(copy, 1)
188 suite = unittest.makeSuite(TestLaunch)
189 if __name__ == '__main__':
190 sys.argv.append('-v')
191 unittest.main()