Start development series 0.18-post
[0publish.git] / tests / testlocal.py
blobce0e1a903650417e82fcd0ca5675280cd4492173
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 dom = minidom.parseString(xml)
26 uri = dom.documentElement.getAttribute('uri')
27 assert uri
29 tmp = tempfile.NamedTemporaryFile(prefix = 'test-')
30 try:
31 tmp.write(xml)
32 tmp.flush()
33 iface = model.Interface(uri)
34 reader.update(iface, tmp.name, local = True)
35 return iface
36 finally:
37 tmp.close()
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')
42 def tap(s):
43 #print s
44 return s
46 class TestLocal(unittest.TestCase):
47 def testCreate(self):
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
73 assert len(deps) == 1
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
86 <group>
87 <requires interface='http://foo' meta='foo'/>
88 <implementation id='sha1=004' version='1'/>
89 </group>
90 <group>
91 <requires interface='http://foo'>
92 <version before='1'/>
93 </requires>
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
106 <group>
107 <implementation id='sha1=123' version='1'/>
108 </group>
109 <group>
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
124 <group>
125 <requires interface='http://foo'/>
126 <implementation id='sha1=002' version='2'/>
127 </group>
128 <group>
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'
165 try:
166 result = release.set_attributes(local_data, '0.3', id = 'sha1=98765', version='3.7', main = None)
167 assert 0
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')
174 unittest.main()