Added TrustDB.domain_from_url() to get the appropriate trust domain for a
[zeroinstall.git] / tests / testreader.py
blobf9a71d8fa2b020bd7abeeb24de9e68b5587cc79f
1 #!/usr/bin/env python2.3
2 from basetest import BaseTest
3 import sys, tempfile, os, shutil, logging
4 from StringIO import StringIO
5 import unittest
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
12 import data
14 foo_iface_uri = 'http://foo'
15 bar_iface_uri = 'http://localhost/bar'
17 logger = logging.getLogger()
19 class TestReader(BaseTest):
20 def setUp(self):
21 BaseTest.setUp(self)
23 stream = tempfile.TemporaryFile()
24 stream.write(data.thomas_key)
25 stream.seek(0)
26 gpg.import_key(stream)
28 def write_with_version(self, version):
29 tmp = tempfile.NamedTemporaryFile(prefix = 'test-')
30 tmp.write(
31 """<?xml version="1.0" ?>
32 <interface last-modified="1110752708"
33 uri="%s" %s
34 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
35 <name>Foo</name>
36 <summary>Foo</summary>
37 <description>Foo</description>
38 </interface>""" % (foo_iface_uri, version))
39 tmp.flush()
40 return tmp
42 def testNoVersion(self):
43 tmp = self.write_with_version('')
44 reader.check_readable(foo_iface_uri, tmp.name)
46 def testNewEnough(self):
47 tmp = self.write_with_version('min-injector-version="0.19"')
48 reader.check_readable(foo_iface_uri, tmp.name)
50 def testTooOld(self):
51 tmp = self.write_with_version('min-injector-version="1000"')
52 try:
53 reader.check_readable(foo_iface_uri, tmp.name)
54 except reader.InvalidInterface, ex:
55 assert "1000" in str(ex)
57 def testRequiresVersion(self):
58 tmp = tempfile.NamedTemporaryFile(prefix = 'test-')
59 tmp.write(
60 """<?xml version="1.0" ?>
61 <interface last-modified="1110752708"
62 uri="%s"
63 xmlns="http://zero-install.sourceforge.net/2004/injector/interface"
64 xmlns:my='http://my/namespace'>
65 <name>Foo</name>
66 <summary>Foo</summary>
67 <description>Foo</description>
68 <group>
69 <requires interface='%s' my:foo='test'>
70 <version not-before='2.3.4' before='3.4.5'/>
71 </requires>
72 <requires interface='%s2'/>
73 <implementation id='sha1=123' version='1'/>
74 </group>
75 </interface>""" % (foo_iface_uri, bar_iface_uri, bar_iface_uri))
76 tmp.flush()
77 iface = model.Interface(foo_iface_uri)
78 reader.update(iface, tmp.name)
79 impl = iface.implementations['sha1=123']
80 assert len(impl.dependencies) == 2
81 dep = impl.dependencies[bar_iface_uri]
82 assert len(dep.restrictions) == 1
83 res = dep.restrictions[0]
84 assert res.not_before == [[2, 3, 4], 0]
85 assert res.before == [[3, 4, 5], 0]
86 dep2 = impl.dependencies[bar_iface_uri + '2']
87 assert len(dep2.restrictions) == 0
88 str(dep)
89 str(dep2)
91 assert dep.metadata.get('http://my/namespace foo') == 'test'
92 assert dep.metadata.get('http://my/namespace food', None) == None
94 def testVersions(self):
95 tmp = tempfile.NamedTemporaryFile(prefix = 'test-')
96 tmp.write(
97 """<?xml version="1.0" ?>
98 <interface
99 uri="%s"
100 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
101 <name>Foo</name>
102 <summary>Foo</summary>
103 <description>Foo</description>
104 <implementation id='sha1=123' version='1.0-rc3' version-modifier='-pre'/>
105 </interface>""" % foo_iface_uri)
106 tmp.flush()
107 iface = model.Interface(foo_iface_uri)
108 reader.update(iface, tmp.name)
109 impl = iface.implementations['sha1=123']
110 assert impl.version == [[1, 0], -1, [3], -2]
112 def testAbsMain(self):
113 tmp = tempfile.NamedTemporaryFile(prefix = 'test-')
114 tmp.write(
115 """<?xml version="1.0" ?>
116 <interface last-modified="1110752708"
117 uri="%s"
118 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
119 <name>Foo</name>
120 <summary>Foo</summary>
121 <description>Foo</description>
122 <group main='/bin/sh'>
123 <implementation id='sha1=123' version='1'/>
124 </group>
125 </interface>""" % foo_iface_uri)
126 tmp.flush()
127 iface = model.Interface(foo_iface_uri)
128 try:
129 reader.update(iface, tmp.name)
130 assert False
131 except reader.InvalidInterface, ex:
132 assert 'main' in str(ex)
134 def testAttrs(self):
135 tmp = tempfile.NamedTemporaryFile(prefix = 'test-')
136 tmp.write(
137 """<?xml version="1.0" ?>
138 <interface last-modified="1110752708"
139 uri="%s"
140 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
141 <name>Foo</name>
142 <summary>Foo</summary>
143 <description>Foo</description>
144 <group main='bin/sh' foo='foovalue' xmlns:bobpre='http://bob' bobpre:bob='bobvalue'>
145 <implementation id='sha1=123' version='1' bobpre:bob='newbobvalue'/>
146 <implementation id='sha1=124' version='2' main='next'/>
147 </group>
148 </interface>""" % foo_iface_uri)
149 tmp.flush()
150 iface = model.Interface(foo_iface_uri)
151 reader.update(iface, tmp.name)
153 assert len(iface.implementations) == 2
155 assert iface.get_impl('sha1=123').metadata['foo'] == 'foovalue'
156 assert iface.get_impl('sha1=123').metadata['main'] == 'bin/sh'
157 assert iface.get_impl('sha1=123').metadata['http://bob bob'] == 'newbobvalue'
159 assert iface.get_impl('sha1=124').metadata['http://bob bob'] == 'bobvalue'
160 assert iface.get_impl('sha1=124').metadata['main'] == 'next'
162 suite = unittest.makeSuite(TestReader)
163 if __name__ == '__main__':
164 sys.argv.append('-v')
165 unittest.main()