Charmed-Kubernetes/nrpe/mod/charmhelpers/tests/payload/test_archive.py

138 lines
5.1 KiB
Python

import os
from testtools import TestCase
from mock import (
patch,
MagicMock,
)
from charmhelpers.payload import archive
from tempfile import mkdtemp
from shutil import rmtree
import subprocess
class ArchiveTestCase(TestCase):
def create_archive(self, format):
workdir = mkdtemp()
if format == "tar":
workfile = "{}/foo.tar.gz".format(workdir)
cmd = "tar czf {} hosts".format(workfile)
elif format == "zip":
workfile = "{}/foo.zip".format(workdir)
cmd = "zip {} hosts".format(workfile)
curdir = os.getcwd()
os.chdir("/etc")
subprocess.check_output(cmd, shell=True)
os.chdir(curdir)
self.addCleanup(rmtree, workdir)
return (workfile, ["hosts"])
@patch('os.path.isfile')
def test_gets_archive_handler_by_ext(self, _isfile):
tar_archive_handler = archive.extract_tarfile
zip_archive_handler = archive.extract_zipfile
_isfile.return_value = False
for ext in ('tar', 'tar.gz', 'tgz', 'tar.bz2', 'tbz2', 'tbz'):
handler = archive.get_archive_handler("somefile.{}".format(ext))
msg = "handler for extension: {}".format(ext)
self.assertEqual(handler, tar_archive_handler, msg)
for ext in ('zip', 'jar'):
handler = archive.get_archive_handler("somefile.{}".format(ext))
msg = "handler for extension {}".format(ext)
self.assertEqual(handler, zip_archive_handler, msg)
@patch('zipfile.is_zipfile')
@patch('tarfile.is_tarfile')
@patch('os.path.isfile')
def test_gets_archive_hander_by_filetype(self, _isfile, _istarfile,
_iszipfile):
tar_archive_handler = archive.extract_tarfile
zip_archive_handler = archive.extract_zipfile
_isfile.return_value = True
_istarfile.return_value = True
_iszipfile.return_value = False
handler = archive.get_archive_handler("foo")
self.assertEqual(handler, tar_archive_handler)
_istarfile.return_value = False
_iszipfile.return_value = True
handler = archive.get_archive_handler("foo")
self.assertEqual(handler, zip_archive_handler)
@patch('charmhelpers.core.hookenv.charm_dir')
def test_gets_archive_dest_default(self, _charmdir):
_charmdir.return_value = "foo"
thedir = archive.archive_dest_default("baz")
self.assertEqual(thedir, os.path.join("foo", "archives", "baz"))
thedir = archive.archive_dest_default("baz/qux")
self.assertEqual(thedir, os.path.join("foo", "archives", "qux"))
def test_extracts_tarfile(self):
destdir = mkdtemp()
self.addCleanup(rmtree, destdir)
tar_file, contents = self.create_archive("tar")
archive.extract_tarfile(tar_file, destdir)
for path in [os.path.join(destdir, item) for item in contents]:
self.assertTrue(os.path.exists(path))
def test_extracts_zipfile(self):
destdir = mkdtemp()
self.addCleanup(rmtree, destdir)
try:
zip_file, contents = self.create_archive("zip")
except subprocess.CalledProcessError as e:
if e.returncode == 127:
self.skip("Skipping - zip is not installed")
else:
raise
archive.extract_zipfile(zip_file, destdir)
for path in [os.path.join(destdir, item) for item in contents]:
self.assertTrue(os.path.exists(path))
@patch('charmhelpers.core.host.mkdir')
@patch('charmhelpers.payload.archive.get_archive_handler')
@patch('charmhelpers.payload.archive.archive_dest_default')
def test_extracts(self, _defdest, _gethandler, _mkdir):
archive_name = "foo"
archive_handler = MagicMock()
_gethandler.return_value = archive_handler
dest = archive.extract(archive_name, "bar")
_gethandler.assert_called_with(archive_name)
archive_handler.assert_called_with(archive_name, "bar")
_defdest.assert_not_called()
_mkdir.assert_called_with("bar")
self.assertEqual(dest, "bar")
@patch('charmhelpers.core.host.mkdir')
@patch('charmhelpers.payload.archive.get_archive_handler')
def test_unhandled_extract_raises_exc(self, _gethandler, _mkdir):
archive_name = "foo"
_gethandler.return_value = None
self.assertRaises(archive.ArchiveError, archive.extract,
archive_name)
_gethandler.assert_called_with(archive_name)
_mkdir.assert_not_called()
@patch('charmhelpers.core.host.mkdir')
@patch('charmhelpers.payload.archive.get_archive_handler')
@patch('charmhelpers.payload.archive.archive_dest_default')
def test_extracts_default_dest(self, _defdest, _gethandler, _mkdir):
expected_dest = "bar"
archive_name = "foo"
_defdest.return_value = expected_dest
handler = MagicMock()
handler.return_value = expected_dest
_gethandler.return_value = handler
dest = archive.extract(archive_name)
self.assertEqual(expected_dest, dest)
handler.assert_called_with(archive_name, expected_dest)