Release 0.23
[0publish.git] / tests / testlocal.py
blobb52f93b4ae27f1ec4c19ae55a5049ff2d03e8d77
1 #!/usr/bin/env python
2 import sys, os, tempfile, StringIO
3 from zeroinstall.injector.namespaces import XMLNS_IFACE
4 from zeroinstall.injector.reader import InvalidInterface
5 from zeroinstall.injector import model, reader, qdom
6 import unittest
7 from xml.dom import minidom
9 sys.path.insert(0, '..')
11 import create, merge, release
13 header = """<?xml version="1.0" ?>
14 <interface xmlns="http://zero-install.sourceforge.net/2004/injector/interface"
15 uri='http://test/hello.xml'>
16 <name>test</name>
17 <summary>for testing</summary>
18 <description>This is for testing.</description>
19 """
20 footer = """
21 </interface>
22 """
24 def parse(xml):
25 stream = StringIO.StringIO(xml)
26 return model.ZeroInstallFeed(qdom.parse(stream))
28 local_file = os.path.join(os.path.dirname(__file__), 'local.xml')
29 local_file_req = os.path.join(os.path.dirname(__file__), 'local-req.xml')
30 local_file_command = os.path.join(os.path.dirname(__file__), 'local-command.xml')
31 local_file_zi13 = os.path.join(os.path.dirname(__file__), 'zeroinstall-injector-1.3.xml')
33 def tap(s):
34 #print s
35 return s
37 class TestLocal(unittest.TestCase):
38 def testCreate(self):
39 master = parse(create.create_from_local(local_file))
40 assert master.url == 'http://test/hello.xml', master
41 assert len(master.implementations) == 1
43 def testMergeFirst(self):
44 master = parse(merge.merge(header + footer, local_file))
45 assert master.url == 'http://test/hello.xml', master
46 assert len(master.implementations) == 1
48 def testMergeSecond(self):
49 master = parse(merge.merge(header + "<implementation id='sha1=123' version='1'/>" + footer, local_file))
50 assert master.url == 'http://test/hello.xml', master
51 assert len(master.implementations) == 2
53 def testMergeGroup(self):
54 master = parse(merge.merge(header + "<group>\n <implementation id='sha1=123' version='1'/>\n </group>" + footer, local_file))
55 assert master.url == 'http://test/hello.xml', master
56 assert len(master.implementations) == 2
57 assert master.implementations['sha1=002'].requires == []
59 def testMergeLocalReq(self):
60 master = parse(tap(merge.merge(header + "<group x='x'>\n <implementation id='sha1=123' version='1'/>\n </group>" + footer, local_file_req)))
61 assert master.url == 'http://test/hello.xml', master
62 assert len(master.implementations) == 2
63 deps = master.implementations['sha1=003'].requires
64 assert len(deps) == 1
65 assert deps[0].interface == 'http://foo', deps[0]
67 assert master.implementations['sha1=003'].metadata['http://mynamespace/foo bob'] == 'bob'
69 def testNotSubset(self):
70 master = parse(merge.merge(header + "<group a='a'>\n <implementation id='sha1=123' version='1'/>\n </group>" + footer, local_file))
71 assert master.url == 'http://test/hello.xml', master
72 assert len(master.implementations) == 2
73 assert master.implementations['sha1=123'].metadata.get('a', None) == 'a'
74 assert master.implementations['sha1=002'].metadata.get('a', None) == None
76 master = parse(merge.merge(header + """\n
77 <group>
78 <requires interface='http://foo' meta='foo'/>
79 <implementation id='sha1=004' version='1'/>
80 </group>
81 <group>
82 <requires interface='http://foo'>
83 <version before='1'/>
84 </requires>
85 <implementation id='sha1=001' version='1'/>
86 </group>""" + footer, local_file_req))
87 assert len(master.implementations['sha1=001'].requires[0].restrictions) == 1
88 assert len(master.implementations['sha1=003'].requires[0].restrictions) == 0
90 assert master.implementations['sha1=004'].requires[0].metadata.get('meta', None) == 'foo'
91 assert master.implementations['sha1=003'].requires[0].metadata.get('meta', None) == None
93 assert master.implementations['sha1=003'].main == 'hello'
95 def testMergeBest(self):
96 master_xml = merge.merge(header + """\n
97 <group>
98 <implementation id='sha1=123' version='1'/>
99 </group>
100 <group>
101 <requires interface='http://foo'/>
102 <implementation id='sha1=002' version='2'/>
103 </group>""" + footer, local_file_req)
104 master = parse(master_xml)
105 assert master.url == 'http://test/hello.xml', master
106 assert len(master.implementations) == 3
107 deps = master.implementations['sha1=003'].requires
108 assert len(deps) == 1
109 assert deps[0].interface == 'http://foo', deps[0]
111 assert len(minidom.parseString(master_xml).documentElement.getElementsByTagNameNS(XMLNS_IFACE, 'group')) == 2
113 # Again, but with the groups the other way around
114 master_xml = merge.merge(header + """\n
115 <group>
116 <requires interface='http://foo'/>
117 <implementation id='sha1=002' version='2'/>
118 </group>
119 <group>
120 <implementation id='sha1=123' version='1'/>
121 </group>""" + footer, local_file_req)
122 master = parse(master_xml)
123 assert master.url == 'http://test/hello.xml', master
124 assert len(master.implementations) == 3
125 deps = master.implementations['sha1=003'].requires
126 assert len(deps) == 1
127 assert deps[0].interface == 'http://foo', deps[0]
129 assert len(minidom.parseString(master_xml).documentElement.getElementsByTagNameNS(XMLNS_IFACE, 'group')) == 2
131 def testMergeCommand(self):
132 # We create a new group inside this one, sharing the <requires> and adding the <command>
133 master_xml = merge.merge(header + """
134 <group>
135 <requires interface='http://foo'>
136 <environment name='TESTING' value='true' mode='replace'/>
137 </requires>
138 <implementation id='sha1=002' version='2'/>
139 </group>""" + footer, local_file_command)
140 master = parse(master_xml)
141 assert master.url == 'http://test/hello.xml', master
142 assert len(master.implementations) == 2
143 commands = master.implementations['sha1=003'].commands
144 assert len(commands) == 1
145 assert commands['run'].path == 'run.sh', commands['run'].path
147 new_root = minidom.parseString(master_xml).documentElement
148 assert len(new_root.getElementsByTagNameNS(XMLNS_IFACE, 'group')) == 2
149 assert len(new_root.getElementsByTagNameNS(XMLNS_IFACE, 'requires')) == 1
150 assert len(new_root.getElementsByTagNameNS(XMLNS_IFACE, 'command')) == 1
152 # We create a new top-level group inside this one, as we can't share the test command
153 master_xml = merge.merge(header + """
154 <group>
155 <requires interface='http://foo'>
156 <environment name='TESTING' value='true' mode='replace'/>
157 </requires>
158 <command name='test' path='test.sh'/>
159 <implementation id='sha1=002' version='2'/>
160 </group>""" + footer, local_file_command)
161 master = parse(master_xml)
162 assert master.url == 'http://test/hello.xml', master
163 assert len(master.implementations) == 2
164 commands = master.implementations['sha1=003'].commands
165 assert len(commands) == 1
166 assert commands['run'].path == 'run.sh', commands['run'].path
168 new_root = minidom.parseString(master_xml).documentElement
169 assert len(new_root.getElementsByTagNameNS(XMLNS_IFACE, 'group')) == 2
170 assert len(new_root.getElementsByTagNameNS(XMLNS_IFACE, 'requires')) == 2
171 assert len(new_root.getElementsByTagNameNS(XMLNS_IFACE, 'command')) == 2
173 # We share the <requires> and override the <command>
174 master_xml = merge.merge(header + """
175 <group>
176 <requires interface='http://foo'>
177 <environment name='TESTING' value='true' mode='replace'/>
178 </requires>
179 <command name='run' path='old-run.sh'/>
180 <implementation id='sha1=002' version='2'/>
181 </group>""" + footer, local_file_command)
182 master = parse(master_xml)
183 assert master.url == 'http://test/hello.xml', master
184 assert len(master.implementations) == 2
185 commands = master.implementations['sha1=003'].commands
186 assert len(commands) == 1
187 assert commands['run'].path == 'run.sh', commands['run'].path
189 new_root = minidom.parseString(master_xml).documentElement
190 assert len(new_root.getElementsByTagNameNS(XMLNS_IFACE, 'group')) == 2
191 assert len(new_root.getElementsByTagNameNS(XMLNS_IFACE, 'requires')) == 1
192 assert len(new_root.getElementsByTagNameNS(XMLNS_IFACE, 'command')) == 2
194 # We share the <requires> and the <command>
195 master_xml = merge.merge(header + """
196 <group>
197 <requires interface='http://foo'>
198 <environment name='TESTING' value='true' mode='replace'/>
199 </requires>
200 <command name='run' path='run.sh'/>
201 <implementation id='sha1=002' version='2'/>
202 </group>""" + footer, local_file_command)
203 master = parse(master_xml)
204 assert master.url == 'http://test/hello.xml', master
205 assert len(master.implementations) == 2
206 commands = master.implementations['sha1=003'].commands
207 assert len(commands) == 1
208 assert commands['run'].path == 'run.sh', commands['run'].path
210 new_root = minidom.parseString(master_xml).documentElement
211 assert len(new_root.getElementsByTagNameNS(XMLNS_IFACE, 'group')) == 1
212 assert len(new_root.getElementsByTagNameNS(XMLNS_IFACE, 'requires')) == 1
213 assert len(new_root.getElementsByTagNameNS(XMLNS_IFACE, 'command')) == 1
215 def testMerge2(self):
216 master_xml = merge.merge(header + """
217 <group license="OSI Approved :: GNU Lesser General Public License (LGPL)" main="0launch">
218 <command name="run" path="0launch">
219 <runner interface="http://repo.roscidus.com/python/python">
220 <version before="3"/>
221 </runner>
222 </command>
224 <group>
225 <command name="run" path="0launch"/>
226 <implementation id="sha1new=7d1ecfbd76a42d56f029f9d0c72e4ac26c8561de" released="2011-07-23" version="1.2"/>
227 </group>
228 </group>
229 """ + footer, local_file_zi13)
230 doc = minidom.parseString(master_xml)
232 n_groups = len(doc.getElementsByTagName("group"))
233 assert n_groups == 2
235 def testLocalContext(self):
236 def get_context(xml_frag):
237 doc = minidom.parseString(header + xml_frag + footer)
238 impls = list(doc.getElementsByTagNameNS(XMLNS_IFACE, 'implementation'))
239 assert len(impls) == 1
240 return merge.Context(impls[0])
242 ctx = get_context("<implementation id='sha1=001' version='1'/>")
243 assert ctx.attribs[(None, 'id')] == 'sha1=001'
244 assert ctx.attribs[(None, 'version')] == '1'
246 ctx = get_context("<group t='t' x='1' y:z='2' xmlns:y='yns'><implementation id='sha1=001' version='1' t='r'/></group>")
247 assert ctx.attribs[(None, 'id')] == 'sha1=001'
248 assert ctx.attribs[(None, 'version')] == '1'
249 assert ctx.attribs[(None, 't')] == 'r'
250 assert ctx.attribs[(None, 'x')] == '1'
251 assert ctx.attribs[('yns', 'z')] == '2'
253 def testSetAtttibs(self):
254 local_data = open(local_file).read()
255 result = release.set_attributes(local_data, '0.2', id = 'sha1=98765', version='3.7', main = None)
256 feed = model.ZeroInstallFeed(qdom.parse(StringIO.StringIO(str(result))), "local.xml")
257 assert len(feed.implementations) == 1
258 assert feed.implementations['sha1=98765'].get_version() == '3.7'
260 try:
261 result = release.set_attributes(local_data, '0.3', id = 'sha1=98765', version='3.7', main = None)
262 assert 0
263 except Exception, ex:
264 assert str(ex) == 'No implementations with version=0.3'
266 suite = unittest.makeSuite(TestLocal)
267 if __name__ == '__main__':
268 unittest.main()