salt/tests/integration/modules/test_archive.py

286 lines
9.3 KiB
Python
Raw Normal View History

2016-09-27 22:27:39 +00:00
# -*- coding: utf-8 -*-
'''
Tests for the archive state
'''
# Import python libs
from __future__ import absolute_import
import os
import shutil
import textwrap
# Import Salt Testing libs
from tests.support.case import ModuleCase
from tests.support.unit import skipIf
from tests.support.paths import TMP
from tests.support.helpers import destructiveTest
2016-09-27 22:27:39 +00:00
# Import salt libs
import salt.utils
# Import 3rd party libs
2018-08-27 07:35:04 +00:00
from salt.ext import six
2016-09-27 22:27:39 +00:00
try:
import zipfile # pylint: disable=W0611
HAS_ZIPFILE = True
except ImportError:
HAS_ZIPFILE = False
@destructiveTest
class ArchiveTest(ModuleCase):
2016-09-27 22:27:39 +00:00
'''
Validate the archive module
'''
# Base path used for test artifacts
base_path = os.path.join(TMP, 'modules', 'archive')
2016-09-27 22:27:39 +00:00
def _set_artifact_paths(self, arch_fmt):
'''
Define the paths for the source, archive, and destination files
:param str arch_fmt: The archive format used in the test
'''
self.src = os.path.join(self.base_path, '{0}_src_dir'.format(arch_fmt))
self.src_file = os.path.join(self.src, 'file')
self.arch = os.path.join(self.base_path, 'archive.{0}'.format(arch_fmt))
self.dst = os.path.join(self.base_path, '{0}_dst_dir'.format(arch_fmt))
2018-08-27 07:35:04 +00:00
def _set_up(self, arch_fmt, unicode_filename=False):
2016-09-27 22:27:39 +00:00
'''
Create source file tree and destination directory
:param str arch_fmt: The archive format used in the test
'''
self._set_artifact_paths(arch_fmt)
# Remove the artifacts if any present
if any([os.path.exists(f) for f in (self.src, self.arch, self.dst)]):
self._tear_down()
2018-08-27 02:05:07 +00:00
self._set_artifact_paths(arch_fmt)
2016-09-27 22:27:39 +00:00
# Create source
os.makedirs(self.src)
2018-08-27 07:18:27 +00:00
if unicode_filename:
filename = 'file®'
else:
filename = 'file'
2018-08-27 07:35:04 +00:00
with salt.utils.fopen(os.path.join(self.src, filename), 'wb') as theorem:
theorem.write(salt.utils.to_bytes(textwrap.dedent('''\
2016-09-27 22:27:39 +00:00
Compression theorem of computational complexity theory:
Given a Gödel numbering $φ$ of the computable functions and a
Blum complexity measure $Φ$ where a complexity class for a
boundary function $f$ is defined as
2018-08-27 07:18:27 +00:00
$\\mathrm C(f) := \\{φ_i \\mathbb R^{(1)} | (^ x) Φ_i(x) f(x)\\}$.
2016-09-27 22:27:39 +00:00
Then there exists a total computable function $f$ so that for
all $i$
2018-08-27 07:18:27 +00:00
$\\mathrm{Dom}(φ_i) = \\mathrm{Dom}(φ_{f(i)})$
2016-09-27 22:27:39 +00:00
and
2018-08-27 07:18:27 +00:00
$\\mathrm C(φ_i) \\mathrm{C}(φ_{f(i)})$.
''')))
2016-09-27 22:27:39 +00:00
# Create destination
os.makedirs(self.dst)
def _tear_down(self):
'''
Remove source file tree, archive, and destination file tree
'''
for f in (self.src, self.arch, self.dst):
if os.path.exists(f):
if os.path.isdir(f):
shutil.rmtree(f, ignore_errors=True)
else:
os.remove(f)
2017-03-06 16:45:59 +00:00
del self.dst
del self.src
del self.arch
del self.src_file
2016-09-27 22:27:39 +00:00
2018-08-27 02:05:07 +00:00
def _assert_artifacts_in_ret(self, ret, file_only=False, unix_sep=False):
2016-09-27 22:27:39 +00:00
'''
Assert that the artifact source files are printed in the source command
output
'''
2018-08-27 02:05:07 +00:00
def normdir(path):
normdir = os.path.normcase(os.path.abspath(path))
2018-08-27 07:35:04 +00:00
if salt.utils.is_windows():
2018-08-27 03:29:06 +00:00
# Remove the drive portion of path
2018-08-27 02:05:07 +00:00
if len(normdir) >= 2 and normdir[1] == ':':
normdir = normdir.split(':', 1)[1]
normdir = normdir.lstrip(os.path.sep)
2018-08-27 03:29:06 +00:00
# Unzipped paths might have unix line endings
2018-08-27 02:05:07 +00:00
if unix_sep:
normdir = normdir.replace(os.path.sep, '/')
return normdir
2016-09-27 22:27:39 +00:00
# Try to find source directory and file in output lines
dir_in_ret = None
file_in_ret = None
for line in ret:
2018-08-27 02:05:07 +00:00
if normdir(self.src) in line \
and not normdir(self.src_file) in line:
2016-09-27 22:27:39 +00:00
dir_in_ret = True
2018-08-27 02:05:07 +00:00
if normdir(self.src_file) in line:
2016-09-27 22:27:39 +00:00
file_in_ret = True
# Assert number of lines, reporting of source directory and file
self.assertTrue(len(ret) >= 1 if file_only else 2)
if not file_only:
self.assertTrue(dir_in_ret)
self.assertTrue(file_in_ret)
@skipIf(not salt.utils.which('tar'), 'Cannot find tar executable')
def test_tar_pack(self):
'''
Validate using the tar function to create archives
'''
self._set_up(arch_fmt='tar')
# Test create archive
ret = self.run_function('archive.tar', ['-cvf', self.arch], sources=self.src)
self.assertTrue(isinstance(ret, list), str(ret))
2016-09-27 22:27:39 +00:00
self._assert_artifacts_in_ret(ret)
self._tear_down()
@skipIf(not salt.utils.which('tar'), 'Cannot find tar executable')
def test_tar_unpack(self):
'''
Validate using the tar function to extract archives
'''
self._set_up(arch_fmt='tar')
self.run_function('archive.tar', ['-cvf', self.arch], sources=self.src)
# Test extract archive
ret = self.run_function('archive.tar', ['-xvf', self.arch], dest=self.dst)
self.assertTrue(isinstance(ret, list), str(ret))
2016-09-27 22:27:39 +00:00
self._assert_artifacts_in_ret(ret)
self._tear_down()
@skipIf(not salt.utils.which('gzip'), 'Cannot find gzip executable')
def test_gzip(self):
'''
Validate using the gzip function
'''
self._set_up(arch_fmt='gz')
# Test create archive
ret = self.run_function('archive.gzip', [self.src_file], options='-v')
self.assertTrue(isinstance(ret, list), str(ret))
2016-09-27 22:27:39 +00:00
self._assert_artifacts_in_ret(ret, file_only=True)
self._tear_down()
@skipIf(not salt.utils.which('gzip'), 'Cannot find gzip executable')
2016-09-27 22:27:39 +00:00
@skipIf(not salt.utils.which('gunzip'), 'Cannot find gunzip executable')
def test_gunzip(self):
'''
Validate using the gunzip function
'''
self._set_up(arch_fmt='gz')
self.run_function('archive.gzip', [self.src_file], options='-v')
# Test extract archive
ret = self.run_function('archive.gunzip', [self.src_file + '.gz'], options='-v')
self.assertTrue(isinstance(ret, list), str(ret))
2016-09-27 22:27:39 +00:00
self._assert_artifacts_in_ret(ret, file_only=True)
self._tear_down()
@skipIf(not salt.utils.which('zip'), 'Cannot find zip executable')
def test_cmd_zip(self):
'''
Validate using the cmd_zip function
'''
self._set_up(arch_fmt='zip')
# Test create archive
ret = self.run_function('archive.cmd_zip', [self.arch, self.src])
self.assertTrue(isinstance(ret, list), str(ret))
2016-09-27 22:27:39 +00:00
self._assert_artifacts_in_ret(ret)
self._tear_down()
@skipIf(not salt.utils.which('zip'), 'Cannot find zip executable')
2016-09-27 22:27:39 +00:00
@skipIf(not salt.utils.which('unzip'), 'Cannot find unzip executable')
def test_cmd_unzip(self):
'''
Validate using the cmd_unzip function
'''
self._set_up(arch_fmt='zip')
self.run_function('archive.cmd_zip', [self.arch, self.src])
# Test create archive
ret = self.run_function('archive.cmd_unzip', [self.arch, self.dst])
self.assertTrue(isinstance(ret, list), str(ret))
2016-09-27 22:27:39 +00:00
self._assert_artifacts_in_ret(ret)
self._tear_down()
@skipIf(not HAS_ZIPFILE, 'Cannot find zipfile python module')
2016-09-27 22:27:39 +00:00
def test_zip(self):
'''
Validate using the zip function
'''
self._set_up(arch_fmt='zip')
# Test create archive
ret = self.run_function('archive.zip', [self.arch, self.src])
self.assertTrue(isinstance(ret, list), str(ret))
2016-09-27 22:27:39 +00:00
self._assert_artifacts_in_ret(ret)
self._tear_down()
@skipIf(not HAS_ZIPFILE, 'Cannot find zipfile python module')
2016-09-27 22:27:39 +00:00
def test_unzip(self):
'''
Validate using the unzip function
'''
self._set_up(arch_fmt='zip')
self.run_function('archive.zip', [self.arch, self.src])
# Test create archive
ret = self.run_function('archive.unzip', [self.arch, self.dst])
2018-08-27 02:05:07 +00:00
self.assertTrue(isinstance(ret, list), six.text_type(ret))
2018-08-27 07:18:27 +00:00
self._assert_artifacts_in_ret(ret, unix_sep=True if six.PY2 else False)
2016-09-27 22:27:39 +00:00
self._tear_down()
@skipIf(not salt.utils.which('rar'), 'Cannot find rar executable')
def test_rar(self):
'''
Validate using the rar function
'''
self._set_up(arch_fmt='rar')
# Test create archive
ret = self.run_function('archive.rar', [self.arch, self.src])
self.assertTrue(isinstance(ret, list), str(ret))
2016-09-27 22:27:39 +00:00
self._assert_artifacts_in_ret(ret)
self._tear_down()
@skipIf(not salt.utils.which('rar'), 'Cannot find rar executable')
@skipIf(not salt.utils.which('unrar'), 'Cannot find unrar executable')
2016-09-27 22:27:39 +00:00
def test_unrar(self):
'''
Validate using the unrar function
'''
self._set_up(arch_fmt='rar')
self.run_function('archive.rar', [self.arch, self.src])
# Test create archive
ret = self.run_function('archive.unrar', [self.arch, self.dst])
self.assertTrue(isinstance(ret, list), str(ret))
2016-09-27 22:27:39 +00:00
self._assert_artifacts_in_ret(ret)
self._tear_down()