diff options
author | Markus Lehtonen <markus.lehtonen@linux.intel.com> | 2013-01-17 10:23:57 +0200 |
---|---|---|
committer | Markus Lehtonen <markus.lehtonen@linux.intel.com> | 2013-04-03 10:11:40 +0300 |
commit | fd115ac9deaccc8e5bb486d2701940fc30fea58f (patch) | |
tree | e2c2ba1a1b9419a9bc486c44189515b6b4c9bfe8 | |
parent | 3671fdf05e221c857b0a16d3b7d9a530fdc3c4f5 (diff) | |
download | git-buildpackage-fd115ac9deaccc8e5bb486d2701940fc30fea58f.tar.gz git-buildpackage-fd115ac9deaccc8e5bb486d2701940fc30fea58f.tar.bz2 git-buildpackage-fd115ac9deaccc8e5bb486d2701940fc30fea58f.zip |
tests: add more comprehensive tests for import-srpm
Basic tests for virtually all features of import-srpm.
Adds a new python module to include all (upcoming) git-buildpackage rpm
commandline tool tests. Also, adds a separate git submodule for the rpm
test data.
Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
-rw-r--r-- | .gitmodules | 3 | ||||
-rw-r--r-- | tests/component/rpm/__init__.py | 30 | ||||
m--------- | tests/component/rpm/data | 0 | ||||
-rw-r--r-- | tests/component/rpm/test_import_srpm.py | 292 |
4 files changed, 325 insertions, 0 deletions
diff --git a/.gitmodules b/.gitmodules index 98279cc0..3b52b91f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "tests/component/deb/data"] path = tests/component/deb/data url = git://honk.sigxcpu.org/git/gbp/deb-testdata +[submodule "tests/component/rpm/data"] + path = tests/component/rpm/data + url = git://github.com/marquiz/git-buildpackage-rpm-testdata.git diff --git a/tests/component/rpm/__init__.py b/tests/component/rpm/__init__.py new file mode 100644 index 00000000..e84fca94 --- /dev/null +++ b/tests/component/rpm/__init__.py @@ -0,0 +1,30 @@ +# vim: set fileencoding=utf-8 : +# +# (C) 2012 Intel Corporation <markus.lehtonen@linux.intel.com> +# 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 2 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, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +"""Test module for RPM command line tools of the git-buildpackage suite""" + +import os + +from tests.component import ComponentTestGitRepository + +RPM_TEST_DATA_SUBMODULE = os.path.join('tests', 'component', 'rpm', 'data') +RPM_TEST_DATA_DIR = os.path.abspath(RPM_TEST_DATA_SUBMODULE) + +def setup(): + """Test Module setup""" + ComponentTestGitRepository.check_testdata(RPM_TEST_DATA_SUBMODULE) + +# vim:et:ts=4:sw=4:et:sts=4:ai:set list listchars=tab\:»·,trail\:·: diff --git a/tests/component/rpm/data b/tests/component/rpm/data new file mode 160000 +Subproject 4aa7e2901ab84bd91c1d2289dd4138c531c1937 diff --git a/tests/component/rpm/test_import_srpm.py b/tests/component/rpm/test_import_srpm.py new file mode 100644 index 00000000..b17f8d23 --- /dev/null +++ b/tests/component/rpm/test_import_srpm.py @@ -0,0 +1,292 @@ +# vim: set fileencoding=utf-8 : +# +# (C) 2012 Intel Corporation <markus.lehtonen@linux.intel.com> +# 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 2 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, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +"""Basic tests for the git-import-srpm tool""" + +import os +import shutil +import urllib2 +from nose.plugins.skip import SkipTest +from nose.tools import assert_raises +from mock import Mock + +from gbp.scripts.import_srpm import main as import_srpm +from gbp.git import GitRepository +from gbp.rpm import SrcRpmFile + +from tests.component import ComponentTestBase +from tests.component.rpm import RPM_TEST_DATA_DIR as DATA_DIR + + +class TestImportPacked(ComponentTestBase): + """Test importing of src.rpm files""" + + def test_invalid_args(self): + """See that import-srpm fails gracefully if called with invalid args""" + assert import_srpm(['arg0']) == 1 + with assert_raises(SystemExit): + import_srpm(['arg0', '--invalid-arg=123']) + + def test_basic_import(self): + """Test importing of non-native src.rpm""" + srpm = os.path.join(DATA_DIR, 'gbp-test-1.0-1.src.rpm') + assert import_srpm(['arg0', srpm]) == 0 + # Check repository state + repo = GitRepository('gbp-test') + self._check_repo_state(repo, 'master', ['master', 'upstream']) + # Four commits: upstream, packaging files, one patch and the removal + # of imported patches + assert len(repo.get_commits()) == 4 + + def test_basic_import_orphan(self): + """ + Test importing of non-native src.rpm to separate packaging and + development branches + """ + srpm = os.path.join(DATA_DIR, 'gbp-test2-2.0-0.src.rpm') + assert import_srpm(['arg0', '--orphan-packaging', srpm]) == 0 + # Check repository state + repo = GitRepository('gbp-test2') + self._check_repo_state(repo, 'master', ['master', 'upstream']) + # Only one commit: the packaging files + assert len(repo.get_commits()) == 1 + + def test_basic_native_import(self): + """Test importing of native src.rpm""" + srpm = os.path.join(DATA_DIR, 'gbp-test2-2.0-0.src.rpm') + assert import_srpm(['arg0', '--native', srpm]) == 0 + # Check repository state + repo = GitRepository('gbp-test2') + self._check_repo_state(repo, 'master', ['master']) + # Only one commit: the imported source tarball + assert len(repo.get_commits()) == 1 + + def test_import_no_orig_src(self): + """Test importing of (native) srpm without orig tarball""" + srpm = os.path.join(DATA_DIR, 'gbp-test-native2-2.0-0.src.rpm') + assert import_srpm(['arg0', srpm]) == 0 + # Check repository state + repo = GitRepository('gbp-test-native2') + self._check_repo_state(repo, 'master', ['master']) + # Only one commit: packaging files + assert len(repo.get_commits()) == 1 + + def test_multiple_versions(self): + """Test importing of multiple versions""" + srpms = [ os.path.join(DATA_DIR, 'gbp-test-1.0-1.src.rpm'), + os.path.join(DATA_DIR, 'gbp-test-1.0-1.other.src.rpm'), + os.path.join(DATA_DIR, 'gbp-test-1.1-1.src.rpm') ] + assert import_srpm(['arg0', srpms[0]]) == 0 + repo = GitRepository('gbp-test') + self._check_repo_state(repo, 'master', ['master', 'upstream']) + assert len(repo.get_commits()) == 4 + # Try to import same version again + assert import_srpm(['arg0', srpms[1]]) == 0 + assert len(repo.get_commits()) == 4 + assert len(repo.get_commits(until='upstream')) == 1 + assert import_srpm(['arg0', '--allow-same-version', srpms[1]]) == 0 + # Added new versio packaging plus one patch + assert len(repo.get_commits()) == 7 + assert len(repo.get_commits(until='upstream')) == 1 + # Import new version + assert import_srpm(['arg0', srpms[2]]) == 0 + assert len(repo.get_commits()) == 11 + assert len(repo.get_commits(until='upstream')) == 2 + # Check number of tags + assert len(repo.get_tags('upstream/*')) == 2 + assert len(repo.get_tags('vendor/*')) == 3 + + def test_import_to_existing(self): + """Test importing to an existing repo""" + srpm = os.path.join(DATA_DIR, 'gbp-test-1.0-1.src.rpm') + + # Create new repo + repo = GitRepository.create('myrepo') + os.chdir('myrepo') + shutil.copy2('.git/HEAD', 'foobar') + repo.add_files('.') + repo.commit_all('First commit') + + # Test importing to non-clean repo + shutil.copy2('.git/HEAD', 'foobaz') + assert import_srpm(['arg0', '--create-missing', srpm]) == 1 + self._check_log(0, 'gbp:error: Repository has uncommitted changes') + self._clear_log() + os.unlink('foobaz') + + # The first import should fail because upstream branch is missing + assert import_srpm(['arg0', srpm]) == 1 + self._check_log(-1, 'Also check the --create-missing-branches') + assert import_srpm(['arg0', '--create-missing', srpm]) == 0 + self._check_repo_state(repo, 'master', ['master', 'upstream']) + # Four commits: our initial, upstream, packaging files, one patch, + # and the removal of imported patches + assert len(repo.get_commits()) == 5 + + # The import should fail because missing packaging-branch + srpm = os.path.join(DATA_DIR, 'gbp-test-1.1-1.src.rpm') + assert import_srpm(['arg0', '--packaging-branch=foo', srpm]) == 1 + self._check_log(-1, 'Also check the --create-missing-branches') + + + def test_misc_options(self): + """Test various options of git-import-srpm""" + srpm = os.path.join(DATA_DIR, 'gbp-test2-2.0-0.src.rpm') + + assert import_srpm([ + 'arg0', + '--no-patch-import', + '--packaging-branch=pack', + '--upstream-branch=orig', + '--packaging-dir=packaging', + '--packaging-tag=ver_%(upstreamversion)s-rel_%(release)s', + '--upstream-tag=orig/%(upstreamversion)s', + '--author-is-committer', + srpm]) == 0 + # Check repository state + repo = GitRepository('gbp-test2') + self._check_repo_state(repo, 'pack', ['pack', 'orig']) + assert len(repo.get_commits()) == 2 + # Check packaging dir + assert len(repo.get_commits(paths='packaging')) == 1 + # Check tags + tags = repo.get_tags() + assert set(tags) == set(['orig/2.0', 'ver_2.0-rel_0']) + # Check git committer/author + info = repo.get_commit_info('pack') + assert info['author'].name == 'Markus Lehtonen' + assert info['author'].email == 'markus.lehtonen@linux.intel.com' + assert info['author'].name == info['committer'].name + assert info['author'].email == info['committer'].email + + +class TestImportUnPacked(ComponentTestBase): + """Test importing of unpacked source rpms""" + + def setup(self): + super(TestImportUnPacked, self).setup() + # Unpack some source rpms + os.mkdir('multi-unpack') + for pkg in ['gbp-test-1.0-1.src.rpm', 'gbp-test2-2.0-0.src.rpm']: + unpack_dir = pkg.replace('.src.rpm', '-unpack') + os.mkdir(unpack_dir) + pkg_path = os.path.join(DATA_DIR, pkg) + SrcRpmFile(pkg_path).unpack(unpack_dir) + SrcRpmFile(pkg_path).unpack('multi-unpack') + + def test_import_dir(self): + """Test importing of directories""" + assert import_srpm(['arg0', 'gbp-test-1.0-1-unpack']) == 0 + # Check repository state + repo = GitRepository('gbp-test') + self._check_repo_state(repo, 'master', ['master', 'upstream']) + + # Check that importing dir with multiple spec files fails + assert import_srpm(['arg0', 'multi-unpack']) == 1 + self._check_log(-1, 'gbp:error: Failed determine spec file: ' + 'Multiple spec files found') + + def test_import_spec(self): + """Test importing of spec file""" + specfile = 'gbp-test2-2.0-0-unpack/gbp-test2.spec' + assert import_srpm(['arg0', specfile]) == 0 + # Check repository state + assert GitRepository('gbp-test2').is_clean() + + def test_missing_files(self): + """Test importing of directory with missing packaging files""" + + os.unlink('gbp-test2-2.0-0-unpack/my.patch') + assert import_srpm(['arg0', 'gbp-test2-2.0-0-unpack']) == 1 + self._check_log(-1, "gbp:error: File 'my.patch' listed in spec " + "not found") + + +class TestDownloadImport(ComponentTestBase): + """Test download functionality""" + + def test_urldownload(self): + """Test downloading and importing src.rpm from remote url""" + srpm = 'http://raw.github.com/marquiz/git-buildpackage-rpm-testdata/'\ + 'master/gbp-test-1.0-1.src.rpm' + # Mock to use local files instead of really downloading + local_fn = os.path.join(DATA_DIR, os.path.basename(srpm)) + urllib2.urlopen = Mock() + urllib2.urlopen.return_value = open(local_fn, 'r') + + assert import_srpm(['arg0', '--download', srpm]) == 0 + # Check repository state + repo = GitRepository('gbp-test') + self._check_repo_state(repo, 'master', ['master', 'upstream']) + + def test_nonexistent_url(self): + """Test graceful failure when trying download from nonexistent url""" + srpm = 'http://url.does.not.exist.com/foo.src.rpm' + # Do not connect to remote, mock failure + urllib2.urlopen = Mock() + urllib2.urlopen.side_effect = urllib2.HTTPError(srpm, 404, "Not found", + None, None) + + assert import_srpm(['arg0', '--download', srpm]) == 1 + self._check_log(-1, "gbp:error: Download failed: HTTP Error 404") + self._clear_log() + + def test_invalid_url(self): + """Test graceful failure when trying download from invalid url""" + srpm = 'foob://url.does.not.exist.com/foo.src.rpm' + assert import_srpm(['arg0', '--download', srpm]) == 1 + self._check_log(-1, "gbp:error: Download failed: unknown url type:") + self._clear_log() + + +class TestPristineTar(ComponentTestBase): + """Test importing with pristine-tar""" + + @classmethod + def setup_class(cls): + if not os.path.exists('/usr/bin/pristine-tar'): + raise SkipTest('Skipping %s:%s as pristine-tar tool is not ' + 'available' % (__name__, cls.__name__)) + super(TestPristineTar, cls).setup_class() + + def test_basic_import_pristine_tar(self): + """Test importing of non-native src.rpm, with pristine-tar""" + srpm = os.path.join(DATA_DIR, 'gbp-test-1.0-1.src.rpm') + assert import_srpm(['arg0', '--pristine-tar', srpm]) == 0 + # Check repository state + repo = GitRepository('gbp-test') + self._check_repo_state(repo, 'master', ['master', 'upstream', + 'pristine-tar']) + # Four commits: upstream, packaging files, one patch and the removal + # of imported patches + assert len(repo.get_commits()) == 4 + + +class TestBareRepo(ComponentTestBase): + """Test importing to a bare repository""" + + def test_basic_import_to_bare_repo(self): + """Test importing of srpm to a bare git repository""" + srpm = os.path.join(DATA_DIR, 'gbp-test-1.0-1.src.rpm') + # Create new repo + repo = GitRepository.create('myrepo', bare=True) + os.chdir('myrepo') + assert import_srpm(['arg0', srpm]) == 0 + self._check_repo_state(repo, 'master', ['master', 'upstream']) + # Patch import to bare repos not supported -> only 2 commits + assert len(repo.get_commits(until='master')) == 2 + +# vim:et:ts=4:sw=4:et:sts=4:ai:set list listchars=tab\:»·,trail\:·: |