#!/usr/bin/env python2.4 from basetest import BaseTest import sys, tempfile, os, shutil, logging from StringIO import StringIO import unittest from logging import getLogger, DEBUG, INFO sys.path.insert(0, '..') from zeroinstall import NeedDownload from zeroinstall.injector import model, basedir, autopolicy, gpg, iface_cache, namespaces, reader import data foo_iface_uri = 'http://foo' bar_iface_uri = 'http://localhost/bar' logger = logging.getLogger() class TestReader(BaseTest): def setUp(self): BaseTest.setUp(self) stream = tempfile.TemporaryFile() stream.write(data.thomas_key) stream.seek(0) gpg.import_key(stream) def write_with_version(self, version): tmp = tempfile.NamedTemporaryFile(prefix = 'test-') tmp.write( """ Foo Foo Foo """ % (foo_iface_uri, version)) tmp.flush() return tmp def testNoVersion(self): tmp = self.write_with_version('') reader.check_readable(foo_iface_uri, tmp.name) def testNewEnough(self): tmp = self.write_with_version('min-injector-version="0.19"') reader.check_readable(foo_iface_uri, tmp.name) def testTooOld(self): tmp = self.write_with_version('min-injector-version="1000"') try: reader.check_readable(foo_iface_uri, tmp.name) except reader.InvalidInterface, ex: assert "1000" in str(ex) def testRequiresVersion(self): tmp = tempfile.NamedTemporaryFile(prefix = 'test-') tmp.write( """ Foo Foo Foo """ % (foo_iface_uri, bar_iface_uri, bar_iface_uri)) tmp.flush() iface = model.Interface(foo_iface_uri) reader.update(iface, tmp.name) impl = iface.implementations['sha1=123'] assert len(impl.dependencies) == 2 dep = impl.dependencies[bar_iface_uri] assert len(dep.restrictions) == 1 res = dep.restrictions[0] assert res.not_before == [[2, 3, 4], 0] assert res.before == [[3, 4, 5], 0] dep2 = impl.dependencies[bar_iface_uri + '2'] assert len(dep2.restrictions) == 0 str(dep) str(dep2) assert dep.metadata.get('http://my/namespace foo') == 'test' assert dep.metadata.get('http://my/namespace food', None) == None def testBindings(self): tmp = tempfile.NamedTemporaryFile(prefix = 'test-') tmp.write( """ Foo Foo Foo """) tmp.flush() iface = model.Interface(foo_iface_uri) reader.update(iface, tmp.name, local = True) impl = iface.implementations['sha1=123'] assert len(impl.requires) == 1 dep = impl.requires[0] assert len(dep.bindings) == 4 for b in dep.bindings: self.assertEquals('PATH', b.name) self.assertEquals('bin', b.insert) self.assertEquals(model.EnvironmentBinding.PREPEND, dep.bindings[0].mode) self.assertEquals(model.EnvironmentBinding.PREPEND, dep.bindings[1].mode) self.assertEquals(model.EnvironmentBinding.APPEND, dep.bindings[2].mode) self.assertEquals(model.EnvironmentBinding.REPLACE, dep.bindings[3].mode) self.assertEquals(None, dep.bindings[1].default) self.assertEquals('/bin', dep.bindings[2].default) def testVersions(self): tmp = tempfile.NamedTemporaryFile(prefix = 'test-') tmp.write( """ Foo Foo Foo """ % foo_iface_uri) tmp.flush() iface = model.Interface(foo_iface_uri) reader.update(iface, tmp.name) impl = iface.implementations['sha1=123'] assert impl.version == [[1, 0], -1, [3], -2] def testAbsMain(self): tmp = tempfile.NamedTemporaryFile(prefix = 'test-') tmp.write( """ Foo Foo Foo """ % foo_iface_uri) tmp.flush() iface = model.Interface(foo_iface_uri) try: reader.update(iface, tmp.name) assert False except reader.InvalidInterface, ex: assert 'main' in str(ex) def testAttrs(self): tmp = tempfile.NamedTemporaryFile(prefix = 'test-') tmp.write( """ Foo Foo Foo """ % foo_iface_uri) tmp.flush() iface = model.Interface(foo_iface_uri) reader.update(iface, tmp.name) assert len(iface.implementations) == 2 assert iface.get_impl('sha1=123').metadata['foo'] == 'foovalue' assert iface.get_impl('sha1=123').metadata['main'] == 'bin/sh' assert iface.get_impl('sha1=123').metadata['http://bob bob'] == 'newbobvalue' assert iface.get_impl('sha1=124').metadata['http://bob bob'] == 'bobvalue' assert iface.get_impl('sha1=124').metadata['main'] == 'next' def testNative(self): tmp = tempfile.NamedTemporaryFile(prefix = 'test-') tmp.write( """ Foo Foo Foo """) tmp.flush() iface = model.Interface(foo_iface_uri) reader.update(iface, tmp.name, True) assert len(iface.implementations) == 1 impl = iface.implementations['package:deb:python-bittorrent:3.4.2-10'] assert impl.id == 'package:deb:python-bittorrent:3.4.2-10' assert impl.upstream_stability == model.packaged assert impl.user_stability == None assert impl.requires == [] assert impl.main == '/usr/bin/pbt' assert impl.metadata['foo'] == 'bar' assert impl.interface == iface suite = unittest.makeSuite(TestReader) if __name__ == '__main__': sys.argv.append('-v') unittest.main()