Generalise mirror fallback code.
[zeroinstall/zeroinstall-mseaborn.git] / tests / testlaunch.py
blobebb26f06d4fffc1fcb7b0a50c3c90167d9727677
1 #!/usr/bin/env python2.4
2 from basetest import BaseTest
3 import sys, tempfile, os, shutil, imp
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 trust, autopolicy, namespaces, model, iface_cache, 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 sys.argv = ['0launch'] + args
31 old_stdout = sys.stdout
32 old_stderr = sys.stderr
33 try:
34 sys.stdout = StringIO()
35 sys.stderr = StringIO()
36 ex = None
37 try:
38 imp.load_source('launch', '../0launch')
39 print "Finished"
40 except NameError:
41 raise
42 except SystemExit:
43 pass
44 except TypeError:
45 raise
46 except AttributeError:
47 raise
48 except AssertionError:
49 raise
50 except Exception, ex:
51 pass
52 out = sys.stdout.getvalue()
53 err = sys.stderr.getvalue()
54 if ex is not None:
55 err += str(ex.__class__)
56 finally:
57 sys.stdout = old_stdout
58 sys.stderr = old_stderr
59 return (out, err)
61 def testHelp(self):
62 out, err = self.run_0launch([])
63 assert out.lower().startswith("usage:")
64 assert not err
66 def testList(self):
67 out, err = self.run_0launch(['--list'])
68 assert not err
69 self.assertEquals("Finished\n", out)
70 cached_ifaces = os.path.join(self.cache_home,
71 '0install.net', 'interfaces')
73 os.makedirs(cached_ifaces)
74 file(os.path.join(cached_ifaces, 'file%3a%2f%2ffoo'), 'w').close()
76 out, err = self.run_0launch(['--list'])
77 assert not err
78 self.assertEquals("file://foo\nFinished\n", out)
80 out, err = self.run_0launch(['--list', 'foo'])
81 assert not err
82 self.assertEquals("file://foo\nFinished\n", out)
84 out, err = self.run_0launch(['--list', 'bar'])
85 assert not err
86 self.assertEquals("Finished\n", out)
88 out, err = self.run_0launch(['--list', 'one', 'two'])
89 assert not err
90 assert out.lower().startswith("usage:")
92 def testVersion(self):
93 out, err = self.run_0launch(['--version'])
94 assert not err
95 assert out.startswith("0launch (zero-install)")
97 def testInvalid(self):
98 a = tempfile.NamedTemporaryFile()
99 out, err = self.run_0launch(['-q', a.name])
100 assert err
102 def testOK(self):
103 out, err = self.run_0launch(['--dry-run', 'http://foo'])
104 self.assertEquals("Would download 'http://foo'\nFinished\n", out)
105 self.assertEquals("", err)
107 def testDisplay(self):
108 os.environ['DISPLAY'] = ':foo'
109 out, err = self.run_0launch(['--dry-run', 'http://foo'])
110 # Uses local copy of GUI
111 assert out.startswith("Would execute: ")
112 assert 'basetest.py' in out
113 self.assertEquals("", err)
115 del os.environ['DISPLAY']
116 out, err = self.run_0launch(['--gui', '--dry-run'])
117 self.assertEquals("", err)
118 self.assertEquals("Finished\n", out)
120 def testRefreshDisplay(self):
121 os.environ['DISPLAY'] = ':foo'
122 out, err = self.run_0launch(['--dry-run', '--refresh', 'http://foo'])
123 assert out.startswith("Would execute: ")
124 assert 'basetest.py' in out
125 self.assertEquals("", err)
127 def testNeedDownload(self):
128 policy = autopolicy.AutoPolicy(foo_iface_uri)
129 policy.save_config()
130 os.environ['DISPLAY'] = ':foo'
131 out, err = self.run_0launch(['--download-only', '--dry-run', 'Foo.xml'])
132 self.assertEquals("", err)
133 self.assertEquals("Finished\n", out)
135 def testHello(self):
136 out, err = self.run_0launch(['--dry-run', 'Foo.xml'])
137 self.assertEquals("", err)
138 assert out.startswith("Would execute: ")
140 out, err = self.run_0launch(['Foo.xml'])
141 # (Foo.xml tries to run a directory; plash gives a different error)
142 assert "Permission denied" in err or "Is a directory" in err
144 def testSource(self):
145 out, err = self.run_0launch(['--dry-run', '--source', 'Source.xml'])
146 self.assertEquals("", err)
147 assert 'Compiler.xml' in out
149 def testRanges(self):
150 out, err = self.run_0launch(['--dry-run', '--before=1', '--not-before=0.2', 'Foo.xml'])
151 assert 'tests/two' in err, err
152 self.assertEquals("", out)
154 def testLogging(self):
155 log = logging.getLogger()
156 log.addFilter(silenceLogger)
158 out, err = self.run_0launch(['-v', '--list', 'UNKNOWN'])
159 self.assertEquals(logging.INFO, log.level)
161 out, err = self.run_0launch(['-vv', '--version'])
162 self.assertEquals(logging.DEBUG, log.level)
164 log.removeFilter(silenceLogger)
165 log.setLevel(logging.WARN)
167 def testHelp(self):
168 out, err = self.run_0launch(['--help'])
169 self.assertEquals("", err)
170 assert 'options:' in out.lower()
172 out, err = self.run_0launch([])
173 self.assertEquals("", err)
174 assert 'options:' in out.lower()
176 def testBadFD(self):
177 copy = os.dup(1)
178 try:
179 os.close(1)
180 cli.main(['--list', 'UNKNOWN'])
181 finally:
182 os.dup2(copy, 1)
184 suite = unittest.makeSuite(TestLaunch)
185 if __name__ == '__main__':
186 sys.argv.append('-v')
187 unittest.main()