Added self-test attribute to validator.
[0publish.git] / tests / testlocal.py
blob92d70554aa5a9a3c18f08a70441eba0ce448e790
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
6 import unittest
7 from xml.dom import minidom
9 sys.path.insert(0, '..')
11 import create, merge
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(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
73 assert len(deps) == 1
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
84 <group>
85 <requires interface='http://foo' meta='foo'/>
86 <implementation id='sha1=004' version='1'/>
87 </group>
88 <group>
89 <requires interface='http://foo'>
90 <version before='1'/>
91 </requires>
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
102 <group>
103 <implementation id='sha1=123' version='1'/>
104 </group>
105 <group>
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
120 <group>
121 <requires interface='http://foo'/>
122 <implementation id='sha1=002' version='2'/>
123 </group>
124 <group>
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')
157 unittest.main()