Added support for optional dependencies
[zeroinstall.git] / tests / testselections.py
blob643a58dac39b8a023cd0089ce447b9698b4743cb
1 #!/usr/bin/env python
2 from basetest import BaseTest
3 from StringIO import StringIO
4 import sys, os
5 import unittest
7 sys.path.insert(0, '..')
8 from zeroinstall.injector import selections, model, policy, namespaces, qdom
10 mydir = os.path.dirname(os.path.abspath(__file__))
12 class TestSelections(BaseTest):
13 def testSelections(self):
14 p = policy.Policy('http://foo/Source.xml', src = True, config = self.config)
15 source = self.config.iface_cache.get_interface('http://foo/Source.xml')
16 compiler = self.config.iface_cache.get_interface('http://foo/Compiler.xml')
17 self.import_feed(source.uri, 'Source.xml')
18 self.import_feed(compiler.uri, 'Compiler.xml')
20 p.freshness = 0
21 p.network_use = model.network_full
22 #import logging
23 #logging.getLogger().setLevel(logging.DEBUG)
24 assert p.need_download()
26 def assertSel(s):
27 self.assertEquals('http://foo/Source.xml', s.interface)
28 self.assertEquals(2, len(s.selections))
30 sels = [(sel.interface, sel) for sel in s.selections.values()]
31 sels.sort()
32 sels = [sel for uri,sel in sels]
34 self.assertEquals('http://foo/Compiler.xml', sels[0].interface)
35 self.assertEquals('http://foo/Source.xml', sels[1].interface)
37 self.assertEquals("sha1=345", sels[0].id)
38 self.assertEquals("1.0", sels[0].version)
40 self.assertEquals('sha1=234', sels[1].id)
41 self.assertEquals("1.0", sels[1].version)
42 self.assertEquals("bar", sels[1].attrs['http://namespace foo'])
43 self.assertEquals("1.0", sels[1].attrs['version'])
44 assert 'version-modifier' not in sels[1].attrs
46 self.assertEquals(0, len(sels[0].bindings))
47 self.assertEquals(0, len(sels[0].dependencies))
49 self.assertEquals(1, len(sels[1].bindings))
50 self.assertEquals('.', sels[1].bindings[0].insert)
52 self.assertEquals(1, len(sels[1].dependencies))
53 dep = sels[1].dependencies[0]
54 self.assertEquals('http://foo/Compiler.xml', dep.interface)
55 self.assertEquals(3, len(dep.bindings))
56 self.assertEquals('bin', dep.bindings[0].insert)
57 self.assertEquals('PATH', dep.bindings[0].name)
58 self.assertEquals('prepend', dep.bindings[0].mode)
60 self.assertEquals('bin', dep.bindings[1].value)
61 self.assertEquals('NO_PATH', dep.bindings[1].name)
63 self.assertEquals('bin', dep.bindings[2].insert)
64 self.assertEquals('BINDIR', dep.bindings[2].name)
65 self.assertEquals('replace', dep.bindings[2].mode)
67 self.assertEquals(["sha1=345"], sels[0].digests)
69 s1 = selections.Selections(p)
70 s1.selections['http://foo/Source.xml'].attrs['http://namespace foo'] = 'bar'
71 assertSel(s1)
73 xml = s1.toDOM().toxml("utf-8")
74 root = qdom.parse(StringIO(xml))
75 self.assertEquals(namespaces.XMLNS_IFACE, root.uri)
77 s2 = selections.Selections(root)
78 assertSel(s2)
80 def testLocalPath(self):
81 # 0launch --get-selections Local.xml
82 iface = os.path.join(mydir, "Local.xml")
83 p = policy.Policy(iface, config = self.config)
84 p.need_download()
85 assert p.ready
86 s1 = selections.Selections(p)
87 xml = s1.toDOM().toxml("utf-8")
89 # Reload selections and check they're the same
90 root = qdom.parse(StringIO(xml))
91 s2 = selections.Selections(root)
92 local_path = s2.selections[iface].local_path
93 assert os.path.isdir(local_path), local_path
94 assert not s2.selections[iface].digests, s2.selections[iface].digests
96 # Add a newer implementation and try again
97 feed = self.config.iface_cache.get_feed(iface)
98 impl = model.ZeroInstallImplementation(feed, "foo bar=123", local_path = None)
99 impl.version = model.parse_version('1.0')
100 impl.commands["run"] = model.Command(qdom.Element(namespaces.XMLNS_IFACE, 'command', {'path': 'dummy'}), None)
101 impl.add_download_source('http://localhost/bar.tgz', 1000, None)
102 feed.implementations = {impl.id: impl}
103 assert p.need_download()
104 assert p.ready, p.solver.get_failure_reason()
105 s1 = selections.Selections(p)
106 xml = s1.toDOM().toxml("utf-8")
107 root = qdom.parse(StringIO(xml))
108 s2 = selections.Selections(root)
109 xml = s2.toDOM().toxml("utf-8")
110 qdom.parse(StringIO(xml))
111 assert s2.selections[iface].local_path is None
112 assert not s2.selections[iface].digests, s2.selections[iface].digests
113 assert s2.selections[iface].id == 'foo bar=123'
115 def testCommands(self):
116 iface = os.path.join(mydir, "Command.xml")
117 p = policy.Policy(iface, config = self.config)
118 p.need_download()
119 assert p.ready
121 impl = p.solver.selections[self.config.iface_cache.get_interface(iface)]
122 assert impl.id == 'c'
123 assert impl.main == 'runnable/missing'
125 dep_impl_uri = impl.commands['run'].requires[0].interface
126 dep_impl = p.solver.selections[self.config.iface_cache.get_interface(dep_impl_uri)]
127 assert dep_impl.id == 'sha1=256'
129 s1 = selections.Selections(p)
130 assert s1.commands[0].path == 'runnable/missing'
131 xml = s1.toDOM().toxml("utf-8")
132 root = qdom.parse(StringIO(xml))
133 s2 = selections.Selections(root)
135 assert s2.commands[0].path == 'runnable/missing'
136 impl = s2.selections[iface]
137 assert impl.id == 'c'
139 assert s2.commands[0].qdom.attrs['http://custom attr'] == 'namespaced'
140 custom_element = s2.commands[0].qdom.childNodes[0]
141 assert custom_element.name == 'child'
143 dep_impl = s2.selections[dep_impl_uri]
144 assert dep_impl.id == 'sha1=256'
146 if __name__ == '__main__':
147 unittest.main()