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 dom
= minidom
.parseString(xml
)
26 uri
= dom
.documentElement
.getAttribute('uri')
29 tmp
= tempfile
.NamedTemporaryFile(prefix
= 'test-')
33 iface
= model
.Interface(uri
)
34 reader
.update(iface
, tmp
.name
, local
= True)
39 local_file
= os
.path
.join(os
.path
.dirname(__file__
), 'local.xml')
40 local_file_req
= os
.path
.join(os
.path
.dirname(__file__
), 'local-req.xml')
46 class TestLocal(unittest
.TestCase
):
48 master
= parse(create
.create_from_local(local_file
))
49 assert master
.uri
== 'http://test/hello.xml', master
50 assert len(master
.implementations
) == 1
52 def testMergeFirst(self
):
53 master
= parse(merge
.merge(header
+ footer
, local_file
))
54 assert master
.uri
== 'http://test/hello.xml', master
55 assert len(master
.implementations
) == 1
57 def testMergeSecond(self
):
58 master
= parse(merge
.merge(header
+ "<implementation id='sha1=123' version='1'/>" + footer
, local_file
))
59 assert master
.uri
== 'http://test/hello.xml', master
60 assert len(master
.implementations
) == 2
62 def testMergeGroup(self
):
63 master
= parse(merge
.merge(header
+ "<group>\n <implementation id='sha1=123' version='1'/>\n </group>" + footer
, local_file
))
64 assert master
.uri
== 'http://test/hello.xml', master
65 assert len(master
.implementations
) == 2
66 assert master
.implementations
['sha1=002'].requires
== []
68 def testMergeLocalReq(self
):
69 master
= parse(tap(merge
.merge(header
+ "<group x='x'>\n <implementation id='sha1=123' version='1'/>\n </group>" + footer
, local_file_req
)))
70 assert master
.uri
== 'http://test/hello.xml', master
71 assert len(master
.implementations
) == 2
72 deps
= master
.implementations
['sha1=003'].requires
74 assert deps
[0].interface
== 'http://foo', deps
[0]
76 assert master
.implementations
['sha1=003'].metadata
['http://mynamespace/foo bob'] == 'bob'
78 def testNotSubset(self
):
79 master
= parse(merge
.merge(header
+ "<group a='a'>\n <implementation id='sha1=123' version='1'/>\n </group>" + footer
, local_file
))
80 assert master
.uri
== 'http://test/hello.xml', master
81 assert len(master
.implementations
) == 2
82 assert master
.implementations
['sha1=123'].metadata
.get('a', None) == 'a'
83 assert master
.implementations
['sha1=002'].metadata
.get('a', None) == None
85 master
= parse(merge
.merge(header
+ """\n
87 <requires interface='http://foo' meta='foo'/>
88 <implementation id='sha1=004' version='1'/>
91 <requires interface='http://foo'>
94 <implementation id='sha1=001' version='1'/>
95 </group>""" + footer
, local_file_req
))
96 assert len(master
.implementations
['sha1=001'].requires
[0].restrictions
) == 1
97 assert len(master
.implementations
['sha1=003'].requires
[0].restrictions
) == 0
99 assert master
.implementations
['sha1=004'].requires
[0].metadata
.get('meta', None) == 'foo'
100 assert master
.implementations
['sha1=003'].requires
[0].metadata
.get('meta', None) == None
102 assert master
.implementations
['sha1=003'].main
== 'hello'
104 def testMergeBest(self
):
105 master_xml
= merge
.merge(header
+ """\n
107 <implementation id='sha1=123' version='1'/>
110 <requires interface='http://foo'/>
111 <implementation id='sha1=002' version='2'/>
112 </group>""" + footer
, local_file_req
)
113 master
= parse(master_xml
)
114 assert master
.uri
== 'http://test/hello.xml', master
115 assert len(master
.implementations
) == 3
116 deps
= master
.implementations
['sha1=003'].requires
117 assert len(deps
) == 1
118 assert deps
[0].interface
== 'http://foo', deps
[0]
120 assert len(minidom
.parseString(master_xml
).documentElement
.getElementsByTagNameNS(XMLNS_IFACE
, 'group')) == 2
122 # Again, but with the groups the other way around
123 master_xml
= merge
.merge(header
+ """\n
125 <requires interface='http://foo'/>
126 <implementation id='sha1=002' version='2'/>
129 <implementation id='sha1=123' version='1'/>
130 </group>""" + footer
, local_file_req
)
131 master
= parse(master_xml
)
132 assert master
.uri
== 'http://test/hello.xml', master
133 assert len(master
.implementations
) == 3
134 deps
= master
.implementations
['sha1=003'].requires
135 assert len(deps
) == 1
136 assert deps
[0].interface
== 'http://foo', deps
[0]
138 assert len(minidom
.parseString(master_xml
).documentElement
.getElementsByTagNameNS(XMLNS_IFACE
, 'group')) == 2
140 def testLocalContext(self
):
141 def get_context(xml_frag
):
142 doc
= minidom
.parseString(header
+ xml_frag
+ footer
)
143 impls
= list(doc
.getElementsByTagNameNS(XMLNS_IFACE
, 'implementation'))
144 assert len(impls
) == 1
145 return merge
.Context(impls
[0])
147 ctx
= get_context("<implementation id='sha1=001' version='1'/>")
148 assert ctx
.attribs
[(None, 'id')] == 'sha1=001'
149 assert ctx
.attribs
[(None, 'version')] == '1'
151 ctx
= get_context("<group t='t' x='1' y:z='2' xmlns:y='yns'><implementation id='sha1=001' version='1' t='r'/></group>")
152 assert ctx
.attribs
[(None, 'id')] == 'sha1=001'
153 assert ctx
.attribs
[(None, 'version')] == '1'
154 assert ctx
.attribs
[(None, 't')] == 'r'
155 assert ctx
.attribs
[(None, 'x')] == '1'
156 assert ctx
.attribs
[('yns', 'z')] == '2'
158 def testSetAtttibs(self
):
159 local_data
= open(local_file
).read()
160 result
= release
.set_attributes(local_data
, '0.2', id = 'sha1=98765', version
='3.7', main
= None)
161 feed
= model
.ZeroInstallFeed(qdom
.parse(StringIO
.StringIO(str(result
))), "local.xml")
162 assert len(feed
.implementations
) == 1
163 assert feed
.implementations
['sha1=98765'].get_version() == '3.7'
166 result
= release
.set_attributes(local_data
, '0.3', id = 'sha1=98765', version
='3.7', main
= None)
168 except Exception, ex
:
169 assert str(ex
) == 'No implementations with version=0.3'
171 suite
= unittest
.makeSuite(TestLocal
)
172 if __name__
== '__main__':
173 sys
.argv
.append('-v')