Updated uses of deprecated file() function
[zeroinstall.git] / tests / testlaunch.py
blob91464d0d4ff5e5f456fbe1cd1aad3f16fa11122e
1 #!/usr/bin/env python
3 from __future__ import print_function
5 from basetest import BaseTest
6 import sys, tempfile, os
7 from StringIO import StringIO
8 import unittest
9 import logging
11 foo_iface_uri = 'http://foo'
13 sys.path.insert(0, '..')
14 from zeroinstall import SafeException
15 from zeroinstall.injector.policy import Policy
16 from zeroinstall.injector import run, cli, namespaces, qdom, selections
17 from zeroinstall.zerostore import Store; Store._add_with_helper = lambda *unused: False
19 mydir = os.path.abspath(os.path.dirname(__file__))
21 class SilenceLogger(logging.Filter):
22 def filter(self, record):
23 return 0
24 silenceLogger = SilenceLogger()
26 class TestLaunch(BaseTest):
27 def run_0launch(self, args):
28 old_stdout = sys.stdout
29 old_stderr = sys.stderr
30 try:
31 sys.stdout = StringIO()
32 sys.stderr = StringIO()
33 ex = None
34 try:
35 cli.main(args)
36 print("Finished")
37 except NameError:
38 raise
39 except SystemExit:
40 pass
41 except TypeError:
42 raise
43 except AttributeError:
44 raise
45 except AssertionError:
46 raise
47 except Exception as ex:
48 pass
49 out = sys.stdout.getvalue()
50 err = sys.stderr.getvalue()
51 if ex is not None:
52 err += str(ex.__class__)
53 finally:
54 sys.stdout = old_stdout
55 sys.stderr = old_stderr
56 return (out, err)
58 def testHelp(self):
59 out, err = self.run_0launch([])
60 assert out.lower().startswith("usage:")
61 assert not err
63 def testList(self):
64 out, err = self.run_0launch(['--list'])
65 assert not err
66 self.assertEquals("Finished\n", out)
67 cached_ifaces = os.path.join(self.cache_home,
68 '0install.net', 'interfaces')
70 os.makedirs(cached_ifaces)
71 open(os.path.join(cached_ifaces, 'file%3a%2f%2ffoo'), 'w').close()
73 out, err = self.run_0launch(['--list'])
74 assert not err
75 self.assertEquals("file://foo\nFinished\n", out)
77 out, err = self.run_0launch(['--list', 'foo'])
78 assert not err
79 self.assertEquals("file://foo\nFinished\n", out)
81 out, err = self.run_0launch(['--list', 'bar'])
82 assert not err
83 self.assertEquals("Finished\n", out)
85 out, err = self.run_0launch(['--list', 'one', 'two'])
86 assert not err
87 assert out.lower().startswith("usage:")
89 def testVersion(self):
90 out, err = self.run_0launch(['--version'])
91 assert not err
92 assert out.startswith("0launch (zero-install)")
94 def testInvalid(self):
95 a = tempfile.NamedTemporaryFile()
96 out, err = self.run_0launch(['-q', a.name])
97 assert err
99 def testOK(self):
100 out, err = self.run_0launch(['--dry-run', 'http://foo/d'])
101 self.assertEquals("Would download 'http://foo/d'\nFinished\n", out)
102 self.assertEquals("", err)
104 def testRun(self):
105 out, err = self.run_0launch(['Local.xml'])
106 self.assertEquals("", out)
107 assert "test-echo' does not exist" in err, err
109 def testAbsMain(self):
110 tmp = tempfile.NamedTemporaryFile(prefix = 'test-')
111 tmp.write(
112 """<?xml version="1.0" ?>
113 <interface last-modified="1110752708"
114 uri="%s"
115 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
116 <name>Foo</name>
117 <summary>Foo</summary>
118 <description>Foo</description>
119 <group main='/bin/sh'>
120 <implementation id='.' version='1'/>
121 </group>
122 </interface>""" % foo_iface_uri)
123 tmp.flush()
124 policy = Policy(tmp.name, config = self.config)
125 try:
126 downloaded = policy.solve_and_download_impls()
127 if downloaded:
128 policy.handler.wait_for_blocker(downloaded)
129 run.execute_selections(policy.solver.selections, [], stores = policy.config.stores)
130 assert False
131 except SafeException as ex:
132 assert 'Command path must be relative' in str(ex), ex
134 def testOffline(self):
135 out, err = self.run_0launch(['--offline', 'http://foo/d'])
136 self.assertEquals("Interface 'http://foo/d' has no usable implementations in the cache (and 0install is in off-line mode)\n", err)
137 self.assertEquals("", out)
139 def testDisplay(self):
140 os.environ['DISPLAY'] = ':foo'
141 out, err = self.run_0launch(['--dry-run', 'http://foo/d'])
142 # Uses local copy of GUI
143 assert out.startswith("Would execute: ")
144 assert 'basetest.py' in out
145 self.assertEquals("", err)
147 del os.environ['DISPLAY']
148 out, err = self.run_0launch(['--gui', '--dry-run'])
149 self.assertEquals("", err)
150 self.assertEquals("Finished\n", out)
152 def testRefreshDisplay(self):
153 os.environ['DISPLAY'] = ':foo'
154 out, err = self.run_0launch(['--dry-run', '--refresh', 'http://foo/d'])
155 assert out.startswith("Would execute: ")
156 assert 'basetest.py' in out
157 self.assertEquals("", err)
159 def testNeedDownload(self):
160 os.environ['DISPLAY'] = ':foo'
161 out, err = self.run_0launch(['--download-only', '--dry-run', 'Foo.xml'])
162 self.assertEquals("", err)
163 self.assertEquals("Finished\n", out)
165 def testSelectOnly(self):
166 os.environ['DISPLAY'] = ':foo'
167 out, err = self.run_0launch(['--get-selections', '--select-only', 'Hello.xml'])
168 self.assertEquals("", err)
170 assert out.endswith("Finished\n")
171 out = out[:-len("Finished\n")]
173 root = qdom.parse(StringIO(str(out)))
174 self.assertEquals(namespaces.XMLNS_IFACE, root.uri)
175 sels = selections.Selections(root)
176 sel,= sels.selections.values()
177 self.assertEquals("sha1=3ce644dc725f1d21cfcf02562c76f375944b266a", sel.id)
179 def testHello(self):
180 out, err = self.run_0launch(['--dry-run', 'Foo.xml'])
181 self.assertEquals("", err)
182 assert out.startswith("Would execute: ")
184 out, err = self.run_0launch(['Foo.xml'])
185 # (Foo.xml tries to run a directory; plash gives a different error)
186 assert "Permission denied" in err or "Is a directory" in err
188 def testSource(self):
189 out, err = self.run_0launch(['--dry-run', '--source', 'Source.xml'])
190 self.assertEquals("", err)
191 assert 'Compiler.xml' in out
193 def testRanges(self):
194 out, err = self.run_0launch(['--get-selections', '--before=1', '--not-before=0.2', 'Foo.xml'])
195 assert 'tests/rpm' in out, out
196 self.assertEquals("", err)
198 def testLogging(self):
199 log = logging.getLogger()
200 log.addFilter(silenceLogger)
202 out, err = self.run_0launch(['-v', '--list', 'UNKNOWN'])
203 self.assertEquals(logging.INFO, log.level)
205 out, err = self.run_0launch(['-vv', '--version'])
206 self.assertEquals(logging.DEBUG, log.level)
208 log.removeFilter(silenceLogger)
209 log.setLevel(logging.WARN)
211 def testHelp2(self):
212 out, err = self.run_0launch(['--help'])
213 self.assertEquals("", err)
214 assert 'options:' in out.lower()
216 out, err = self.run_0launch([])
217 self.assertEquals("", err)
218 assert 'options:' in out.lower()
220 def testBadFD(self):
221 copy = os.dup(1)
222 try:
223 os.close(1)
224 cli.main(['--list', 'UNKNOWN'])
225 finally:
226 os.dup2(copy, 1)
228 def testShow(self):
229 command_feed = os.path.join(mydir, 'Command.xml')
230 out, err = self.run_0launch(['--show', command_feed])
231 self.assertEquals("", err)
232 assert 'Local.xml' in out, out
234 if __name__ == '__main__':
235 unittest.main()