2 from basetest
import BaseTest
3 from StringIO
import StringIO
7 sys
.path
.insert(0, '..')
8 from zeroinstall
.injector
import selections
, model
, reader
, policy
, iface_cache
, 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)
15 source
= iface_cache
.iface_cache
.get_interface('http://foo/Source.xml')
16 compiler
= iface_cache
.iface_cache
.get_interface('http://foo/Compiler.xml')
17 reader
.update(source
, 'Source.xml')
18 reader
.update(compiler
, 'Compiler.xml')
21 p
.network_use
= model
.network_full
23 #logging.getLogger().setLevel(logging.DEBUG)
24 assert p
.need_download()
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()]
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(1, len(dep
.bindings
))
56 self
.assertEquals(["sha1=345"], sels
[0].digests
)
58 s1
= selections
.Selections(p
)
59 s1
.selections
['http://foo/Source.xml'].attrs
['http://namespace foo'] = 'bar'
62 xml
= s1
.toDOM().toxml("utf-8")
63 root
= qdom
.parse(StringIO(xml
))
64 self
.assertEquals(namespaces
.XMLNS_IFACE
, root
.uri
)
66 s2
= selections
.Selections(root
)
69 def testLocalPath(self
):
70 # 0launch --get-selections Local.xml
71 iface
= os
.path
.join(mydir
, "Local.xml")
72 p
= policy
.Policy(iface
)
74 s1
= selections
.Selections(p
)
75 xml
= s1
.toDOM().toxml("utf-8")
77 # Reload selections and check they're the same
78 root
= qdom
.parse(StringIO(xml
))
79 s2
= selections
.Selections(root
)
80 local_path
= s2
.selections
[iface
].local_path
81 assert os
.path
.isdir(local_path
), local_path
82 assert not s2
.selections
[iface
].digests
, s2
.selections
[iface
].digests
84 # Add a newer implementation and try again
85 feed
= iface_cache
.iface_cache
.get_feed(iface
)
86 impl
= model
.ZeroInstallImplementation(feed
, "foo bar=123", local_path
= None)
87 impl
.version
= model
.parse_version('1.0')
88 impl
.commands
["run"] = model
.Command(qdom
.Element(namespaces
.XMLNS_IFACE
, 'command', {'path': 'dummy'}), None)
89 impl
.add_download_source('http://localhost/bar.tgz', 1000, None)
90 feed
.implementations
= {impl
.id: impl
}
91 assert p
.need_download()
92 assert p
.ready
, p
.solver
.get_failure_reason()
93 s1
= selections
.Selections(p
)
94 xml
= s1
.toDOM().toxml("utf-8")
95 root
= qdom
.parse(StringIO(xml
))
96 s2
= selections
.Selections(root
)
97 xml
= s2
.toDOM().toxml("utf-8")
98 qdom
.parse(StringIO(xml
))
99 assert s2
.selections
[iface
].local_path
is None
100 assert not s2
.selections
[iface
].digests
, s2
.selections
[iface
].digests
101 assert s2
.selections
[iface
].id == 'foo bar=123'
103 def testCommands(self
):
104 iface
= os
.path
.join(mydir
, "Command.xml")
105 p
= policy
.Policy(iface
)
109 impl
= p
.solver
.selections
[iface_cache
.iface_cache
.get_interface(iface
)]
110 assert impl
.id == 'c'
111 assert impl
.main
== 'runnable/missing'
113 dep_impl_uri
= impl
.commands
['run'].requires
[0].interface
114 dep_impl
= p
.solver
.selections
[iface_cache
.iface_cache
.get_interface(dep_impl_uri
)]
115 assert dep_impl
.id == 'sha1=256'
117 s1
= selections
.Selections(p
)
118 assert s1
.commands
[0].path
== 'runnable/missing'
119 xml
= s1
.toDOM().toxml("utf-8")
120 root
= qdom
.parse(StringIO(xml
))
121 s2
= selections
.Selections(root
)
123 assert s2
.commands
[0].path
== 'runnable/missing'
124 impl
= s2
.selections
[iface
]
125 assert impl
.id == 'c'
127 assert s2
.commands
[0].qdom
.attrs
['http://custom attr'] == 'namespaced'
128 custom_element
= s2
.commands
[0].qdom
.childNodes
[0]
129 assert custom_element
.name
== 'child'
131 dep_impl
= s2
.selections
[dep_impl_uri
]
132 assert dep_impl
.id == 'sha1=256'
134 if __name__
== '__main__':