1 #!/usr/bin/env python2.3
2 from basetest
import BaseTest
3 import sys
, tempfile
, os
, shutil
, sha
6 sys
.path
.insert(0, '..')
7 from zeroinstall
.zerostore
import unpack
, manifest
8 from zeroinstall
import SafeException
10 class AbstractTestUnpack(BaseTest
):
14 self
.tmpdir
= tempfile
.mkdtemp('-testunpack')
19 BaseTest
.tearDown(self
)
21 self
.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')
36 def testExtract(self
):
37 unpack
.unpack_archive('ftp://foo/file.tgz', file('HelloWorld.tgz'), self
.tmpdir
, extract
= 'HelloWorld')
38 self
.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
40 def testExtractIllegal(self
):
42 unpack
.unpack_archive('ftp://foo/file.tgz', file('HelloWorld.tgz'), self
.tmpdir
, extract
= 'Hello`World`')
44 except SafeException
, ex
:
45 assert 'Illegal' in str(ex
)
47 def testExtractFails(self
):
50 null
= os
.open('/dev/null', os
.O_RDONLY
)
54 unpack
.unpack_archive('ftp://foo/file.tgz', file('HelloWorld.tgz'), self
.tmpdir
, extract
= 'HelloWorld2')
56 except SafeException
, ex
:
57 if ('Failed to extract' not in str(ex
) and # GNU tar
58 'Unable to find' not in str(ex
)): # Python tar
64 unpack
.unpack_archive('ftp://foo/file.tar.GZ', file('HelloWorld.tgz'), self
.tmpdir
)
65 self
.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
68 unpack
.unpack_archive('ftp://foo/file.tar.bz2', file('HelloWorld.tar.bz2'), self
.tmpdir
)
69 self
.assert_manifest('sha1=3ce644dc725f1d21cfcf02562c76f375944b266a')
72 unpack
.unpack_archive('ftp://foo/file.tar', file('HelloWorld.tar'), self
.tmpdir
)
73 self
.assert_manifest('sha1new=290eb133e146635fe37713fd58174324a16d595f')
76 unpack
.unpack_archive('ftp://foo/file.rpm', file('dummy-1-1.noarch.rpm'), self
.tmpdir
)
77 self
.assert_manifest('sha1=7be9228c8fe2a1434d4d448c4cf130e3c8a4f53d')
80 unpack
.unpack_archive('ftp://foo/file.deb', file('dummy_1-1_all.deb'), self
.tmpdir
)
81 self
.assert_manifest('sha1new=2c725156ec3832b7980a3de2270b3d8d85d4e3ea')
83 def assert_manifest(self
, required
):
84 alg_name
= required
.split('=', 1)[0]
85 manifest
.fixup_permissions(self
.tmpdir
)
86 sha1
= alg_name
+ '=' + manifest
.add_manifest_file(self
.tmpdir
, manifest
.get_algorithm(alg_name
)).hexdigest()
87 self
.assertEquals(sha1
, required
)
89 # Check permissions are sensible
90 for root
, dirs
, files
in os
.walk(self
.tmpdir
):
91 for f
in files
+ dirs
:
92 full
= os
.path
.join(root
, f
)
93 if os
.path
.islink(full
): continue
94 full_mode
= os
.stat(full
).st_mode
95 self
.assertEquals(0444, full_mode
& 0666) # Must be r-?r-?r-?
97 class TestUnpackPython(AbstractTestUnpack
):
99 AbstractTestUnpack
.setUp(self
)
100 unpack
._tar
_version
= 'Solaris tar'
101 assert not unpack
._gnu
_tar
()
103 class TestUnpackGNU(AbstractTestUnpack
):
105 AbstractTestUnpack
.setUp(self
)
106 unpack
._tar
_version
= None
107 assert unpack
._gnu
_tar
()
109 suite
= unittest
.TestSuite()
110 if unpack
._gnu
_tar
():
111 suite
.addTest(unittest
.makeSuite(TestUnpackGNU
))
113 print "No GNU tar: SKIPPING tests"
114 suite
.addTest(unittest
.makeSuite(TestUnpackPython
))
116 if __name__
== '__main__':
117 unittest
.TextTestRunner(verbosity
=2).run(suite
)