1 #!/usr/bin/env python2.4
2 import sys
, os
, tempfile
3 from zeroinstall
.injector
.namespaces
import XMLNS_IFACE
4 from zeroinstall
.injector
.reader
import InvalidInterface
5 from zeroinstall
.injector
import model
, reader
7 from xml
.dom
import minidom
9 sys
.path
.insert(0, '..')
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(tap(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 def testNotSubset(self
):
77 master
= parse(tap(merge
.merge(header
+ "<group a='a'>\n <implementation id='sha1=123' version='1'/>\n </group>" + footer
, local_file
)))
78 assert master
.uri
== 'http://test/hello.xml', master
79 assert len(master
.implementations
) == 2
80 assert master
.implementations
['sha1=123'].metadata
.get('a', None) == 'a'
81 assert master
.implementations
['sha1=002'].metadata
.get('a', None) == None
83 master
= parse(tap(merge
.merge(header
+ """\n
85 <requires interface='http://foo' meta='foo'/>
86 <implementation id='sha1=004' version='1'/>
89 <requires interface='http://foo'>
92 <implementation id='sha1=001' version='1'/>
93 </group>""" + footer
, local_file_req
)))
94 assert len(master
.implementations
['sha1=001'].requires
[0].restrictions
) == 1
95 assert len(master
.implementations
['sha1=003'].requires
[0].restrictions
) == 0
97 assert master
.implementations
['sha1=004'].requires
[0].metadata
.get('meta', None) == 'foo'
98 assert master
.implementations
['sha1=003'].requires
[0].metadata
.get('meta', None) == None
100 def testMergeBest(self
):
101 master_xml
= tap(merge
.merge(header
+ """\n
103 <implementation id='sha1=123' version='1'/>
106 <requires interface='http://foo'/>
107 <implementation id='sha1=002' version='2'/>
108 </group>""" + footer
, local_file_req
))
109 master
= parse(master_xml
)
110 assert master
.uri
== 'http://test/hello.xml', master
111 assert len(master
.implementations
) == 3
112 deps
= master
.implementations
['sha1=003'].requires
113 assert len(deps
) == 1
114 assert deps
[0].interface
== 'http://foo', deps
[0]
116 assert len(minidom
.parseString(master_xml
).documentElement
.getElementsByTagNameNS(XMLNS_IFACE
, 'group')) == 2
118 # Again, but with the groups the other way around
119 master_xml
= tap(merge
.merge(header
+ """\n
121 <requires interface='http://foo'/>
122 <implementation id='sha1=002' version='2'/>
125 <implementation id='sha1=123' version='1'/>
126 </group>""" + footer
, local_file_req
))
127 master
= parse(master_xml
)
128 assert master
.uri
== 'http://test/hello.xml', master
129 assert len(master
.implementations
) == 3
130 deps
= master
.implementations
['sha1=003'].requires
131 assert len(deps
) == 1
132 assert deps
[0].interface
== 'http://foo', deps
[0]
134 assert len(minidom
.parseString(master_xml
).documentElement
.getElementsByTagNameNS(XMLNS_IFACE
, 'group')) == 2
136 def testLocalContext(self
):
137 def get_context(xml_frag
):
138 doc
= minidom
.parseString(header
+ xml_frag
+ footer
)
139 impls
= list(doc
.getElementsByTagNameNS(XMLNS_IFACE
, 'implementation'))
140 assert len(impls
) == 1
141 return merge
.Context(impls
[0])
143 ctx
= get_context("<implementation id='sha1=001' version='1'/>")
144 assert ctx
.attribs
[(None, 'id')] == 'sha1=001'
145 assert ctx
.attribs
[(None, 'version')] == '1'
147 ctx
= get_context("<group t='t' x='1' y:z='2' xmlns:y='foo'><implementation id='sha1=001' version='1' t='r'/></group>")
148 assert ctx
.attribs
[(None, 'id')] == 'sha1=001'
149 assert ctx
.attribs
[(None, 'version')] == '1'
150 assert ctx
.attribs
[(None, 't')] == 'r'
151 assert ctx
.attribs
[(None, 'x')] == '1'
152 assert ctx
.attribs
[('foo', 'z')] == '2'
154 suite
= unittest
.makeSuite(TestLocal
)
155 if __name__
== '__main__':
156 sys
.argv
.append('-v')