Allow passing the location of pkgcache to DebianDistribution
[zeroinstall/zeroinstall-limyreth.git] / tests / testdistro.py
blobc2899023e391424b389359abddac553f650f3799
1 #!/usr/bin/env python
2 from basetest import BaseTest, empty_feed
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
10 def parse_impls(impls, test_distro):
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", test_distro)
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)
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)
41 self.assertEquals("2", cache.get("foo"))
43 src.write("hi")
44 src.flush()
46 self.assertEquals("2", cache.get("foo"))
48 # new cache...
49 cache = distro.Cache('test-cache', src.name)
50 self.assertEquals(None, cache.get("foo"))
52 finally:
53 src.close()
55 def factory(self, id):
56 impl = model.DistributionImplementation(self.feed, id)
57 assert id not in self.feed.implementations
58 self.feed.implementations[id] = impl
59 return impl
61 def testDefault(self):
62 host = distro.Distribution()
64 host.get_package_info('gimp', self.factory)
65 self.assertEquals(self.feed.implementations, {})
67 def testDebian(self):
68 dpkgdir = os.path.join(os.path.dirname(__file__), 'dpkg')
69 host = distro.DebianDistribution(
70 os.path.join(dpkgdir, 'status'),
71 os.path.join(dpkgdir, 'pkgcache.bin'))
73 self.assertEquals(2, len(host.versions))
75 host.get_package_info('gimp', self.factory)
76 self.assertEquals({}, self.feed.implementations)
78 host.get_package_info('python-bittorrent', self.factory)
79 self.assertEquals(2, len(self.feed.implementations))
80 bittorrent_installed = self.feed.implementations['package:deb:python-bittorrent:3.4.2-10']
81 bittorrent_uninstalled = self.feed.implementations['package:deb:python-bittorrent:3.4.2-11.1']
82 self.assertEquals('3.4.2-10', bittorrent_installed.get_version())
83 self.assertTrue(bittorrent_installed.installed)
84 self.assertFalse(bittorrent_uninstalled.installed)
85 self.assertEquals(None, bittorrent_installed.machine)
87 self.feed = model.ZeroInstallFeed(empty_feed, local_path = '/empty.xml')
88 host.get_package_info('libxcomposite-dev', self.factory)
89 self.assertEquals(1, len(self.feed.implementations))
90 libxcomposite = self.feed.implementations['package:deb:libxcomposite-dev:0.3.1-1']
91 self.assertEquals('0.3.1-1', libxcomposite.get_version())
92 self.assertEquals('i386', libxcomposite.machine)
94 def testRPM(self):
95 rpmdir = os.path.join(os.path.dirname(__file__), 'rpm')
96 os.environ['PATH'] = rpmdir + ':' + self.old_path
97 rpm = distro.RPMDistribution(os.path.join(rpmdir, 'status'))
99 self.assertEquals(2, len(rpm.versions))
101 rpm.get_package_info('yast2-update', self.factory)
102 self.assertEquals(1, len(self.feed.implementations))
103 yast = self.feed.implementations['package:rpm:yast2-update:2.15.23-21:i586']
104 self.assertEquals('2.15.23-21', yast.get_version())
105 self.assertEquals('*-i586', yast.arch)
107 impls = parse_impls("""
108 <package-implementation distributions="Debian" package="yast2-mail"/>
109 <package-implementation distributions="RPM" package="yast2-update"/>
110 """, rpm).implementations
111 assert len(impls) == 1, impls
112 impl, = impls
113 assert impl == 'package:rpm:yast2-update:2.15.23-21:i586'
115 impls = parse_impls("""
116 <package-implementation distributions="RPM" package="yast2-mail"/>
117 <package-implementation distributions="RPM" package="yast2-update"/>
118 """, rpm).implementations
119 assert len(impls) == 2, impls
121 impls = parse_impls("""
122 <package-implementation distributions="" package="yast2-mail"/>
123 <package-implementation package="yast2-update"/>
124 """, rpm).implementations
125 assert len(impls) == 2, impls
127 def testGentoo(self):
128 pkgdir = os.path.join(os.path.dirname(__file__), 'gentoo')
129 ebuilds = distro.GentooDistribution(pkgdir)
131 ebuilds.get_package_info('media-gfx/gimp', self.factory)
132 self.assertEquals({}, self.feed.implementations)
134 ebuilds.get_package_info('sys-apps/portage', self.factory)
135 self.assertEquals(1, len(self.feed.implementations))
136 impl = self.feed.implementations['package:gentoo:sys-apps/portage:2.1.7.16:x86_64']
137 self.assertEquals('2.1.7.16', impl.get_version())
139 ebuilds.get_package_info('sys-kernel/gentoo-sources', self.factory)
140 self.assertEquals(3, len(self.feed.implementations))
141 impl = self.feed.implementations['package:gentoo:sys-kernel/gentoo-sources:2.6.30-4:i686']
142 self.assertEquals('2.6.30-4', impl.get_version())
143 impl = self.feed.implementations['package:gentoo:sys-kernel/gentoo-sources:2.6.32:x86_64']
144 self.assertEquals('2.6.32', impl.get_version())
146 def testCleanVersion(self):
147 self.assertEquals('1', distro.try_cleanup_distro_version('1:0.3.1-1'))
148 self.assertEquals('0.3.1-1', distro.try_cleanup_distro_version('0.3.1-1ubuntu0'))
149 self.assertEquals('0.3-post1-rc2', distro.try_cleanup_distro_version('0.3-post1-rc2'))
150 self.assertEquals('0.3.1-2', distro.try_cleanup_distro_version('0.3.1-r2-r3'))
152 if __name__ == '__main__':
153 unittest.main()