blob: e2e344637d73ba83bfb261651c40a9b16e405244 [file] [log] [blame]
#!/usr/bin/env python
"""
tests for mozfile
"""
import mozfile
import os
import shutil
import tarfile
import tempfile
import unittest
import zipfile
# stub file paths
files = [('foo.txt',),
('foo', 'bar.txt'),
('foo', 'bar', 'fleem.txt'),
('foobar', 'fleem.txt'),
('bar.txt')]
def create_stub():
"""create a stub directory"""
tempdir = tempfile.mkdtemp()
try:
for path in files:
fullpath = os.path.join(tempdir, *path)
dirname = os.path.dirname(fullpath)
if not os.path.exists(dirname):
os.makedirs(dirname)
contents = path[-1]
f = file(fullpath, 'w')
f.write(contents)
f.close()
return tempdir
except Exception, e:
try:
shutil.rmtree(tempdir)
except:
pass
raise e
class TestExtract(unittest.TestCase):
"""test extracting archives"""
def ensure_directory_contents(self, directory):
"""ensure the directory contents match"""
for f in files:
path = os.path.join(directory, *f)
exists = os.path.exists(path)
if not exists:
print "%s does not exist" % (os.path.join(f))
self.assertTrue(exists)
if exists:
contents = file(path).read().strip()
self.assertTrue(contents == f[-1])
def test_extract_zipfile(self):
"""test extracting a zipfile"""
_zipfile = self.create_zip()
self.assertTrue(os.path.exists(_zipfile))
try:
dest = tempfile.mkdtemp()
try:
mozfile.extract_zip(_zipfile, dest)
self.ensure_directory_contents(dest)
finally:
shutil.rmtree(dest)
finally:
os.remove(_zipfile)
def test_extract_tarball(self):
"""test extracting a tarball"""
tarball = self.create_tarball()
self.assertTrue(os.path.exists(tarball))
try:
dest = tempfile.mkdtemp()
try:
mozfile.extract_tarball(tarball, dest)
self.ensure_directory_contents(dest)
finally:
shutil.rmtree(dest)
finally:
os.remove(tarball)
def test_extract(self):
"""test the generalized extract function"""
# test extracting a tarball
tarball = self.create_tarball()
self.assertTrue(os.path.exists(tarball))
try:
dest = tempfile.mkdtemp()
try:
mozfile.extract(tarball, dest)
self.ensure_directory_contents(dest)
finally:
shutil.rmtree(dest)
finally:
os.remove(tarball)
# test extracting a zipfile
_zipfile = self.create_zip()
self.assertTrue(os.path.exists(_zipfile))
try:
dest = tempfile.mkdtemp()
try:
mozfile.extract_zip(_zipfile, dest)
self.ensure_directory_contents(dest)
finally:
shutil.rmtree(dest)
finally:
os.remove(_zipfile)
# test extracting some non-archive; this should fail
fd, filename = tempfile.mkstemp()
os.write(fd, 'This is not a zipfile or tarball')
os.close(fd)
exception = None
try:
dest = tempfile.mkdtemp()
mozfile.extract(filename, dest)
except Exception, exception:
pass
finally:
os.remove(filename)
os.rmdir(dest)
self.assertTrue(isinstance(exception, Exception))
### utility functions
def create_tarball(self):
"""create a stub tarball for testing"""
tempdir = create_stub()
filename = tempfile.mktemp(suffix='.tar')
archive = tarfile.TarFile(filename, mode='w')
try:
for path in files:
archive.add(os.path.join(tempdir, *path), arcname=os.path.join(*path))
except:
os.remove(archive)
raise
finally:
shutil.rmtree(tempdir)
archive.close()
return filename
def create_zip(self):
"""create a stub zipfile for testing"""
tempdir = create_stub()
filename = tempfile.mktemp(suffix='.zip')
archive = zipfile.ZipFile(filename, mode='w')
try:
for path in files:
archive.write(os.path.join(tempdir, *path), arcname=os.path.join(*path))
except:
os.remove(filename)
raise
finally:
shutil.rmtree(tempdir)
archive.close()
return filename
class TestRemoveTree(unittest.TestCase):
"""test our ability to remove a directory tree"""
def test_remove_directory(self):
tempdir = create_stub()
self.assertTrue(os.path.exists(tempdir))
self.assertTrue(os.path.isdir(tempdir))
try:
mozfile.rmtree(tempdir)
except:
shutil.rmtree(tempdir)
raise
self.assertFalse(os.path.exists(tempdir))
class TestNamedTemporaryFile(unittest.TestCase):
"""test our fix for NamedTemporaryFile"""
def test_named_temporary_file(self):
temp = mozfile.NamedTemporaryFile()
temp.write("A simple test")
del temp
if __name__ == '__main__':
unittest.main()