1 #!/usr/bin/env python2.3
2 import sys
, tempfile
, os
, shutil
, imp
3 from StringIO
import StringIO
7 foo_iface_uri
= 'http://foo'
9 sys
.path
.insert(0, '..')
10 from zeroinstall
.injector
import trust
, basedir
, autopolicy
, namespaces
, model
, iface_cache
, cli
12 class SilenceLogger(logging
.Filter
):
13 def filter(self
, record
):
15 print "record", record
17 silenceLogger
= SilenceLogger()
19 class TestLaunch(unittest
.TestCase
):
21 self
.config_home
= tempfile
.mktemp()
22 self
.cache_home
= tempfile
.mktemp()
23 os
.environ
['XDG_CONFIG_HOME'] = self
.config_home
24 os
.environ
['XDG_CACHE_HOME'] = self
.cache_home
25 os
.environ
['XDG_CACHE_DIRS'] = self
.cache_home
27 iface_cache
.iface_cache
.__init
__()
29 os
.mkdir(self
.config_home
, 0700)
30 os
.mkdir(self
.cache_home
, 0700)
31 if os
.environ
.has_key('DISPLAY'):
32 del os
.environ
['DISPLAY']
34 logging
.getLogger().setLevel(logging
.WARN
)
37 shutil
.rmtree(self
.config_home
)
38 shutil
.rmtree(self
.cache_home
)
40 def cache_iface(self
, name
, data
):
41 cached_ifaces
= basedir
.save_cache_path('0install.net',
44 f
= file(os
.path
.join(cached_ifaces
, model
.escape(name
)), 'w')
48 def run_0launch(self
, args
):
49 sys
.argv
= ['0launch'] + args
50 old_stdout
= sys
.stdout
51 old_stderr
= sys
.stderr
53 sys
.stdout
= StringIO()
54 sys
.stderr
= StringIO()
57 imp
.load_source('launch', '../0launch')
61 except AssertionError:
65 out
= sys
.stdout
.getvalue()
66 err
= sys
.stderr
.getvalue()
68 err
+= str(ex
.__class
__)
70 sys
.stdout
= old_stdout
71 sys
.stderr
= old_stderr
75 out
, err
= self
.run_0launch([])
76 assert out
.lower().startswith("usage:")
80 out
, err
= self
.run_0launch(['--list'])
82 self
.assertEquals("", out
)
83 cached_ifaces
= os
.path
.join(self
.cache_home
,
84 '0install.net', 'interfaces')
86 os
.makedirs(cached_ifaces
)
87 file(os
.path
.join(cached_ifaces
, 'file%3a%2f%2ffoo'), 'w').close()
89 out
, err
= self
.run_0launch(['--list'])
91 self
.assertEquals("file://foo\n", out
)
93 out
, err
= self
.run_0launch(['--list', 'foo'])
95 self
.assertEquals("file://foo\n", out
)
97 out
, err
= self
.run_0launch(['--list', 'bar'])
99 self
.assertEquals("", out
)
101 out
, err
= self
.run_0launch(['--list', 'one', 'two'])
103 assert out
.lower().startswith("usage:")
105 def testVersion(self
):
106 out
, err
= self
.run_0launch(['--version'])
108 assert out
.startswith("0launch (zero-install)")
110 def testInvalid(self
):
111 a
= tempfile
.NamedTemporaryFile()
112 out
, err
= self
.run_0launch(['-q', a
.name
])
116 out
, err
= self
.run_0launch(['--dry-run', 'http://foo'])
117 self
.assertEquals("Would download 'http://foo'\n", out
)
118 self
.assertEquals("", err
)
120 def testDisplay(self
):
121 os
.environ
['DISPLAY'] = ':foo'
122 out
, err
= self
.run_0launch(['--dry-run', 'http://foo'])
123 # Uses local copy of GUI
124 assert out
.startswith("Would execute: ")
125 assert '0launch-gui' in out
126 self
.assertEquals("", err
)
128 del os
.environ
['DISPLAY']
129 out
, err
= self
.run_0launch(['--gui', '--dry-run'])
130 assert out
.startswith("Would execute: ")
131 assert '0launch-gui' in out
132 self
.assertEquals("", err
)
134 def testRefreshDisplay(self
):
135 os
.environ
['DISPLAY'] = ':foo'
136 out
, err
= self
.run_0launch(['--dry-run', '--download-only',
137 '--refresh', 'http://foo'])
138 assert out
.startswith("Would execute: ")
139 assert '0launch-gui' in out
140 self
.assertEquals("", err
)
142 def testNeedDownload(self
):
143 policy
= autopolicy
.AutoPolicy(foo_iface_uri
)
145 os
.environ
['DISPLAY'] = ':foo'
146 out
, err
= self
.run_0launch(['--download-only', '--dry-run', 'Foo.xml'])
147 self
.assertEquals("", err
)
148 self
.assertEquals("Finished\n", out
)
151 out
, err
= self
.run_0launch(['--dry-run', 'Foo.xml'])
152 self
.assertEquals("", err
)
153 assert out
.startswith("Would execute: ")
155 out
, err
= self
.run_0launch(['Foo.xml'])
156 # (Foo.xml tries to run a directory; plash gives a different error)
157 assert "Permission denied" in err
or "Is a directory" in err
159 def testSource(self
):
160 out
, err
= self
.run_0launch(['--dry-run', '--source', 'Source.xml'])
161 self
.assertEquals("", err
)
162 assert 'Compiler.xml' in out
164 def testLogging(self
):
165 log
= logging
.getLogger()
166 log
.addFilter(silenceLogger
)
168 out
, err
= self
.run_0launch(['-v', '--list', 'UNKNOWN'])
169 self
.assertEquals(logging
.INFO
, log
.level
)
171 out
, err
= self
.run_0launch(['-vv', '--version'])
172 self
.assertEquals(logging
.DEBUG
, log
.level
)
174 log
.removeFilter(silenceLogger
)
175 log
.setLevel(logging
.WARN
)
178 out
, err
= self
.run_0launch(['--help'])
179 self
.assertEquals("", err
)
180 assert 'options:' in out
182 out
, err
= self
.run_0launch([])
183 self
.assertEquals("", err
)
184 assert 'options:' in out
191 cli
.main(['--list', 'UNKNOWN'])
198 suite
= unittest
.makeSuite(TestLaunch
)
199 if __name__
== '__main__':
200 sys
.argv
.append('-v')