--- tests/test_file_source.py | 174 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 tests/test_file_source.py diff --git a/tests/test_file_source.py b/tests/test_file_source.py new file mode 100644 index 0000000..6509078 --- /dev/null +++ b/tests/test_file_source.py @@ -0,0 +1,174 @@ +# Authors: +# Cedric Bosdonnat <cbosdonnat@xxxxxxxx> +# Radostin Stoyanov <rstoyanov1@xxxxxxxxx> +# +# Copyright (C) 2017 SUSE, Inc. +# Copyright (C) 2017 Radostin Stoyanov +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + + +""" +Unit tests for methods defined in virtBootstrap.sources.FileSource +""" + +from tests import unittest +from tests import mock +from tests import sources + + +# pylint: disable=invalid-name +class TestFileSource(unittest.TestCase): + """ + Test cases for FileSource + """ + + ################################### + # Tests for: __init__() + ################################### + def test_argument_assignment(self): + """ + Ensures that __init__() assigns the arguments' values to instance + variables. + """ + kwargs = {'uri': mock.Mock(), + 'fmt': 'dir', + 'progress': mock.Mock()} + + src_instance = sources.FileSource(**kwargs) + + test_values = { + src_instance.path: kwargs['uri'].path, + src_instance.output_format: kwargs['fmt'], + src_instance.progress: kwargs['progress'].update_progress + } + for value in test_values: + self.assertIs(value, test_values[value]) + + ################################### + # Tests for: unpack() + ################################### + def test_unpack_invalid_source_raise_exception(self): + """ + Ensures that unpack() throws an Exception when called with + invalid file source. + """ + m_self = mock.Mock(spec=sources.FileSource) + m_self.path = 'foo' + with mock.patch('os.path.isfile') as m_isfile: + m_isfile.return_value = False + with self.assertRaises(Exception) as err: + sources.FileSource.unpack(m_self, 'bar') + self.assertIn('Invalid file source', str(err.exception)) + + def test_unpack_to_dir(self): + """ + Ensures that unpack() calls safe_untar() when the output format + is set to 'dir'. + """ + m_self = mock.Mock(spec=sources.FileSource) + m_self.progress = mock.Mock() + m_self.path = 'foo' + m_self.output_format = 'dir' + dest = 'bar' + + with mock.patch('os.path.isfile') as m_isfile: + m_isfile.return_value = True + with mock.patch('virtBootstrap.utils.safe_untar') as m_untar: + sources.FileSource.unpack(m_self, dest) + + m_untar.assert_called_once_with(m_self.path, dest) + + def test_unpack_to_qcow2(self): + """ + Ensures that unpack() calls create_qcow2() when the output + format is set to 'qcow2'. + """ + m_self = mock.Mock(spec=sources.FileSource) + m_self.progress = mock.Mock() + m_self.path = 'foo' + m_self.output_format = 'qcow2' + dest = 'bar' + qcow2_file_path = 'foobar' + + with mock.patch.multiple('os.path', + isfile=mock.DEFAULT, + realpath=mock.DEFAULT) as mocked: + + mocked['isfile'].return_value = True + mocked['realpath'].return_value = qcow2_file_path + with mock.patch('virtBootstrap.utils.create_qcow2') as m_qcow2: + sources.FileSource.unpack(m_self, dest) + + m_qcow2.assert_called_once_with(m_self.path, qcow2_file_path) + + def _unpack_raise_error_test(self, + output_format, + side_effect=None, + patch_method=None, + msg=None): + """ + This method is gather common test pattern used in the following + three test cases. + """ + m_self = mock.Mock(spec=sources.FileSource) + m_self.progress = mock.Mock() + m_self.path = 'foo' + m_self.output_format = output_format + dest = 'bar' + + with mock.patch.multiple('os.path', + isfile=mock.DEFAULT, + realpath=mock.DEFAULT) as m_path: + m_path['isfile'].return_value = True + with self.assertRaises(Exception) as err: + if patch_method: + with mock.patch(patch_method) as mocked_method: + mocked_method.side_effect = side_effect + sources.FileSource.unpack(m_self, dest) + else: + sources.FileSource.unpack(m_self, dest) + if msg: + self.assertEqual(msg, str(err.exception)) + + def test_unpack_invalid_format_raise_exception(self): + """ + Ensures that unpack() throws an Exception when called with + invalid output format. + """ + self._unpack_raise_error_test('foo', msg='Unknown format:foo') + + def test_unpack_raise_error_if_untar_fail(self): + """ + Ensures that unpack() throws an Exception when safe_untar() + fails. + """ + msg = 'Caught untar failure' + patch_method = 'virtBootstrap.utils.safe_untar' + self._unpack_raise_error_test(output_format='dir', + side_effect=Exception(msg), + patch_method=patch_method, + msg=msg) + + def test_unpack_raise_error_if_extract_in_qcow2_fail(self): + """ + Ensures that unpack() throws an Exception when create_qcow2() + fails. + """ + msg = 'Caught extract_layers_in_qcow2 failure' + patch_method = 'virtBootstrap.utils.create_qcow2' + self._unpack_raise_error_test(output_format='qcow2', + side_effect=Exception(msg), + patch_method=patch_method, + msg=msg) -- 2.9.4 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list