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
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'>
17 <summary>for testing</summary>
18 <description>This is for testing.</description>
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')
37 class TestLocal(unittest
.TestCase
):
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
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
78 <requires interface='http://foo' meta='foo'/>
79 <implementation id='sha1=004' version='1'/>
82 <requires interface='http://foo'>
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
98 <implementation id='sha1=123' version='1'/>
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
116 <requires interface='http://foo'/>
117 <implementation id='sha1=002' version='2'/>
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
+ """
135 <requires interface='http://foo'>
136 <environment name='TESTING' value='true' mode='replace'/>
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
+ """
155 <requires interface='http://foo'>
156 <environment name='TESTING' value='true' mode='replace'/>
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
+ """
176 <requires interface='http://foo'>
177 <environment name='TESTING' value='true' mode='replace'/>
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
+ """
197 <requires interface='http://foo'>
198 <environment name='TESTING' value='true' mode='replace'/>
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"/>
225 <command name="run" path="0launch"/>
226 <implementation id="sha1new=7d1ecfbd76a42d56f029f9d0c72e4ac26c8561de" released="2011-07-23" version="1.2"/>
229 """ + footer
, local_file_zi13
)
230 doc
= minidom
.parseString(master_xml
)
232 n_groups
= len(doc
.getElementsByTagName("group"))
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'
261 result
= release
.set_attributes(local_data
, '0.3', id = 'sha1=98765', version
='3.7', main
= None)
263 except Exception, ex
:
264 assert str(ex
) == 'No implementations with version=0.3'
266 suite
= unittest
.makeSuite(TestLocal
)
267 if __name__
== '__main__':