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
):
14 self
.tmpdir
= tempfile
.mkdtemp('-testunpack')
19 BaseTest
.tearDown(self
)
21 support
.ro_rmtree(self
.tmpdir
)
23 assert os
.umask(0022) == 0022
27 unpack
.unpack_archive('ftp://foo/file.foo', file('HelloWorld.tgz'), self
.tmpdir
)
29 except SafeException
, ex
:
30 assert 'Unknown extension' in str(ex
)
33 unpack
.unpack_archive('ftp://foo/file.tgz', file('HelloWorld.tgz'), self
.tmpdir
)
34 self
.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
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
):
50 unpack
.unpack_archive('ftp://foo/file.tgz', file('HelloWorld.tgz'), self
.tmpdir
, extract
= 'Hello`World`')
52 except SafeException
, ex
:
53 assert 'Illegal' in str(ex
)
55 def testExtractFails(self
):
58 null
= os
.open('/dev/null', os
.O_WRONLY
)
62 unpack
.unpack_archive('ftp://foo/file.tgz', file('HelloWorld.tgz'), self
.tmpdir
, extract
= 'HelloWorld2')
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
72 unpack
.unpack_archive('ftp://foo/file.tar.GZ', file('HelloWorld.tgz'), self
.tmpdir
)
73 self
.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
76 unpack
.unpack_archive('ftp://foo/file.tar.bz2', file('HelloWorld.tar.bz2'), self
.tmpdir
)
77 self
.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
80 unpack
.unpack_archive('ftp://foo/file.tar', file('HelloWorld.tar'), self
.tmpdir
)
81 self
.assert_manifest('sha1new=290eb133e146635fe37713fd58174324a16d595f')
84 unpack
.unpack_archive('ftp://foo/file.rpm', file('dummy-1-1.noarch.rpm'), self
.tmpdir
)
85 self
.assert_manifest('sha1=7be9228c8fe2a1434d4d448c4cf130e3c8a4f53d')
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'),
99 logging
.getLogger('').setLevel(logging
.ERROR
)
101 store
= Store(self
.tmpdir
)
103 store
.add_archive_to_cache('sha1=3ce644dc725f1d21cfcf02562c76f375944b266b',
104 file('HelloWorld.tgz'),
105 'http://foo/foo.tgz')
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
):
128 AbstractTestUnpack
.setUp(self
)
129 unpack
._tar
_version
= 'Solaris tar'
130 assert not unpack
._gnu
_tar
()
132 class TestUnpackGNU(AbstractTestUnpack
):
134 AbstractTestUnpack
.setUp(self
)
135 unpack
._tar
_version
= None
136 assert unpack
._gnu
_tar
()
138 # Only available with GNU tar
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
))
147 print "No GNU tar: SKIPPING tests"
148 suite
.addTest(unittest
.makeSuite(TestUnpackPython
))
150 if __name__
== '__main__':
151 unittest
.TextTestRunner(verbosity
=2).run(suite
)