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
9 from zeroinstall
.support
import find_in_path
11 def skipIf(condition
, reason
):
12 def wrapped(underlying
):
14 print "Skipped %s: %s" % (underlying
.func_name
, reason
)
21 class AbstractTestUnpack():
25 self
.tmpdir
= tempfile
.mkdtemp('-testunpack')
30 BaseTest
.tearDown(self
)
32 support
.ro_rmtree(self
.tmpdir
)
34 assert os
.umask(0022) == 0022
38 unpack
.unpack_archive('ftp://foo/file.foo', file('HelloWorld.tgz'), self
.tmpdir
)
40 except SafeException
, ex
:
41 assert 'Unknown extension' in str(ex
)
44 unpack
.unpack_archive('ftp://foo/file.tgz', file('HelloWorld.tgz'), self
.tmpdir
)
45 self
.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
47 @skipIf(not find_in_path('hdiutil'), "not running on MacOS X; no hdiutil")
49 unpack
.unpack_archive('ftp://foo/file.dmg', file('HelloWorld.dmg'), self
.tmpdir
)
50 self
.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
53 unpack
.unpack_archive('ftp://foo/file.zip', file('HelloWorld.zip'), self
.tmpdir
)
54 self
.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
56 def testExtract(self
):
57 unpack
.unpack_archive('ftp://foo/file.tgz', file('HelloWorld.tgz'), self
.tmpdir
, extract
= 'HelloWorld')
58 self
.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
60 def testExtractOver(self
):
61 unpack
.unpack_archive_over('ftp://foo/file.tgz', file('HelloWorld.tgz'), self
.tmpdir
, extract
= 'HelloWorld')
62 self
.assert_manifest('sha1=491678c37f77fadafbaae66b13d48d237773a68f')
64 def testExtractZip(self
):
65 unpack
.unpack_archive('ftp://foo/file.zip', file('HelloWorld.zip'), self
.tmpdir
, extract
= 'HelloWorld')
66 self
.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
68 def testExtractIllegal(self
):
70 unpack
.unpack_archive('ftp://foo/file.tgz', file('HelloWorld.tgz'), self
.tmpdir
, extract
= 'Hello`World`')
72 except SafeException
, ex
:
73 assert 'Illegal' in str(ex
)
75 def testExtractFails(self
):
78 null
= os
.open('/dev/null', os
.O_WRONLY
)
82 unpack
.unpack_archive('ftp://foo/file.tgz', file('HelloWorld.tgz'), self
.tmpdir
, extract
= 'HelloWorld2')
84 except SafeException
, ex
:
85 if ('Failed to extract' not in str(ex
) and # GNU tar
86 'Unable to find' not in str(ex
)): # Python tar
92 unpack
.unpack_archive('ftp://foo/file.tar.GZ', file('HelloWorld.tgz'), self
.tmpdir
)
93 self
.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
96 unpack
.unpack_archive('ftp://foo/file.tar.bz2', file('HelloWorld.tar.bz2'), self
.tmpdir
)
97 self
.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
100 unpack
.unpack_archive('ftp://foo/file.tar', file('HelloWorld.tar'), self
.tmpdir
)
101 self
.assert_manifest('sha1new=290eb133e146635fe37713fd58174324a16d595f')
104 unpack
.unpack_archive('ftp://foo/file.rpm', file('dummy-1-1.noarch.rpm'), self
.tmpdir
)
105 self
.assert_manifest('sha1=7be9228c8fe2a1434d4d448c4cf130e3c8a4f53d')
108 unpack
.unpack_archive('ftp://foo/file.deb', file('dummy_1-1_all.deb'), self
.tmpdir
)
109 self
.assert_manifest('sha1new=2c725156ec3832b7980a3de2270b3d8d85d4e3ea')
111 def testSpecial(self
):
112 os
.chmod(self
.tmpdir
, 02755)
113 store
= Store(self
.tmpdir
)
114 store
.add_archive_to_cache('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a',
115 file('HelloWorld.tgz'),
116 'http://foo/foo.tgz')
119 logging
.getLogger('').setLevel(logging
.ERROR
)
121 store
= Store(self
.tmpdir
)
123 store
.add_archive_to_cache('sha1=3ce644dc725f1d21cfcf02562c76f375944b266b',
124 file('HelloWorld.tgz'),
125 'http://foo/foo.tgz')
130 logging
.getLogger('').setLevel(logging
.INFO
)
132 def assert_manifest(self
, required
):
133 alg_name
= required
.split('=', 1)[0]
134 manifest
.fixup_permissions(self
.tmpdir
)
135 sha1
= alg_name
+ '=' + manifest
.add_manifest_file(self
.tmpdir
, manifest
.get_algorithm(alg_name
)).hexdigest()
136 self
.assertEquals(sha1
, required
)
138 # Check permissions are sensible
139 for root
, dirs
, files
in os
.walk(self
.tmpdir
):
140 for f
in files
+ dirs
:
141 full
= os
.path
.join(root
, f
)
142 if os
.path
.islink(full
): continue
143 full_mode
= os
.stat(full
).st_mode
144 self
.assertEquals(0444, full_mode
& 0666) # Must be r-?r-?r-?
146 class TestUnpackPython(AbstractTestUnpack
, BaseTest
):
148 AbstractTestUnpack
.setUp(self
)
149 unpack
._tar
_version
= 'Solaris tar'
150 assert not unpack
._gnu
_tar
()
152 class TestUnpackGNU(AbstractTestUnpack
, BaseTest
):
154 AbstractTestUnpack
.setUp(self
)
155 unpack
._tar
_version
= None
156 assert unpack
._gnu
_tar
()
158 # Only available with GNU tar
160 unpack
.unpack_archive('ftp://foo/file.tar.lzma', file('HelloWorld.tar.lzma'), self
.tmpdir
)
161 self
.assert_manifest('sha1new=290eb133e146635fe37713fd58174324a16d595f')
163 if not unpack
._gnu
_tar
():
164 print "No GNU tar: SKIPPING tests"
165 del globals()['TestUnpackGNU']
167 if __name__
== '__main__':