1 #!/usr/bin/env python2.4
2 from basetest
import BaseTest
3 import sys
, tempfile
, os
, shutil
, logging
4 from StringIO
import StringIO
6 from logging
import getLogger
, DEBUG
, INFO
8 sys
.path
.insert(0, '..')
10 from zeroinstall
import NeedDownload
11 from zeroinstall
.injector
import model
, basedir
, autopolicy
, gpg
, iface_cache
, namespaces
, reader
14 foo_iface_uri
= 'http://foo'
16 logger
= logging
.getLogger()
18 class TestAutoPolicy(BaseTest
):
21 stream
= tempfile
.TemporaryFile()
22 stream
.write(data
.thomas_key
)
24 gpg
.import_key(stream
)
26 def cache_iface(self
, name
, data
):
27 cached_ifaces
= basedir
.save_cache_path('0install.net',
30 f
= file(os
.path
.join(cached_ifaces
, model
.escape(name
)), 'w')
34 def testNoNeedDl(self
):
35 policy
= autopolicy
.AutoPolicy(foo_iface_uri
,
36 download_only
= False)
38 assert policy
.need_download()
39 self
.cache_iface(foo_iface_uri
,
40 """<?xml version="1.0" ?>
41 <interface last-modified="1110752708"
43 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
45 <summary>Foo</summary>
46 <description>Foo</description>
47 </interface>""" % foo_iface_uri
)
48 iface_cache
.iface_cache
._interfaces
= {}
49 assert not policy
.need_download()
51 def testUnknownAlg(self
):
52 self
.cache_iface(foo_iface_uri
,
53 """<?xml version="1.0" ?>
56 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
58 <summary>Foo</summary>
59 <description>Foo</description>
60 <implementation id='unknown=123' version='1.0'>
61 <archive href='http://foo/foo.tgz' size='100'/>
63 </interface>""" % foo_iface_uri
)
64 policy
= autopolicy
.AutoPolicy(foo_iface_uri
,
65 download_only
= False)
68 assert policy
.need_download()
70 except model
.SafeException
, ex
:
71 assert 'Unknown digest algorithm' in str(ex
)
73 def testDownload(self
):
74 tmp
= tempfile
.NamedTemporaryFile()
76 """<?xml version="1.0" ?>
78 main='ThisBetterNotExist'
79 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
81 <summary>Foo</summary>
82 <description>Foo</description>
83 <implementation version='1.0' id='/bin'/>
86 policy
= autopolicy
.AutoPolicy(tmp
.name
, False, False)
88 policy
.download_and_execute(['Hello'])
90 except model
.SafeException
, ex
:
91 assert "ThisBetterNotExist" in str(ex
)
95 tmp
= tempfile
.NamedTemporaryFile()
97 """<?xml version="1.0" ?>
99 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
101 <summary>Foo</summary>
102 <description>Foo</description>
103 <implementation version='1.0' id='/bin'/>
106 policy
= autopolicy
.AutoPolicy(tmp
.name
, False, False)
108 policy
.download_and_execute(['Hello'])
110 except model
.SafeException
, ex
:
111 assert "library" in str(ex
)
114 def testNeedDL(self
):
115 self
.cache_iface(foo_iface_uri
,
116 """<?xml version="1.0" ?>
117 <interface last-modified="0"
119 main='ThisBetterNotExist'
120 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
122 <summary>Foo</summary>
123 <description>Foo</description>
124 <implementation version='1.0' id='sha1=123'>
125 <archive href='http://foo/foo.tgz' size='100'/>
127 </interface>""" % foo_iface_uri
)
128 policy
= autopolicy
.AutoPolicy(foo_iface_uri
, False, True)
130 policy
.network_use
= model
.network_full
132 assert policy
.need_download()
134 policy
.start_downloading_impls()
136 except NeedDownload
, ex
:
139 def testBinding(self
):
140 local_impl
= os
.path
.dirname(os
.path
.abspath(__file__
))
141 tmp
= tempfile
.NamedTemporaryFile()
143 """<?xml version="1.0" ?>
145 main='testautopolicy.py'
146 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
148 <summary>Bar</summary>
149 <description>Bar</description>
151 <requires interface='%s'>
152 <environment name='FOO_PATH' insert='.'/>
153 <environment name='BAR_PATH' insert='.' default='/a:/b'/>
154 <environment name='XDG_DATA_DIRS' insert='.'/>
156 <environment name='SELF_GROUP' insert='group' mode='replace'/>
157 <implementation version='1.0' id='%s'>
158 <environment name='SELF_IMPL' insert='impl' mode='replace'/>
161 </interface>""" % (foo_iface_uri
, local_impl
))
163 self
.cache_iface(foo_iface_uri
,
164 """<?xml version="1.0" ?>
165 <interface last-modified="0"
167 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
169 <summary>Foo</summary>
170 <description>Foo</description>
171 <implementation version='1.0' id='sha1=123'/>
172 </interface>""" % foo_iface_uri
)
173 cached_impl
= basedir
.save_cache_path('0install.net',
176 policy
= autopolicy
.AutoPolicy(tmp
.name
, False,
178 policy
.network_use
= model
.network_offline
179 os
.environ
['FOO_PATH'] = "old"
180 old
, sys
.stdout
= sys
.stdout
, StringIO()
182 policy
.download_and_execute(['Hello'])
185 self
.assertEquals(cached_impl
+ '/.:old',
186 os
.environ
['FOO_PATH'])
187 self
.assertEquals(cached_impl
+ '/.:/a:/b',
188 os
.environ
['BAR_PATH'])
190 self
.assertEquals(os
.path
.join(local_impl
, 'group'), os
.environ
['SELF_GROUP'])
191 self
.assertEquals(os
.path
.join(local_impl
, 'impl'), os
.environ
['SELF_IMPL'])
193 del os
.environ
['FOO_PATH']
194 if 'XDG_DATA_DIRS' in os
.environ
:
195 del os
.environ
['XDG_DATA_DIRS']
196 os
.environ
['BAR_PATH'] = '/old'
197 old
, sys
.stdout
= sys
.stdout
, StringIO()
199 policy
.download_and_execute(['Hello'])
202 self
.assertEquals(cached_impl
+ '/.',
203 os
.environ
['FOO_PATH'])
204 self
.assertEquals(cached_impl
+ '/.:/old',
205 os
.environ
['BAR_PATH'])
206 self
.assertEquals(cached_impl
+ '/.:/usr/local/share:/usr/share',
207 os
.environ
['XDG_DATA_DIRS'])
210 self
.cache_iface(foo_iface_uri
,
211 """<?xml version="1.0" ?>
212 <interface last-modified="0"
214 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
216 <summary>Foo</summary>
217 <description>Foo</description>
218 <feed src='http://bar'/>
219 </interface>""" % foo_iface_uri
)
220 self
.cache_iface('http://bar',
221 """<?xml version="1.0" ?>
222 <interface last-modified="0"
224 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
225 <feed-for interface='%s'/>
227 <summary>Bar</summary>
228 <description>Bar</description>
229 <implementation version='1.0' id='sha1=123'/>
230 </interface>""" % foo_iface_uri
)
231 policy
= autopolicy
.AutoPolicy(foo_iface_uri
, False,
234 policy
.network_use
= model
.network_full
237 foo_iface
= policy
.get_interface(foo_iface_uri
)
238 self
.assertEquals('sha1=123', policy
.implementation
[foo_iface
].id)
240 def testBadConfig(self
):
241 path
= basedir
.save_config_path(namespaces
.config_site
,
242 namespaces
.config_prog
)
243 glob
= os
.path
.join(path
, 'global')
244 assert not os
.path
.exists(glob
)
245 stream
= file(glob
, 'w')
246 stream
.write('hello!')
249 logger
.setLevel(logging
.ERROR
)
250 policy
= autopolicy
.AutoPolicy(foo_iface_uri
,
251 download_only
= False)
252 logger
.setLevel(logging
.WARN
)
254 def testNoLocal(self
):
255 self
.cache_iface(foo_iface_uri
,
256 """<?xml version="1.0" ?>
257 <interface last-modified="1110752708"
259 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
261 <summary>Foo</summary>
262 <description>Foo</description>
263 <feed src='/etc/passwd'/>
264 </interface>""" % foo_iface_uri
)
265 policy
= autopolicy
.AutoPolicy(foo_iface_uri
,
266 download_only
= False)
267 policy
.network_use
= model
.network_offline
269 policy
.get_interface(foo_iface_uri
)
271 except reader
.InvalidInterface
, ex
:
272 assert 'Invalid feed URL' in str(ex
)
274 def testDLfeed(self
):
275 self
.cache_iface(foo_iface_uri
,
276 """<?xml version="1.0" ?>
277 <interface last-modified="1110752708"
279 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
281 <summary>Foo</summary>
282 <description>Foo</description>
283 <feed src='http://example.com'/>
284 </interface>""" % foo_iface_uri
)
285 policy
= autopolicy
.AutoPolicy(foo_iface_uri
, dry_run
= True)
286 policy
.network_use
= model
.network_full
292 except NeedDownload
, ex
:
295 iface
= policy
.get_interface(foo_iface_uri
)
296 iface
._main
_feed
.feeds
= [model
.Feed('/BadFeed', None, False)]
298 logger
.setLevel(logging
.ERROR
)
299 policy
.recalculate() # Triggers warning
300 logger
.setLevel(logging
.WARN
)
302 def testBestUnusable(self
):
303 self
.cache_iface(foo_iface_uri
,
304 """<?xml version="1.0" ?>
305 <interface last-modified="1110752708"
307 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
309 <summary>Foo</summary>
310 <description>Foo</description>
311 <implementation id='sha1=123' version='1.0' arch='odd-weird'/>
312 </interface>""" % foo_iface_uri
)
313 policy
= autopolicy
.AutoPolicy(foo_iface_uri
,
314 download_only
= False)
315 policy
.network_use
= model
.network_offline
317 assert not policy
.ready
, policy
.implementation
319 policy
.download_and_execute([])
321 except model
.SafeException
, ex
:
322 assert "Can't find all required implementations" in str(ex
)
324 def testNoArchives(self
):
325 self
.cache_iface(foo_iface_uri
,
326 """<?xml version="1.0" ?>
327 <interface last-modified="1110752708"
329 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
331 <summary>Foo</summary>
332 <description>Foo</description>
333 <implementation id='sha1=123' version='1.0'/>
334 </interface>""" % foo_iface_uri
)
335 policy
= autopolicy
.AutoPolicy(foo_iface_uri
,
336 download_only
= False)
341 policy
.download_and_execute([])
343 except model
.SafeException
, ex
:
344 assert 'no download locations' in str(ex
)
347 self
.cache_iface(foo_iface_uri
,
348 """<?xml version="1.0" ?>
349 <interface last-modified="1110752708"
351 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
353 <summary>Foo</summary>
354 <description>Foo</description>
356 <requires interface='%s'/>
357 <implementation id='sha1=123' version='1.0'/>
359 </interface>""" % (foo_iface_uri
, foo_iface_uri
))
360 policy
= autopolicy
.AutoPolicy(foo_iface_uri
,
361 download_only
= False)
365 def testConstraints(self
):
366 self
.cache_iface('http://bar',
367 """<?xml version="1.0" ?>
368 <interface last-modified="1110752708"
370 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
372 <summary>Bar</summary>
373 <description>Bar</description>
374 <implementation id='sha1=100' version='1.0'/>
375 <implementation id='sha1=150' stability='developer' version='1.5'/>
376 <implementation id='sha1=200' version='2.0'/>
378 self
.cache_iface(foo_iface_uri
,
379 """<?xml version="1.0" ?>
380 <interface last-modified="1110752708"
382 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
384 <summary>Foo</summary>
385 <description>Foo</description>
387 <requires interface='http://bar'>
390 <implementation id='sha1=123' version='1.0'/>
392 </interface>""" % foo_iface_uri
)
393 policy
= autopolicy
.AutoPolicy(foo_iface_uri
,
394 download_only
= False)
395 policy
.network_use
= model
.network_full
397 #logger.setLevel(logging.DEBUG)
399 #logger.setLevel(logging.WARN)
400 foo_iface
= policy
.get_interface(foo_iface_uri
)
401 bar_iface
= policy
.get_interface('http://bar')
402 assert policy
.implementation
[bar_iface
].id == 'sha1=200'
404 dep
= policy
.implementation
[foo_iface
].dependencies
['http://bar']
405 assert len(dep
.restrictions
) == 1
406 restriction
= dep
.restrictions
[0]
408 restriction
.before
= model
.parse_version('2.0')
410 assert policy
.implementation
[bar_iface
].id == 'sha1=100'
412 restriction
.not_before
= model
.parse_version('1.5')
414 assert policy
.implementation
[bar_iface
].id == 'sha1=150'
416 suite
= unittest
.makeSuite(TestAutoPolicy
)
417 if __name__
== '__main__':
418 sys
.argv
.append('-v')