Propagate errors correctly from Selections.download_missing()
[zeroinstall/zeroinstall-afb.git] / tests / testdistro.py
blobd614ea227a42811a376cb73d6e6a6fe1f3386bd6
1 #!/usr/bin/env python
2 from basetest import BaseTest, empty_feed, DummyPackageKit
3 import sys, os, tempfile
4 from StringIO import StringIO
5 import unittest
7 sys.path.insert(0, '..')
8 from zeroinstall.injector import distro, model, qdom, iface_cache, handler
10 def parse_impls(impls):
11 xml = """<?xml version="1.0" ?>
12 <interface xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
13 <name>Foo</name>
14 <summary>Foo</summary>
15 <description>Foo</description>
17 </interface>""" % impls
18 element = qdom.parse(StringIO(xml))
19 return model.ZeroInstallFeed(element, "myfeed.xml")
21 class TestDistro(BaseTest):
22 def setUp(self):
23 BaseTest.setUp(self)
24 self.feed = model.ZeroInstallFeed(empty_feed, local_path = '/empty.xml')
26 def tearDown(self):
27 BaseTest.tearDown(self)
29 def testCache(self):
30 src = tempfile.NamedTemporaryFile()
31 try:
32 cache = distro.Cache('test-cache', src.name, 1)
33 self.assertEquals(None, cache.get("foo"))
34 cache.put("foo", "1")
35 self.assertEquals("1", cache.get("foo"))
36 cache.put("foo", "2")
37 self.assertEquals("2", cache.get("foo"))
39 # new cache...
40 cache = distro.Cache('test-cache', src.name, 1)
41 self.assertEquals("2", cache.get("foo"))
43 src.write("hi")
44 src.flush()
46 self.assertEquals(None, cache.get("foo"))
47 cache.put("foo", "3")
49 # new cache... (format change)
50 cache = distro.Cache('test-cache', src.name, 2)
51 self.assertEquals(None, cache.get("foo"))
53 finally:
54 src.close()
56 def make_factory(self, distro):
57 def factory(id):
58 impl = model.DistributionImplementation(self.feed, id, distro)
59 assert id not in self.feed.implementations
60 self.feed.implementations[id] = impl
61 return impl
62 return factory
64 def testDefault(self):
65 host = distro.Distribution()
67 factory = self.make_factory(host)
68 host.get_package_info('gimp', factory)
69 self.assertEquals(self.feed.implementations, {})
71 def testDebian(self):
72 dpkgdir = os.path.join(os.path.dirname(__file__), 'dpkg')
73 host = distro.DebianDistribution(
74 os.path.join(dpkgdir, 'status'),
75 os.path.join(dpkgdir, 'pkgcache.bin'))
76 host._packagekit = DummyPackageKit()
78 factory = self.make_factory(host)
79 host.get_package_info('gimp', factory)
80 self.assertEquals({}, self.feed.implementations)
82 # Initially, we only get information about the installed version...
83 host.get_package_info('python-bittorrent', factory)
84 self.assertEquals(1, len(self.feed.implementations))
86 # Tell distro to fetch information about candidates...
87 master_feed = parse_impls("""<package-implementation package='python-bittorrent'/>""")
88 h = handler.Handler()
89 candidates = host.fetch_candidates(master_feed)
90 if candidates:
91 h.wait_for_blocker(candidates)
92 # Now we see the uninstalled package
93 self.feed = model.ZeroInstallFeed(empty_feed, local_path = '/empty.xml')
94 host.get_package_info('python-bittorrent', factory)
95 self.assertEquals(2, len(self.feed.implementations))
97 self.assertEquals(2, len(self.feed.implementations))
98 bittorrent_installed = self.feed.implementations['package:deb:python-bittorrent:3.4.2-10']
99 bittorrent_uninstalled = self.feed.implementations['package:deb:python-bittorrent:3.4.2-11.1']
100 self.assertEquals('3.4.2-10', bittorrent_installed.get_version())
101 self.assertTrue(bittorrent_installed.installed)
102 self.assertFalse(bittorrent_uninstalled.installed)
103 self.assertEquals(None, bittorrent_installed.machine)
105 self.feed = model.ZeroInstallFeed(empty_feed, local_path = '/empty.xml')
106 host.get_package_info('libxcomposite-dev', factory)
107 self.assertEquals(1, len(self.feed.implementations))
108 libxcomposite = self.feed.implementations['package:deb:libxcomposite-dev:0.3.1-1']
109 self.assertEquals('0.3.1-1', libxcomposite.get_version())
110 self.assertEquals('i386', libxcomposite.machine)
112 def testRPM(self):
113 rpmdir = os.path.join(os.path.dirname(__file__), 'rpm')
114 os.environ['PATH'] = rpmdir + ':' + self.old_path
115 rpm = distro.RPMDistribution(os.path.join(rpmdir, 'status'))
117 self.assertEquals(2, len(rpm.versions))
119 factory = self.make_factory(rpm)
120 rpm.get_package_info('yast2-update', factory)
121 self.assertEquals(1, len(self.feed.implementations))
122 yast = self.feed.implementations['package:rpm:yast2-update:2.15.23-21:i586']
123 self.assertEquals('2.15.23-21', yast.get_version())
124 self.assertEquals('*-i586', yast.arch)
126 icache = iface_cache.IfaceCache(distro = rpm)
128 feed = parse_impls("""
129 <package-implementation distributions="Debian" package="yast2-mail"/>
130 <package-implementation distributions="RPM" package="yast2-update"/>
131 """)
132 icache._feeds[feed.url] = feed
133 distro_feed_url = feed.get_distro_feed()
134 impls = icache.get_feed(distro_feed_url).implementations
135 self.assertEquals("distribution:myfeed.xml", distro_feed_url)
136 assert len(impls) == 1, impls
137 impl, = impls
138 assert impl == 'package:rpm:yast2-update:2.15.23-21:i586'
140 feed = parse_impls("""
141 <package-implementation distributions="RPM" package="yast2-mail"/>
142 <package-implementation distributions="RPM" package="yast2-update"/>
143 """)
144 icache._feeds[feed.url] = feed
145 del icache._feeds['distribution:' + feed.url]
146 impls = icache.get_feed(feed.get_distro_feed()).implementations
147 assert len(impls) == 2, impls
149 feed = parse_impls("""
150 <package-implementation distributions="" package="yast2-mail"/>
151 <package-implementation package="yast2-update"/>
152 """)
153 icache._feeds[feed.url] = feed
154 del icache._feeds['distribution:' + feed.url]
155 impls = icache.get_feed(feed.get_distro_feed()).implementations
156 assert len(impls) == 2, impls
158 def testSlack(self):
159 slackdir = os.path.join(os.path.dirname(__file__), 'slack')
160 slack = distro.SlackDistribution(os.path.join(slackdir, 'packages'))
162 factory = self.make_factory(slack)
163 slack.get_package_info('gimp', factory)
164 self.assertEquals({}, self.feed.implementations)
166 slack.get_package_info('infozip', factory)
167 self.assertEquals(1, len(self.feed.implementations))
168 zip = self.feed.implementations['package:slack:infozip:5.52-2:i486']
169 self.assertEquals('5.52-2', zip.get_version())
170 self.assertEquals('i486', zip.machine)
172 def testGentoo(self):
173 pkgdir = os.path.join(os.path.dirname(__file__), 'gentoo')
174 ebuilds = distro.GentooDistribution(pkgdir)
176 factory = self.make_factory(ebuilds)
177 ebuilds.get_package_info('media-gfx/gimp', factory)
178 self.assertEquals({}, self.feed.implementations)
180 ebuilds.get_package_info('sys-apps/portage', factory)
181 self.assertEquals(1, len(self.feed.implementations))
182 impl = self.feed.implementations['package:gentoo:sys-apps/portage:2.1.7.16:x86_64']
183 self.assertEquals('2.1.7.16', impl.get_version())
184 self.assertEquals('x86_64', impl.machine)
186 ebuilds.get_package_info('sys-kernel/gentoo-sources', factory)
187 self.assertEquals(3, len(self.feed.implementations))
188 impl = self.feed.implementations['package:gentoo:sys-kernel/gentoo-sources:2.6.30-4:i686']
189 self.assertEquals('2.6.30-4', impl.get_version())
190 self.assertEquals('i686', impl.machine)
191 impl = self.feed.implementations['package:gentoo:sys-kernel/gentoo-sources:2.6.32:x86_64']
192 self.assertEquals('2.6.32', impl.get_version())
193 self.assertEquals('x86_64', impl.machine)
195 ebuilds.get_package_info('app-emulation/emul-linux-x86-baselibs', factory)
196 self.assertEquals(4, len(self.feed.implementations))
197 impl = self.feed.implementations['package:gentoo:app-emulation/emul-linux-x86-baselibs:20100220:i386']
198 self.assertEquals('20100220', impl.get_version())
199 self.assertEquals('i386', impl.machine)
201 def testPorts(self):
202 pkgdir = os.path.join(os.path.dirname(__file__), 'ports')
203 ports = distro.PortsDistribution(pkgdir)
205 factory = self.make_factory(ports)
206 ports.get_package_info('zeroinstall-injector', factory)
207 self.assertEquals(1, len(self.feed.implementations))
208 impl = self.feed.implementations['package:ports:zeroinstall-injector:0.41:x86_64']
209 self.assertEquals('0.41', impl.get_version())
210 self.assertEquals('x86_64', impl.machine)
212 def testCleanVersion(self):
213 self.assertEquals('0.3.1-1', distro.try_cleanup_distro_version('1:0.3.1-1'))
214 self.assertEquals('0.3.1-1', distro.try_cleanup_distro_version('0.3.1-1ubuntu0'))
215 self.assertEquals('0.3-post1-rc2', distro.try_cleanup_distro_version('0.3-post1-rc2'))
216 self.assertEquals('0.3.1-2', distro.try_cleanup_distro_version('0.3.1-r2-r3'))
218 if __name__ == '__main__':
219 unittest.main()