Fixed typo in error message format string
[zeroinstall/solver.git] / tests / testunpack.py
blobfc20f345619dbe00d8208c8f1a3861f8454696eb
1 #!/usr/bin/env python2.5
2 from basetest import BaseTest
3 import sys, tempfile, os
4 import unittest, logging
6 sys.path.insert(0, '..')
7 from zeroinstall.zerostore import unpack, manifest, Store, BadDigest
8 from zeroinstall import SafeException, support
10 class AbstractTestUnpack(BaseTest):
11 def setUp(self):
12 BaseTest.setUp(self)
14 self.tmpdir = tempfile.mkdtemp('-testunpack')
16 os.umask(0022)
18 def tearDown(self):
19 BaseTest.tearDown(self)
21 support.ro_rmtree(self.tmpdir)
23 assert os.umask(0022) == 0022
25 def testBadExt(self):
26 try:
27 unpack.unpack_archive('ftp://foo/file.foo', file('HelloWorld.tgz'), self.tmpdir)
28 assert False
29 except SafeException, ex:
30 assert 'Unknown extension' in str(ex)
32 def testTgz(self):
33 unpack.unpack_archive('ftp://foo/file.tgz', file('HelloWorld.tgz'), self.tmpdir)
34 self.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
36 def testZip(self):
37 unpack.unpack_archive('ftp://foo/file.zip', file('HelloWorld.zip'), self.tmpdir)
38 self.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
40 def testExtract(self):
41 unpack.unpack_archive('ftp://foo/file.tgz', file('HelloWorld.tgz'), self.tmpdir, extract = 'HelloWorld')
42 self.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
44 def testExtractZip(self):
45 unpack.unpack_archive('ftp://foo/file.zip', file('HelloWorld.zip'), self.tmpdir, extract = 'HelloWorld')
46 self.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
48 def testExtractIllegal(self):
49 try:
50 unpack.unpack_archive('ftp://foo/file.tgz', file('HelloWorld.tgz'), self.tmpdir, extract = 'Hello`World`')
51 assert False
52 except SafeException, ex:
53 assert 'Illegal' in str(ex)
55 def testExtractFails(self):
56 stderr = os.dup(2)
57 try:
58 null = os.open('/dev/null', os.O_WRONLY)
59 os.close(2)
60 os.dup2(null, 2)
61 try:
62 unpack.unpack_archive('ftp://foo/file.tgz', file('HelloWorld.tgz'), self.tmpdir, extract = 'HelloWorld2')
63 assert False
64 except SafeException, ex:
65 if ('Failed to extract' not in str(ex) and # GNU tar
66 'Unable to find' not in str(ex)): # Python tar
67 raise ex
68 finally:
69 os.dup2(stderr, 2)
71 def testTargz(self):
72 unpack.unpack_archive('ftp://foo/file.tar.GZ', file('HelloWorld.tgz'), self.tmpdir)
73 self.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
75 def testTbz(self):
76 unpack.unpack_archive('ftp://foo/file.tar.bz2', file('HelloWorld.tar.bz2'), self.tmpdir)
77 self.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
79 def testTar(self):
80 unpack.unpack_archive('ftp://foo/file.tar', file('HelloWorld.tar'), self.tmpdir)
81 self.assert_manifest('sha1new=290eb133e146635fe37713fd58174324a16d595f')
83 def testRPM(self):
84 unpack.unpack_archive('ftp://foo/file.rpm', file('dummy-1-1.noarch.rpm'), self.tmpdir)
85 self.assert_manifest('sha1=7be9228c8fe2a1434d4d448c4cf130e3c8a4f53d')
87 def testDeb(self):
88 unpack.unpack_archive('ftp://foo/file.deb', file('dummy_1-1_all.deb'), self.tmpdir)
89 self.assert_manifest('sha1new=2c725156ec3832b7980a3de2270b3d8d85d4e3ea')
91 def testSpecial(self):
92 os.chmod(self.tmpdir, 02755)
93 store = Store(self.tmpdir)
94 store.add_archive_to_cache('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a',
95 file('HelloWorld.tgz'),
96 'http://foo/foo.tgz')
98 def testBad(self):
99 logging.getLogger('').setLevel(logging.ERROR)
101 store = Store(self.tmpdir)
102 try:
103 store.add_archive_to_cache('sha1=3ce644dc725f1d21cfcf02562c76f375944b266b',
104 file('HelloWorld.tgz'),
105 'http://foo/foo.tgz')
106 assert 0
107 except BadDigest:
108 pass
110 logging.getLogger('').setLevel(logging.INFO)
112 def assert_manifest(self, required):
113 alg_name = required.split('=', 1)[0]
114 manifest.fixup_permissions(self.tmpdir)
115 sha1 = alg_name + '=' + manifest.add_manifest_file(self.tmpdir, manifest.get_algorithm(alg_name)).hexdigest()
116 self.assertEquals(sha1, required)
118 # Check permissions are sensible
119 for root, dirs, files in os.walk(self.tmpdir):
120 for f in files + dirs:
121 full = os.path.join(root, f)
122 if os.path.islink(full): continue
123 full_mode = os.stat(full).st_mode
124 self.assertEquals(0444, full_mode & 0666) # Must be r-?r-?r-?
126 class TestUnpackPython(AbstractTestUnpack):
127 def setUp(self):
128 AbstractTestUnpack.setUp(self)
129 unpack._tar_version = 'Solaris tar'
130 assert not unpack._gnu_tar()
132 class TestUnpackGNU(AbstractTestUnpack):
133 def setUp(self):
134 AbstractTestUnpack.setUp(self)
135 unpack._tar_version = None
136 assert unpack._gnu_tar()
138 # Only available with GNU tar
139 def testLzma(self):
140 unpack.unpack_archive('ftp://foo/file.tar.lzma', file('HelloWorld.tar.lzma'), self.tmpdir)
141 self.assert_manifest('sha1new=290eb133e146635fe37713fd58174324a16d595f')
143 suite = unittest.TestSuite()
144 if unpack._gnu_tar():
145 suite.addTest(unittest.makeSuite(TestUnpackGNU))
146 else:
147 print "No GNU tar: SKIPPING tests"
148 suite.addTest(unittest.makeSuite(TestUnpackPython))
150 if __name__ == '__main__':
151 unittest.TextTestRunner(verbosity=2).run(suite)