Read min-version and max-version attributes on <requires> elements.
[zeroinstall.git] / tests / testreader.py
blobacb979ac8c2738e8bdf01e92f507d13670aea130
1 #!/usr/bin/env python2.3
2 import sys, tempfile, os, shutil, logging
3 from StringIO import StringIO
4 import unittest
5 from logging import getLogger, DEBUG, INFO
7 sys.path.insert(0, '..')
9 from zeroinstall import NeedDownload
10 from zeroinstall.injector import model, basedir, autopolicy, gpg, iface_cache, namespaces, reader
11 import data
12 reload(basedir)
14 foo_iface_uri = 'http://foo'
15 bar_iface_uri = 'http://localhost/bar'
17 logger = logging.getLogger()
19 config_home = tempfile.mktemp()
20 cache_home = tempfile.mktemp()
21 os.environ['XDG_CONFIG_HOME'] = config_home
22 os.environ['XDG_CACHE_HOME'] = cache_home
24 assert not os.path.exists(config_home)
26 class TestReader(unittest.TestCase):
27 def setUp(self):
28 assert not os.path.exists(config_home)
29 os.mkdir(config_home, 0700)
30 os.mkdir(cache_home, 0700)
31 if os.environ.has_key('DISPLAY'):
32 del os.environ['DISPLAY']
33 self.gnupg_home = tempfile.mktemp()
34 os.environ['GNUPGHOME'] = self.gnupg_home
35 os.mkdir(self.gnupg_home, 0700)
36 stream = tempfile.TemporaryFile()
37 stream.write(data.thomas_key)
38 stream.seek(0)
39 gpg.import_key(stream)
40 iface_cache.iface_cache._interfaces = {}
42 def tearDown(self):
43 shutil.rmtree(config_home)
44 shutil.rmtree(cache_home)
45 shutil.rmtree(self.gnupg_home)
47 def write_with_version(self, version):
48 tmp = tempfile.NamedTemporaryFile(prefix = 'test-')
49 tmp.write(
50 """<?xml version="1.0" ?>
51 <interface last-modified="1110752708"
52 uri="%s" %s
53 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
54 <name>Foo</name>
55 <summary>Foo</summary>
56 <description>Foo</description>
57 </interface>""" % (foo_iface_uri, version))
58 tmp.flush()
59 return tmp
61 def testNoVersion(self):
62 tmp = self.write_with_version('')
63 reader.check_readable(foo_iface_uri, tmp.name)
65 def testNewEnough(self):
66 tmp = self.write_with_version('min-injector-version="0.19"')
67 reader.check_readable(foo_iface_uri, tmp.name)
69 def testTooOld(self):
70 tmp = self.write_with_version('min-injector-version="1000"')
71 try:
72 reader.check_readable(foo_iface_uri, tmp.name)
73 except reader.InvalidInterface, ex:
74 assert "1000" in str(ex)
76 def testRequiresVersion(self):
77 tmp = tempfile.NamedTemporaryFile(prefix = 'test-')
78 tmp.write(
79 """<?xml version="1.0" ?>
80 <interface last-modified="1110752708"
81 uri="%s"
82 xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
83 <name>Foo</name>
84 <summary>Foo</summary>
85 <description>Foo</description>
86 <group>
87 <requires interface='%s' min-version='2.3.4' max-version='3.4.5'/>
88 <requires interface='%s2'/>
89 <implementation id='sha1=123' version='1'/>
90 </group>
91 </interface>""" % (foo_iface_uri, bar_iface_uri, bar_iface_uri))
92 tmp.flush()
93 iface = model.Interface(foo_iface_uri)
94 reader.update(iface, tmp.name)
95 impl = iface.implementations['sha1=123']
96 assert len(impl.dependencies) == 2
97 dep = impl.dependencies[bar_iface_uri]
98 assert dep.min_version == [2, 3, 4]
99 assert dep.max_version == [3, 4, 5]
100 dep2 = impl.dependencies[bar_iface_uri + '2']
101 assert dep2.min_version is None
102 assert dep2.max_version is None
103 str(dep)
104 str(dep2)
106 suite = unittest.makeSuite(TestReader)
107 if __name__ == '__main__':
108 sys.argv.append('-v')
109 unittest.main()