Exemplo n.º 1
0
    def run(
        cls, spec_file: SpecFile, rebase_spec_file: SpecFile, results_dir: str,
        **kwargs: Any
    ) -> Tuple[Dict[str, Union[RemovedFiles, AddedFiles]], bool]:
        if not results_dir:
            return {}, False
        log = os.path.join(results_dir, NEW_BUILD_DIR, 'RPM', 'build.log')

        nvr = rebase_spec_file.get_NVR()
        error_type, files = cls._parse_build_log(log, nvr)

        result: Dict[str, Union[AddedFiles, RemovedFiles]] = {}
        if error_type == 'deleted':
            logger.info(
                'The following files are absent in sources but are in the SPEC file, trying to remove them:'
            )
            for file in files:
                logger.info('\t%s', file)
            result = cls._correct_deleted_files(rebase_spec_file, files)
        elif error_type == 'missing':
            logger.info(
                'The following files are in the sources but are missing in the SPEC file, trying to add them:'
            )
            for file in files:
                logger.info('\t%s', file)
            result = cls._correct_missing_files(rebase_spec_file, files)
        rebase_spec_file.save()
        return result, 'added' in result or 'removed' in result
Exemplo n.º 2
0
    def run(cls, spec_file: SpecFile, rebase_spec_file: SpecFile,
            **kwargs: Any):
        replace_with_macro = bool(kwargs.get('replace_old_version_with_macro'))

        subversion_patterns = cls._create_possible_replacements(
            spec_file, rebase_spec_file, replace_with_macro)
        examined_lines: Dict[int, Set[int]] = collections.defaultdict(set)
        for tag in rebase_spec_file.tags.filter():
            examined_lines[tag.section_index].add(tag.line)
            value = rebase_spec_file.get_raw_tag_value(tag.name,
                                                       tag.section_index)
            if not value or tag.name in cls.IGNORED_TAGS:
                continue
            scheme = urllib.parse.urlparse(value).scheme
            if (tag.name.startswith('Patch')
                    or tag.name.startswith('Source')) and not scheme:
                # skip local sources
                continue

            # replace the whole version first
            updated_value = subversion_patterns[0][0].sub(
                subversion_patterns[0][1], value)
            # replace subversions only for remote sources/patches
            if tag.name.startswith('Patch') or tag.name.startswith('Source'):
                for sub_pattern, repl in subversion_patterns[1:]:
                    updated_value = sub_pattern.sub(repl, updated_value)
            rebase_spec_file.set_raw_tag_value(tag.name, updated_value,
                                               tag.section_index)

        for sec_index, (sec_name, section) in enumerate(
                rebase_spec_file.spec_content.sections):
            if sec_name.startswith('%changelog'):
                continue
            for index, line in enumerate(section):
                tag_ignored = any(
                    MacroHelper.expand(line, line).startswith(tag)
                    for tag in cls.IGNORED_TAGS)
                if index in examined_lines[sec_index] or tag_ignored:
                    continue
                start, end = spec_file.spec_content.get_comment_span(
                    line, sec_name)
                updated_line = subversion_patterns[0][0].sub(
                    subversion_patterns[0][1], line[:start])
                section[index] = updated_line + line[start:end]

        rebase_spec_file.save()
Exemplo n.º 3
0
class TestSpecFile(BaseTest):
    """ SpecFile tests """
    NAME = 'test'
    VERSION = '1.0.2'
    OLD_ARCHIVE = NAME + '-' + VERSION + '.tar.xz'
    SPEC_FILE = 'test.spec'
    SOURCE_0 = 'test-source.sh'
    SOURCE_1 = 'source-tests.sh'
    SOURCE_2 = ''
    SOURCE_4 = 'file.txt.bz2'
    SOURCE_5 = 'documentation.tar.xz'
    PATCH_1 = 'test-testing.patch'
    PATCH_2 = 'test-testing2.patch'
    PATCH_3 = 'test-testing3.patch'
    PATCH_4 = 'test-testing4.patch'
    BUILD_MISSING_LOG = 'build_missing.log'
    BUILD_OBSOLETES_LOG = 'build_obsoletes.log'

    TEST_FILES = [
        SPEC_FILE,
        PATCH_1,
        PATCH_2,
        PATCH_3,
        PATCH_4,
        BUILD_MISSING_LOG,
        BUILD_OBSOLETES_LOG
    ]

    def setup(self):
        super(TestSpecFile, self).setup()
        self.SPEC_FILE_OBJECT = SpecFile(self.SPEC_FILE, self.WORKING_DIR, download=False)

    def test_get_release(self):
        match = re.search(r'([0-9.]*[0-9]+)\w*', self.SPEC_FILE_OBJECT.get_release())
        assert match is not None
        assert match.group(1) == self.SPEC_FILE_OBJECT.get_release_number()

    def test_get_release_number(self):
        assert self.SPEC_FILE_OBJECT.get_release_number() == '33'

    def test_set_release_number(self):
        self.SPEC_FILE_OBJECT.set_release_number(0.1)
        assert self.SPEC_FILE_OBJECT.get_release_number() == '0.1'
        self.SPEC_FILE_OBJECT.set_release_number(22)
        assert self.SPEC_FILE_OBJECT.get_release_number() == '22'

    def test_get_version(self):
        assert self.SPEC_FILE_OBJECT.get_version() == self.VERSION

    def test_set_version(self):
        NEW_VERSION = '1.2.3.4.5'
        self.SPEC_FILE_OBJECT.set_version(NEW_VERSION)
        self.SPEC_FILE_OBJECT.save()
        assert self.SPEC_FILE_OBJECT.get_version() == NEW_VERSION

    def test_set_version_using_archive(self):
        NEW_VERSION = '1.2.3.4.5'
        ARCHIVE_NAME = 'test-{0}.tar.xz'.format(NEW_VERSION)
        self.SPEC_FILE_OBJECT.set_version_using_archive(ARCHIVE_NAME)
        self.SPEC_FILE_OBJECT.save()
        assert self.SPEC_FILE_OBJECT.get_version() == NEW_VERSION

    def test_get_package_name(self):
        assert self.SPEC_FILE_OBJECT.get_package_name() == self.NAME

    def test__write_spec_file_to_disc(self):
        new_content = [
            'testing line 1\n',
            'testing line 2\n'
        ]
        self.SPEC_FILE_OBJECT.spec_content = new_content
        self.SPEC_FILE_OBJECT._write_spec_file_to_disc()
        with open(self.SPEC_FILE) as spec:
            assert new_content == spec.readlines()

    def test__get_raw_source_string(self):
        assert self.SPEC_FILE_OBJECT._get_raw_source_string(0) == 'ftp://ftp.test.org/%{name}-%{version}.tar.xz'
        assert self.SPEC_FILE_OBJECT._get_raw_source_string(1) == 'source-tests.sh'
        assert self.SPEC_FILE_OBJECT._get_raw_source_string(2) == 'ftp://test.com/test-source.sh'
        assert self.SPEC_FILE_OBJECT._get_raw_source_string(3) is None

    def test_old_tarball(self):
        assert self.SPEC_FILE_OBJECT.get_archive() == self.OLD_ARCHIVE

    def test_get_sources(self):
        sources = [self.SOURCE_0, self.SOURCE_1, self.SOURCE_4, self.SOURCE_5, self.OLD_ARCHIVE]
        sources = [os.path.join(self.WORKING_DIR, f) for f in sources]
        archives = [self.OLD_ARCHIVE, self.SOURCE_4, self.SOURCE_5]
        assert len(set(sources).intersection(set(self.SPEC_FILE_OBJECT.get_sources()))) == 5
        # The Source0 has to be always in the beginning
        assert self.SPEC_FILE_OBJECT.get_archive() == 'test-1.0.2.tar.xz'
        assert self.SPEC_FILE_OBJECT.get_archives() == archives

    def test_get_patches(self):
        expected_patches = {0: [os.path.join(self.WORKING_DIR, self.PATCH_1), 0],
                            1: [os.path.join(self.WORKING_DIR, self.PATCH_2), 1],
                            2: [os.path.join(self.WORKING_DIR, self.PATCH_3), 2],
                            3: [os.path.join(self.WORKING_DIR, self.PATCH_4), 3]}
        patches = {}
        for index, p in enumerate(self.SPEC_FILE_OBJECT.get_patches()):
            patches[index] = [p.get_path(), p.get_index()]
        assert patches == expected_patches

    def test_get_requires(self):
        expected = set(['openssl-devel', 'pkgconfig', 'texinfo', 'gettext', 'autoconf'])
        req = self.SPEC_FILE_OBJECT.get_requires()
        assert len(expected.intersection(req)) == len(expected)

    def test_get_paths_with_rpm_macros(self):
        raw_paths = ['/usr/bin/binary1',
                     '/usr/sbin/binary2',
                     '/usr/include/header.h',
                     '/usr/lib/library1.so',
                     '/usr/lib64/library2.so',
                     '/usr/libexec/script.sh',
                     '/usr/lib/systemd/system/daemond.service',
                     '/usr/share/man/man1/test.1.gz',
                     '/usr/share/info/file.info',
                     '/usr/share/doc/RFC.pdf',
                     '/usr/share/config.site',
                     '/var/lib/libvirt',
                     '/var/tmp/abrt',
                     '/var/lock']

        expected_paths = set(['%{_bindir}/binary1',
                              '%{_sbindir}/binary2',
                              '%{_includedir}/header.h',
                              '%{_libdir}/library1.so',
                              '%{_libdir}/library2.so',
                              '%{_libexecdir}/script.sh',
                              '%{_unitdir}/daemond.service',
                              '%{_mandir}/man1/test.1.gz',
                              '%{_infodir}/file.info',
                              '%{_docdir}/RFC.pdf',
                              '%{_datarootdir}/config.site',
                              '%{_sharedstatedir}/libvirt',
                              '%{_tmppath}/abrt',
                              '%{_localstatedir}/lock'])
        paths = SpecFile.get_paths_with_rpm_macros(raw_paths)
        assert len(set(paths)) == len(expected_paths)
        assert len(expected_paths.intersection(set(paths))) == len(expected_paths)

    def test_split_version_string(self):
        assert SpecFile.split_version_string() == (None, None)
        assert SpecFile.split_version_string('1.0.1') == ('1.0.1', '')
        assert SpecFile.split_version_string('1.0.1b1') == ('1.0.1', 'b1')
        assert SpecFile.split_version_string('1.0.1rc1') == ('1.0.1', 'rc1')

    def test_extract_version_from_archive_name(self):
        # Basic tests
        assert SpecFile.extract_version_from_archive_name('test-1.0.1.tar.gz') == ('1.0.1', '')
        assert SpecFile.extract_version_from_archive_name('/home/user/test-1.0.1.tar.gz') == ('1.0.1', '')
        assert SpecFile.extract_version_from_archive_name('test-1.0.1.tar.gz',
                                                          'ftp://ftp.test.org/test-%{version}.tar.gz') == ('1.0.1', '')
        assert SpecFile.extract_version_from_archive_name('/home/user/test-1.0.1.tar.gz',
                                                          'ftp://ftp.test.org/test-%{version}.tar.gz') == ('1.0.1', '')
        # Real world tests
        assert SpecFile.extract_version_from_archive_name('cups-1.7.5-source.tar.bz2',
                                                          'http://www.cups.org/software/%{version}/cups-%{version}-source.tar.bz2') == ('1.7.5', '')
        # the 'rc1' can't be in the version number
        assert SpecFile.extract_version_from_archive_name('bind-9.9.5rc2.tar.gz',
                                                          'ftp://ftp.isc.org/isc/bind9/%{VERSION}/bind-%{VERSION}.tar.gz') == ('9.9.5', 'rc2')
        assert SpecFile.extract_version_from_archive_name('dnsmasq-2.69rc1.tar.xz',
                                                          'http://www.thekelleys.org.uk/dnsmasq/%{?extrapath}%{name}-%{version}%{?extraversion}.tar.xz') == ('2.69', 'rc1')

    def test__split_sections(self):
        expected_sections = {
            0: ['%header', ['Summary: A testing spec file\n',
                            'Name: test\n',
                            'Version: 1.0.2\n',
                            'Release: 33%{?dist}\n',
                            'License: GPL2+\n',
                            'Group: System Environment\n',
                            'URL: http://testing.org\n',
                            '\n',
                            '# Note: non-current tarballs get moved to the history/ subdirectory,\n',
                            '# so look there if you fail to retrieve the version you want\n',
                            'Source: ftp://ftp.test.org/%{name}-%{version}.tar.xz\n',
                            'Source1: source-tests.sh\n',
                            'Source2: ftp://test.com/test-source.sh\n',
                            '#Source3: source-tests.sh\n',
                            'Source4: file.txt.bz2\n',
                            'Source5: documentation.tar.xz\n',
                            'Patch1: test-testing.patch\n',
                            'Patch2: test-testing2.patch\n',
                            'Patch3: test-testing3.patch\n',
                            'Patch4: test-testing4.patch\n',
                            '\n',
                            'BuildRequires: openssl-devel, pkgconfig, texinfo, gettext, autoconf\n',
                            '\n']],
            1: ['%description', ['Testing spec file\n',
                                 '\n']],
            2: ['%package devel', ['Summary: A testing devel package\n',
                                   '\n']],
            3: ['%description devel', ['Testing devel spec file\n',
                                       '\n']],
            4: ['%prep', ['%setup -q\n',
                          '%patch1\n',
                          '%patch2 -p1\n',
                          '%patch3 -p1 -b .testing3\n',
                          '%patch4 -p0 -b .testing4\n',
                          '\n']],
            5: ['%build', ['autoreconf -vi\n',
                           '\n',
                           '%configure\n',
                           'make TEST\n',
                           '\n']],
            6: ['%install', ['make DESTDIR=$RPM_BUILD_ROOT install\n',
                             '\n']],
            7: ['%check', ['#to run make check use "--with check"\n',
                           '%if %{?_with_check:1}%{!?_with_check:0}\n',
                           'make check\n',
                           '%endif\n',
                           '\n']],
            8: ['%files', ['%{_bindir}/file.txt\n',
                           '\n']],
            9: ['%files devel', ['%{_bindir}/test_example\n',
                                 '%{_libdir}/my_test.so\n',
                                 '\n']],
            10: ['%changelog', ['* Wed Nov 12 2014 Tomas Hozza <*****@*****.**> 1.0.0-33\n',
                                '- Bump the release for testing purposes\n',
                                '\n',
                                '* Tue Sep 24 2013 Petr Hracek <*****@*****.**> 1.0.0-1\n',
                                '- Initial version\n',
                                '\n']]
        }
        sections = self.SPEC_FILE_OBJECT._split_sections()
        for key, value in six.iteritems(expected_sections):
            assert sections[key][0] == value[0]
            assert sections[key][1] == value[1]

    def test_get_spec_section(self):
        expected_section = ['%{_bindir}/file.txt\n',
                            '\n']
        section = self.SPEC_FILE_OBJECT.get_spec_section('%files')
        assert section == expected_section

    def test_spec_missing_file(self):
        files = {'missing': ['/usr/bin/test2']}
        self.SPEC_FILE_OBJECT.modify_spec_files_section(files)
        section = self.SPEC_FILE_OBJECT.get_spec_section('%files')
        assert '%{_bindir}/test2' in section

    def test_spec_remove_file(self):
        files = {'deleted': ['/usr/lib/test.so']}
        self.SPEC_FILE_OBJECT.modify_spec_files_section(files)
        section = self.SPEC_FILE_OBJECT.get_spec_section('%files devel')
        assert '%{_libdir}/test.so' not in section

    def test_spec_missing_and_remove_file(self):
        files = {'missing': ['/usr/bin/test2'],
                 'deleted': ['/usr/lib/test.so']}
        self.SPEC_FILE_OBJECT.modify_spec_files_section(files)
        section = self.SPEC_FILE_OBJECT.get_spec_section('%files')
        assert '%{_bindir}/test2' in section
        section = self.SPEC_FILE_OBJECT.get_spec_section('%files devel')
        assert '%{_libdir}/test.so' not in section

    def test_spec_missing_from_logfile(self):
        shutil.move('build_missing.log', 'build.log')
        files = BuildLogAnalyzer.parse_log(self.WORKING_DIR, 'build.log')
        self.SPEC_FILE_OBJECT.modify_spec_files_section(files)
        section = self.SPEC_FILE_OBJECT.get_spec_section('%files')
        assert '%{_bindir}/test2' in section

    def test_spec_obsolete_from_logfile(self):
        shutil.move('build_obsoletes.log', 'build.log')
        files = BuildLogAnalyzer.parse_log(self.WORKING_DIR, 'build.log')
        self.SPEC_FILE_OBJECT.modify_spec_files_section(files)
        section = self.SPEC_FILE_OBJECT.get_spec_section('%files')
        assert '%{_libdir}/libtest.so' not in section

    def test_is_test_suite_enabled(self):
        found = self.SPEC_FILE_OBJECT.is_test_suite_enabled()
        assert found is True

    def test_set_extra_version_some_extra_version(self):
        self.SPEC_FILE_OBJECT.set_extra_version('b1')
        with open(self.SPEC_FILE_OBJECT.get_path()) as f:
            # 1st line
            assert f.readline() == '%global REBASE_EXTRA_VER b1\n'
            # 2nd line
            assert f.readline() == '%global REBASE_VER %{version}%{REBASE_EXTRA_VER}\n'
            while True:
                line = f.readline()
                if line == '#Source: ftp://ftp.test.org/%{name}-%{version}.tar.xz\n':
                    break
                assert line is not None
            # there is new Source0 after old commented out entry
            assert f.readline() == 'Source: ftp://ftp.test.org/%{name}-%{REBASE_VER}.tar.xz\n'
        # the release number was changed
        assert self.SPEC_FILE_OBJECT.get_release_number() == '0.1'
        # the release string now contains the extra version
        match = re.search(r'([0-9.]*[0-9]+)b1\w*', self.SPEC_FILE_OBJECT.get_release())
        assert match is not None
        assert match.group(1) == self.SPEC_FILE_OBJECT.get_release_number()

    def test_set_extra_version_no_extra_version(self):
        self.SPEC_FILE_OBJECT.set_extra_version('')
        with open(self.SPEC_FILE_OBJECT.get_path()) as f:
            # 1st line
            assert f.readline() != '%global REBASE_EXTRA_VER b1\n'
            # 2nd line
            assert f.readline() != '%global REBASE_VER %{version}%{REBASE_EXTRA_VER}\n'
        # the release number was changed
        assert self.SPEC_FILE_OBJECT.get_release_number() == '1'

    def test_redefine_release_with_macro(self):
        macro = '%{REBASE_VER}'
        self.SPEC_FILE_OBJECT.redefine_release_with_macro(macro)
        with open(self.SPEC_FILE_OBJECT.get_path()) as f:
            while f.readline() != '#Release: 33%{?dist}\n':
                pass
            assert f.readline() == 'Release: 33' + macro + '%{?dist}\n'

    def test_revert_redefine_release_with_macro(self):
        macro = '%{REBASE_VER}'
        self.SPEC_FILE_OBJECT.redefine_release_with_macro(macro)
        self.SPEC_FILE_OBJECT.revert_redefine_release_with_macro(macro)
        with open(self.SPEC_FILE_OBJECT.get_path()) as f:
            for line in f.readlines():
                if line.startswith('Release:'):
                    assert line == 'Release: 33%{?dist}\n'
                    return
        # the line has to be found, fail if not!
        assert False

    def test_get_extra_version_not_set(self):
        assert self.SPEC_FILE_OBJECT.get_extra_version() == ''

    def test_get_extra_version_set(self):
        self.SPEC_FILE_OBJECT.set_extra_version('rc1')
        assert self.SPEC_FILE_OBJECT.get_extra_version() == 'rc1'

    def test_update_changelog(self):
        changelog = []
        changelog.append('* Mon Jan 01 1970 Rebase-helper <*****@*****.**> - 1.2.3')
        changelog.append('- New upstream version 1.2.3')
        self.SPEC_FILE_OBJECT.insert_changelog(changelog)
        result = self.SPEC_FILE_OBJECT.get_spec_section('%changelog')
        assert changelog[0] == result[0]
        assert changelog[1] == result[1]

    def test_patch_macro(self):
        self.SPEC_FILE_OBJECT._correct_rebased_patches(['4'])
        self.SPEC_FILE_OBJECT._write_spec_file_to_disc()
        expected_patch = ['%patch4 -b .testing4 -p1\n']
        with open(self.SPEC_FILE) as spec:
            lines = spec.readlines()
        lines = [x for x in lines if x.startswith('%patch4')]
        assert expected_patch == lines

    def test_update_setup_dirname(self):
        prep = self.SPEC_FILE_OBJECT.get_spec_section('%prep')
        self.SPEC_FILE_OBJECT.update_setup_dirname('test-1.0.2')
        assert self.SPEC_FILE_OBJECT.get_spec_section('%prep') == prep

        self.SPEC_FILE_OBJECT.update_setup_dirname('test-1.0.2rc1')
        prep = self.SPEC_FILE_OBJECT.get_spec_section('%prep')
        assert '%setup -q -n %{name}-%{REBASE_VER}' in prep

        self.SPEC_FILE_OBJECT.update_setup_dirname('test-1.0.2-rc1')
        prep = self.SPEC_FILE_OBJECT.get_spec_section('%prep')
        assert '%setup -q -n %{name}-%{version}-%{REBASE_EXTRA_VER}' in prep
Exemplo n.º 4
0
class TestSpecFile(BaseTest):
    """ SpecFile tests """

    NAME = "test"
    VERSION = "1.0.2"
    OLD_ARCHIVE = NAME + "-" + VERSION + ".tar.xz"
    SPEC_FILE = "test.spec"
    SOURCE_0 = "test-source.sh"
    SOURCE_1 = "source-tests.sh"
    SOURCE_2 = ""
    SOURCE_4 = "file.txt.bz2"
    SOURCE_5 = "documentation.tar.xz"
    SOURCE_6 = "misc.zip"
    PATCH_1 = "test-testing.patch"
    PATCH_2 = "test-testing2.patch"
    PATCH_3 = "test-testing3.patch"
    PATCH_4 = "test-testing4.patch"
    BUILD_MISSING_LOG = "build_missing.log"
    BUILD_OBSOLETES_LOG = "build_obsoletes.log"

    TEST_FILES = [SPEC_FILE, PATCH_1, PATCH_2, PATCH_3, PATCH_4, BUILD_MISSING_LOG, BUILD_OBSOLETES_LOG]

    def setup(self):
        super(TestSpecFile, self).setup()
        self.SPEC_FILE_OBJECT = SpecFile(self.SPEC_FILE, self.WORKING_DIR, download=False)

    def test_get_release(self):
        match = re.search(r"([0-9.]*[0-9]+)\w*", self.SPEC_FILE_OBJECT.get_release())
        assert match is not None
        assert match.group(1) == self.SPEC_FILE_OBJECT.get_release_number()

    def test_get_release_number(self):
        assert self.SPEC_FILE_OBJECT.get_release_number() == "33"

    def test_set_release_number(self):
        self.SPEC_FILE_OBJECT.set_release_number(0.1)
        assert self.SPEC_FILE_OBJECT.get_release_number() == "0.1"
        self.SPEC_FILE_OBJECT.set_release_number(22)
        assert self.SPEC_FILE_OBJECT.get_release_number() == "22"

    def test_get_version(self):
        assert self.SPEC_FILE_OBJECT.get_version() == self.VERSION

    def test_set_version(self):
        NEW_VERSION = "1.2.3.4.5"
        self.SPEC_FILE_OBJECT.set_version(NEW_VERSION)
        self.SPEC_FILE_OBJECT.save()
        assert self.SPEC_FILE_OBJECT.get_version() == NEW_VERSION

    def test_set_version_using_archive(self):
        NEW_VERSION = "1.2.3.4.5"
        ARCHIVE_NAME = "test-{0}.tar.xz".format(NEW_VERSION)
        self.SPEC_FILE_OBJECT.set_version_using_archive(ARCHIVE_NAME)
        self.SPEC_FILE_OBJECT.save()
        assert self.SPEC_FILE_OBJECT.get_version() == NEW_VERSION

    def test_get_package_name(self):
        assert self.SPEC_FILE_OBJECT.get_package_name() == self.NAME

    def test__write_spec_file_to_disc(self):
        new_content = ["testing line 1\n", "testing line 2\n"]
        self.SPEC_FILE_OBJECT.spec_content = new_content
        self.SPEC_FILE_OBJECT._write_spec_file_to_disc()
        with open(self.SPEC_FILE) as spec:
            assert new_content == spec.readlines()

    def test__get_raw_source_string(self):
        assert self.SPEC_FILE_OBJECT._get_raw_source_string(0) == "ftp://ftp.test.org/%{name}-%{version}.tar.xz"
        assert self.SPEC_FILE_OBJECT._get_raw_source_string(1) == "source-tests.sh"
        assert self.SPEC_FILE_OBJECT._get_raw_source_string(2) == "ftp://test.com/test-source.sh"
        assert self.SPEC_FILE_OBJECT._get_raw_source_string(3) is None

    def test_old_tarball(self):
        assert self.SPEC_FILE_OBJECT.get_archive() == self.OLD_ARCHIVE

    def test_get_sources(self):
        sources = [self.SOURCE_0, self.SOURCE_1, self.SOURCE_4, self.SOURCE_5, self.SOURCE_6, self.OLD_ARCHIVE]
        sources = [os.path.join(self.WORKING_DIR, f) for f in sources]
        assert len(set(sources).intersection(set(self.SPEC_FILE_OBJECT.get_sources()))) == 6
        # The Source0 has to be always in the beginning
        assert self.SPEC_FILE_OBJECT.get_archive() == "test-1.0.2.tar.xz"

    def test_get_patches(self):
        expected_patches = {
            0: [os.path.join(self.WORKING_DIR, self.PATCH_1), 0],
            1: [os.path.join(self.WORKING_DIR, self.PATCH_2), 1],
            2: [os.path.join(self.WORKING_DIR, self.PATCH_3), 2],
            3: [os.path.join(self.WORKING_DIR, self.PATCH_4), 3],
        }
        patches = {}
        for index, p in enumerate(self.SPEC_FILE_OBJECT.get_patches()):
            patches[index] = [p.get_path(), p.get_index()]
        assert patches == expected_patches

    def test_get_requires(self):
        expected = set(["openssl-devel", "pkgconfig", "texinfo", "gettext", "autoconf"])
        req = self.SPEC_FILE_OBJECT.get_requires()
        assert len(expected.intersection(req)) == len(expected)

    def test_get_paths_with_rpm_macros(self):
        raw_paths = [
            "/usr/bin/binary1",
            "/usr/sbin/binary2",
            "/usr/include/header.h",
            "/usr/lib/library1.so",
            "/usr/lib64/library2.so",
            "/usr/libexec/script.sh",
            "/usr/lib/systemd/system/daemond.service",
            "/usr/share/man/man1/test.1.gz",
            "/usr/share/info/file.info",
            "/usr/share/doc/RFC.pdf",
            "/usr/share/config.site",
            "/var/lib/libvirt",
            "/var/tmp/abrt",
            "/var/lock",
        ]

        expected_paths = set(
            [
                "%{_bindir}/binary1",
                "%{_sbindir}/binary2",
                "%{_includedir}/header.h",
                "%{_libdir}/library1.so",
                "%{_libdir}/library2.so",
                "%{_libexecdir}/script.sh",
                "%{_unitdir}/daemond.service",
                "%{_mandir}/man1/test.1.gz",
                "%{_infodir}/file.info",
                "%{_docdir}/RFC.pdf",
                "%{_datarootdir}/config.site",
                "%{_sharedstatedir}/libvirt",
                "%{_tmppath}/abrt",
                "%{_localstatedir}/lock",
            ]
        )
        paths = SpecFile.get_paths_with_rpm_macros(raw_paths)
        assert len(set(paths)) == len(expected_paths)
        assert len(expected_paths.intersection(set(paths))) == len(expected_paths)

    def test_split_version_string(self):
        assert SpecFile.split_version_string() == (None, None, None)
        assert SpecFile.split_version_string("1.0.1") == ("1.0.1", "", "")
        assert SpecFile.split_version_string("1.0.1b1") == ("1.0.1", "b1", "")
        assert SpecFile.split_version_string("1.0.1rc1") == ("1.0.1", "rc1", "")
        assert SpecFile.split_version_string("1.1.3-rc6") == ("1.1.3", "rc6", "-")
        assert SpecFile.split_version_string("1.1.3_rc6") == ("1.1.3", "rc6", "_")
        assert SpecFile.split_version_string(".1.1.1") == ("1.1.1", "", "")

    def test_extract_version_from_archive_name(self):
        # Basic tests
        assert SpecFile.extract_version_from_archive_name("test-1.0.1.tar.gz") == ("1.0.1", "", "")
        assert SpecFile.extract_version_from_archive_name("/home/user/test-1.0.1.tar.gz") == ("1.0.1", "", "")
        assert SpecFile.extract_version_from_archive_name(
            "test-1.0.1.tar.gz", "ftp://ftp.test.org/test-%{version}.tar.gz"
        ) == ("1.0.1", "", "")
        assert SpecFile.extract_version_from_archive_name(
            "/home/user/test-1.0.1.tar.gz", "ftp://ftp.test.org/test-%{version}.tar.gz"
        ) == ("1.0.1", "", "")
        # Real world tests
        name = "http://www.cups.org/software/%{version}/cups-%{version}-source.tar.bz2"
        assert SpecFile.extract_version_from_archive_name("cups-1.7.5-source.tar.bz2", name) == ("1.7.5", "", "")
        # the 'rc1' can't be in the version number
        name = "ftp://ftp.isc.org/isc/bind9/%{VERSION}/bind-%{VERSION}.tar.gz"
        assert SpecFile.extract_version_from_archive_name("bind-9.9.5rc2.tar.gz", name) == ("9.9.5", "rc2", "")
        name = "http://www.thekelleys.org.uk/dnsmasq/%{?extrapath}%{name}-%{version}%{?extraversion}.tar.xz"
        assert SpecFile.extract_version_from_archive_name("dnsmasq-2.69rc1.tar.xz", name) == ("2.69", "rc1", "")
        name = "http://downloads.sourceforge.net/%{name}/%{name}-%{version}%{?prever:-%{prever}}.tar.xz"
        assert SpecFile.extract_version_from_archive_name("log4cplus-1.1.3-rc3.tar.xz", name) == ("1.1.3", "rc3", "-")
        name = "http://downloads.sourceforge.net/%{name}/%{name}-%{version}%{?prever:_%{prever}}.tar.xz"
        assert SpecFile.extract_version_from_archive_name("log4cplus-1.1.3_rc3.tar.xz", name) == ("1.1.3", "rc3", "_")

    def test__split_sections(self):
        expected_sections = {
            0: [
                "%header",
                [
                    "Summary: A testing spec file\n",
                    "Name: test\n",
                    "Version: 1.0.2\n",
                    "Release: 33%{?dist}\n",
                    "License: GPL2+\n",
                    "Group: System Environment\n",
                    "URL: http://testing.org\n",
                    "\n",
                    "# Note: non-current tarballs get moved to the history/ subdirectory,\n",
                    "# so look there if you fail to retrieve the version you want\n",
                    "Source: ftp://ftp.test.org/%{name}-%{version}.tar.xz\n",
                    "Source1: source-tests.sh\n",
                    "Source2: ftp://test.com/test-source.sh\n",
                    "#Source3: source-tests.sh\n",
                    "Source4: file.txt.bz2\n",
                    "Source5: documentation.tar.xz\n",
                    "Source6: misc.zip\n",
                    "Patch1: test-testing.patch\n",
                    "Patch2: test-testing2.patch\n",
                    "Patch3: test-testing3.patch\n",
                    "Patch4: test-testing4.patch\n",
                    "\n",
                    "BuildRequires: openssl-devel, pkgconfig, texinfo, gettext, autoconf\n",
                    "\n",
                ],
            ],
            1: ["%description", ["Testing spec file\n", "\n"]],
            2: ["%package devel", ["Summary: A testing devel package\n", "\n"]],
            3: ["%description devel", ["Testing devel spec file\n", "\n"]],
            4: [
                "%prep",
                [
                    "%setup -q -a 5\n",
                    "%patch1\n",
                    "%patch2 -p1\n",
                    "%patch3 -p1 -b .testing3\n",
                    "%patch4 -p0 -b .testing4\n",
                    "mkdir misc\n",
                    "tar -xf %{SOURCE6} -C misc\n",
                    "\n",
                ],
            ],
            5: ["%build", ["autoreconf -vi\n", "\n", "%configure\n", "make TEST\n", "\n"]],
            6: ["%install", ["make DESTDIR=$RPM_BUILD_ROOT install\n", "\n"]],
            7: [
                "%check",
                [
                    '#to run make check use "--with check"\n',
                    "%if %{?_with_check:1}%{!?_with_check:0}\n",
                    "make check\n",
                    "%endif\n",
                    "\n",
                ],
            ],
            8: ["%files", ["%{_bindir}/file.txt\n", "\n"]],
            9: ["%files devel", ["%{_bindir}/test_example\n", "%{_libdir}/my_test.so\n", "\n"]],
            10: [
                "%changelog",
                [
                    "* Wed Nov 12 2014 Tomas Hozza <*****@*****.**> 1.0.0-33\n",
                    "- Bump the release for testing purposes\n",
                    "\n",
                    "* Tue Sep 24 2013 Petr Hracek <*****@*****.**> 1.0.0-1\n",
                    "- Initial version\n",
                    "\n",
                ],
            ],
        }
        sections = self.SPEC_FILE_OBJECT._split_sections()
        for key, value in six.iteritems(expected_sections):
            assert sections[key][0] == value[0]
            assert sections[key][1] == value[1]

    def test_get_spec_section(self):
        expected_section = ["%{_bindir}/file.txt\n", "\n"]
        section = self.SPEC_FILE_OBJECT.get_spec_section("%files")
        assert section == expected_section

    def test_spec_missing_file(self):
        files = {"missing": ["/usr/bin/test2"]}
        self.SPEC_FILE_OBJECT.modify_spec_files_section(files)
        section = self.SPEC_FILE_OBJECT.get_spec_section("%files")
        expected = [
            "#BEGIN THIS MODIFIED BY REBASE-HELPER\n",
            "%{_bindir}/test2\n",
            "#END THIS MODIFIED BY REBASE-HELPER\n",
            "%{_bindir}/file.txt\n",
            "\n",
        ]
        assert expected == section

    def test_spec_remove_file(self):
        files = {"deleted": ["/usr/lib/test.so"]}
        self.SPEC_FILE_OBJECT.modify_spec_files_section(files)
        section = self.SPEC_FILE_OBJECT.get_spec_section("%files devel")
        assert "%{_libdir}/test.so" not in section

    def test_spec_missing_and_remove_file(self):
        files = {"missing": ["/usr/bin/test2"], "deleted": ["/usr/lib/my_test.so"]}
        self.SPEC_FILE_OBJECT.modify_spec_files_section(files)
        section = self.SPEC_FILE_OBJECT.get_spec_section("%files")
        expected = [
            "#BEGIN THIS MODIFIED BY REBASE-HELPER\n",
            "%{_bindir}/test2\n",
            "#END THIS MODIFIED BY REBASE-HELPER\n",
            "%{_bindir}/file.txt\n",
            "\n",
        ]
        assert expected == section
        section_devel = self.SPEC_FILE_OBJECT.get_spec_section("%files devel")
        expected_devel = [
            "%{_bindir}/test_example\n",
            "#BEGIN THIS MODIFIED BY REBASE-HELPER\n",
            "#%{_libdir}/my_test.so\n\n",
            "#END THIS MODIFIED BY REBASE-HELPER\n",
            "\n",
        ]
        assert expected_devel == section_devel

    def test_spec_missing_from_logfile(self):
        shutil.move("build_missing.log", "build.log")
        files = BuildLogAnalyzer.parse_log(self.WORKING_DIR, "build.log")
        self.SPEC_FILE_OBJECT.modify_spec_files_section(files)
        section = self.SPEC_FILE_OBJECT.get_spec_section("%files")
        expected = [
            "#BEGIN THIS MODIFIED BY REBASE-HELPER\n",
            "%{_bindir}/test2\n",
            "#END THIS MODIFIED BY REBASE-HELPER\n",
            "%{_bindir}/file.txt\n",
            "\n",
        ]
        assert expected == section

    def test_spec_obsolete_from_logfile(self):
        shutil.move("build_obsoletes.log", "build.log")
        files = BuildLogAnalyzer.parse_log(self.WORKING_DIR, "build.log")
        self.SPEC_FILE_OBJECT.modify_spec_files_section(files)
        section = self.SPEC_FILE_OBJECT.get_spec_section("%files")
        assert "%{_libdir}/libtest.so" not in section

    def test_is_test_suite_enabled(self):
        found = self.SPEC_FILE_OBJECT.is_test_suite_enabled()
        assert found is True

    def test_set_extra_version_some_extra_version(self):
        self.SPEC_FILE_OBJECT.set_extra_version("b1")
        with open(self.SPEC_FILE_OBJECT.get_path()) as f:
            # 1st line
            assert f.readline() == "%global REBASE_EXTRA_VER b1\n"
            # 2nd line
            assert f.readline() == "%global REBASE_VER %{version}%{REBASE_EXTRA_VER}\n"
            while True:
                line = f.readline()
                if line == "#Source: ftp://ftp.test.org/%{name}-%{version}.tar.xz\n":
                    break
                assert line is not None
            # there is new Source0 after old commented out entry
            assert f.readline() == "Source: ftp://ftp.test.org/%{name}-%{REBASE_VER}.tar.xz\n"
        # the release number was changed
        assert self.SPEC_FILE_OBJECT.get_release_number() == "0.1"
        # the release string now contains the extra version
        match = re.search(r"([0-9.]*[0-9]+)\.b1\w*", self.SPEC_FILE_OBJECT.get_release())
        assert match is not None
        assert match.group(1) == self.SPEC_FILE_OBJECT.get_release_number()

    def test_set_extra_version_no_extra_version(self):
        self.SPEC_FILE_OBJECT.set_extra_version("")
        with open(self.SPEC_FILE_OBJECT.get_path()) as f:
            # 1st line
            assert f.readline() != "%global REBASE_EXTRA_VER b1\n"
            # 2nd line
            assert f.readline() != "%global REBASE_VER %{version}%{REBASE_EXTRA_VER}\n"
        # the release number was changed
        assert self.SPEC_FILE_OBJECT.get_release_number() == "1"

    def test_redefine_release_with_macro(self):
        macro = "%{REBASE_VER}"
        self.SPEC_FILE_OBJECT.redefine_release_with_macro(macro)
        with open(self.SPEC_FILE_OBJECT.get_path()) as f:
            while f.readline() != "#Release: 33%{?dist}\n":
                pass
            assert f.readline() == "Release: 33" + "." + macro + "%{?dist}\n"

    def test_revert_redefine_release_with_macro(self):
        macro = "%{REBASE_VER}"
        self.SPEC_FILE_OBJECT.redefine_release_with_macro(macro)
        self.SPEC_FILE_OBJECT.revert_redefine_release_with_macro(macro)
        with open(self.SPEC_FILE_OBJECT.get_path()) as f:
            for line in f.readlines():
                if line.startswith("Release:"):
                    assert line == "Release: 33%{?dist}\n"
                    return
        # the line has to be found, fail if not!
        assert False

    def test_get_extra_version_not_set(self):
        assert self.SPEC_FILE_OBJECT.get_extra_version() == ""

    def test_get_extra_version_set(self):
        self.SPEC_FILE_OBJECT.set_extra_version("rc1")
        assert self.SPEC_FILE_OBJECT.get_extra_version() == "rc1"

    def test_update_changelog(self):
        changelog = []
        changelog.append("* Mon Jan 01 1970 Rebase-helper <*****@*****.**> - 1.2.3")
        changelog.append("- New upstream version 1.2.3")
        self.SPEC_FILE_OBJECT.insert_changelog(changelog)
        result = self.SPEC_FILE_OBJECT.get_spec_section("%changelog")
        assert changelog[0] == result[0]
        assert changelog[1] == result[1]

    def test_patch_macro(self):
        self.SPEC_FILE_OBJECT._correct_rebased_patches(["4"])
        self.SPEC_FILE_OBJECT._write_spec_file_to_disc()
        expected_patch = ["%patch4 -b .testing4 -p1\n"]
        with open(self.SPEC_FILE) as spec:
            lines = spec.readlines()
        lines = [x for x in lines if x.startswith("%patch4")]
        assert expected_patch == lines

    def test_update_setup_dirname(self):
        prep = self.SPEC_FILE_OBJECT.get_spec_section("%prep")
        self.SPEC_FILE_OBJECT.update_setup_dirname("test-1.0.2")
        assert self.SPEC_FILE_OBJECT.get_spec_section("%prep") == prep

        self.SPEC_FILE_OBJECT.update_setup_dirname("test-1.0.2rc1")
        prep = self.SPEC_FILE_OBJECT.get_spec_section("%prep")
        assert "%setup -q -a 5 -n %{name}-%{REBASE_VER}" in prep

        self.SPEC_FILE_OBJECT.update_setup_dirname("test-1.0.2-rc1")
        prep = self.SPEC_FILE_OBJECT.get_spec_section("%prep")
        assert "%setup -q -a 5 -n %{name}-%{version}-%{REBASE_EXTRA_VER}" in prep

    def test_find_archive_target_in_prep(self):
        target = self.SPEC_FILE_OBJECT.find_archive_target_in_prep("documentation.tar.xz")
        assert target == "test-1.0.2"
        target = self.SPEC_FILE_OBJECT.find_archive_target_in_prep("misc.zip")
        assert target == "test-1.0.2/misc"
Exemplo n.º 5
0
class TestSpecFile(BaseTest):
    """ SpecFile tests """
    NAME = 'test'
    VERSION = '1.0.2'
    OLD_ARCHIVE = NAME + '-' + VERSION + '.tar.xz'
    SPEC_FILE = 'test.spec'
    SOURCE_0 = 'test-source.sh'
    SOURCE_1 = 'source-tests.sh'
    SOURCE_2 = ''
    SOURCE_4 = 'file.txt.bz2'
    SOURCE_5 = 'documentation.tar.xz'
    SOURCE_6 = 'misc.zip'
    PATCH_1 = 'test-testing.patch'
    PATCH_2 = 'test-testing2.patch'
    PATCH_3 = 'test-testing3.patch'
    PATCH_4 = 'test-testing4.patch'
    BUILD_MISSING_LOG = 'build_missing.log'
    BUILD_OBSOLETES_LOG = 'build_obsoletes.log'

    TEST_FILES = [
        SPEC_FILE,
        PATCH_1,
        PATCH_2,
        PATCH_3,
        PATCH_4,
        BUILD_MISSING_LOG,
        BUILD_OBSOLETES_LOG
    ]

    def setup(self):
        super(TestSpecFile, self).setup()
        self.SPEC_FILE_OBJECT = SpecFile(self.SPEC_FILE, self.WORKING_DIR, download=False)

    def test_get_release(self):
        match = re.search(r'([0-9.]*[0-9]+)\w*', self.SPEC_FILE_OBJECT.get_release())
        assert match is not None
        assert match.group(1) == self.SPEC_FILE_OBJECT.get_release_number()

    def test_get_release_number(self):
        assert self.SPEC_FILE_OBJECT.get_release_number() == '33'

    def test_set_release_number(self):
        self.SPEC_FILE_OBJECT.set_release_number(0.1)
        assert self.SPEC_FILE_OBJECT.get_release_number() == '0.1'
        self.SPEC_FILE_OBJECT.set_release_number(22)
        assert self.SPEC_FILE_OBJECT.get_release_number() == '22'

    def test_get_version(self):
        assert self.SPEC_FILE_OBJECT.get_version() == self.VERSION

    def test_set_version(self):
        NEW_VERSION = '1.2.3.4.5'
        self.SPEC_FILE_OBJECT.set_version(NEW_VERSION)
        self.SPEC_FILE_OBJECT.save()
        assert self.SPEC_FILE_OBJECT.get_version() == NEW_VERSION

    def test_set_version_using_archive(self):
        NEW_VERSION = '1.2.3.4.5'
        ARCHIVE_NAME = 'test-{0}.tar.xz'.format(NEW_VERSION)
        self.SPEC_FILE_OBJECT.set_version_using_archive(ARCHIVE_NAME)
        self.SPEC_FILE_OBJECT.save()
        assert self.SPEC_FILE_OBJECT.get_version() == NEW_VERSION

    def test_get_package_name(self):
        assert self.SPEC_FILE_OBJECT.get_package_name() == self.NAME

    def test__write_spec_file_to_disc(self):
        new_content = [
            'testing line 1\n',
            'testing line 2\n'
        ]
        self.SPEC_FILE_OBJECT.spec_content = new_content
        self.SPEC_FILE_OBJECT._write_spec_file_to_disc()
        with open(self.SPEC_FILE) as spec:
            assert new_content == spec.readlines()

    def test__get_raw_source_string(self):
        assert self.SPEC_FILE_OBJECT._get_raw_source_string(0) == 'ftp://ftp.test.org/%{name}-%{version}.tar.xz'
        assert self.SPEC_FILE_OBJECT._get_raw_source_string(1) == 'source-tests.sh'
        assert self.SPEC_FILE_OBJECT._get_raw_source_string(2) == 'ftp://test.com/test-source.sh'
        assert self.SPEC_FILE_OBJECT._get_raw_source_string(3) is None

    def test_old_tarball(self):
        assert self.SPEC_FILE_OBJECT.get_archive() == self.OLD_ARCHIVE

    def test_get_sources(self):
        sources = [self.SOURCE_0, self.SOURCE_1, self.SOURCE_4, self.SOURCE_5, self.SOURCE_6, self.OLD_ARCHIVE]
        sources = [os.path.join(self.WORKING_DIR, f) for f in sources]
        assert len(set(sources).intersection(set(self.SPEC_FILE_OBJECT.get_sources()))) == 6
        # The Source0 has to be always in the beginning
        assert self.SPEC_FILE_OBJECT.get_archive() == 'test-1.0.2.tar.xz'

    def test_get_patches(self):
        expected_patches = {0: [os.path.join(self.WORKING_DIR, self.PATCH_1), 0],
                            1: [os.path.join(self.WORKING_DIR, self.PATCH_2), 1],
                            2: [os.path.join(self.WORKING_DIR, self.PATCH_3), 2],
                            3: [os.path.join(self.WORKING_DIR, self.PATCH_4), 3]}
        patches = {}
        for index, p in enumerate(self.SPEC_FILE_OBJECT.get_patches()):
            patches[index] = [p.get_path(), p.get_index()]
        assert patches == expected_patches

    def test_get_requires(self):
        expected = set(['openssl-devel', 'pkgconfig', 'texinfo', 'gettext', 'autoconf'])
        req = self.SPEC_FILE_OBJECT.get_requires()
        assert len(expected.intersection(req)) == len(expected)

    def test_get_paths_with_rpm_macros(self):
        raw_paths = ['/usr/bin/binary1',
                     '/usr/sbin/binary2',
                     '/usr/include/header.h',
                     '/usr/lib/library1.so',
                     '/usr/lib64/library2.so',
                     '/usr/libexec/script.sh',
                     '/usr/lib/systemd/system/daemond.service',
                     '/usr/share/man/man1/test.1.gz',
                     '/usr/share/info/file.info',
                     '/usr/share/doc/RFC.pdf',
                     '/usr/share/config.site',
                     '/var/lib/libvirt',
                     '/var/tmp/abrt',
                     '/var/lock']

        expected_paths = set(['%{_bindir}/binary1',
                              '%{_sbindir}/binary2',
                              '%{_includedir}/header.h',
                              '%{_libdir}/library1.so',
                              '%{_libdir}/library2.so',
                              '%{_libexecdir}/script.sh',
                              '%{_unitdir}/daemond.service',
                              '%{_mandir}/man1/test.1.gz',
                              '%{_infodir}/file.info',
                              '%{_docdir}/RFC.pdf',
                              '%{_datarootdir}/config.site',
                              '%{_sharedstatedir}/libvirt',
                              '%{_tmppath}/abrt',
                              '%{_localstatedir}/lock'])
        paths = SpecFile.get_paths_with_rpm_macros(raw_paths)
        assert len(set(paths)) == len(expected_paths)
        assert len(expected_paths.intersection(set(paths))) == len(expected_paths)

    def test_split_version_string(self):
        assert SpecFile.split_version_string() == (None, None, None)
        assert SpecFile.split_version_string('1.0.1') == ('1.0.1', '', '')
        assert SpecFile.split_version_string('1.0.1b1') == ('1.0.1', 'b1', '')
        assert SpecFile.split_version_string('1.0.1rc1') == ('1.0.1', 'rc1', '')
        assert SpecFile.split_version_string('1.1.3-rc6') == ('1.1.3', 'rc6', '-')
        assert SpecFile.split_version_string('1.1.3_rc6') == ('1.1.3', 'rc6', '_')
        assert SpecFile.split_version_string('.1.1.1') == ('1.1.1', '', '')

    def test_extract_version_from_archive_name(self):
        # Basic tests
        assert SpecFile.extract_version_from_archive_name('test-1.0.1.tar.gz') == ('1.0.1', '', '')
        assert SpecFile.extract_version_from_archive_name('/home/user/test-1.0.1.tar.gz') == ('1.0.1', '', '')
        assert SpecFile.extract_version_from_archive_name('test-1.0.1.tar.gz',
                                                          'ftp://ftp.test.org/test-%{version}.tar.gz') == ('1.0.1',
                                                                                                           '',
                                                                                                           '')
        assert SpecFile.extract_version_from_archive_name('/home/user/test-1.0.1.tar.gz',
                                                          'ftp://ftp.test.org/test-%{version}.tar.gz') == ('1.0.1',
                                                                                                           '',
                                                                                                           '')
        # Real world tests
        name = 'http://www.cups.org/software/%{version}/cups-%{version}-source.tar.bz2'
        assert SpecFile.extract_version_from_archive_name('cups-1.7.5-source.tar.bz2',
                                                          name) == ('1.7.5', '', '')
        # the 'rc1' can't be in the version number
        name = 'ftp://ftp.isc.org/isc/bind9/%{VERSION}/bind-%{VERSION}.tar.gz'
        assert SpecFile.extract_version_from_archive_name('bind-9.9.5rc2.tar.gz',
                                                          name) == ('9.9.5', 'rc2', '')
        name = 'http://www.thekelleys.org.uk/dnsmasq/%{?extrapath}%{name}-%{version}%{?extraversion}.tar.xz'
        assert SpecFile.extract_version_from_archive_name('dnsmasq-2.69rc1.tar.xz',
                                                          name) == ('2.69', 'rc1', '')
        name = 'http://downloads.sourceforge.net/%{name}/%{name}-%{version}%{?prever:-%{prever}}.tar.xz'
        assert SpecFile.extract_version_from_archive_name('log4cplus-1.1.3-rc3.tar.xz',
                                                          name) == ('1.1.3', 'rc3', '-')
        name = 'http://downloads.sourceforge.net/%{name}/%{name}-%{version}%{?prever:_%{prever}}.tar.xz'
        assert SpecFile.extract_version_from_archive_name('log4cplus-1.1.3_rc3.tar.xz',
                                                          name) == ('1.1.3', 'rc3', '_')

    def test__split_sections(self):
        expected_sections = {
            0: ['%header', ['Summary: A testing spec file\n',
                            'Name: test\n',
                            'Version: 1.0.2\n',
                            'Release: 33%{?dist}\n',
                            'License: GPL2+\n',
                            'Group: System Environment\n',
                            'URL: http://testing.org\n',
                            '\n',
                            '# Note: non-current tarballs get moved to the history/ subdirectory,\n',
                            '# so look there if you fail to retrieve the version you want\n',
                            'Source: ftp://ftp.test.org/%{name}-%{version}.tar.xz\n',
                            'Source1: source-tests.sh\n',
                            'Source2: ftp://test.com/test-source.sh\n',
                            '#Source3: source-tests.sh\n',
                            'Source4: file.txt.bz2\n',
                            'Source5: documentation.tar.xz\n',
                            'Source6: misc.zip\n',
                            'Patch1: test-testing.patch\n',
                            'Patch2: test-testing2.patch\n',
                            'Patch3: test-testing3.patch\n',
                            'Patch4: test-testing4.patch\n',
                            '\n',
                            'BuildRequires: openssl-devel, pkgconfig, texinfo, gettext, autoconf\n',
                            '\n']],
            1: ['%description', ['Testing spec file\n',
                                 '\n']],
            2: ['%package devel', ['Summary: A testing devel package\n',
                                   '\n']],
            3: ['%description devel', ['Testing devel spec file\n',
                                       '\n']],
            4: ['%prep', ['%setup -q -a 5\n',
                          '%patch1\n',
                          '%patch2 -p1\n',
                          '%patch3 -p1 -b .testing3\n',
                          '%patch4 -p0 -b .testing4\n',
                          'mkdir misc\n',
                          'tar -xf %{SOURCE6} -C misc\n',
                          '\n']],
            5: ['%build', ['autoreconf -vi\n',
                           '\n',
                           '%configure\n',
                           'make TEST\n',
                           '\n']],
            6: ['%install', ['make DESTDIR=$RPM_BUILD_ROOT install\n',
                             '\n']],
            7: ['%check', ['#to run make check use "--with check"\n',
                           '%if %{?_with_check:1}%{!?_with_check:0}\n',
                           'make check\n',
                           '%endif\n',
                           '\n']],
            8: ['%files', ['%{_bindir}/file.txt\n',
                           '\n']],
            9: ['%files devel', ['%{_bindir}/test_example\n',
                                 '%{_libdir}/my_test.so\n',
                                 '\n']],
            10: ['%changelog', ['* Wed Nov 12 2014 Tomas Hozza <*****@*****.**> 1.0.0-33\n',
                                '- Bump the release for testing purposes\n',
                                '\n',
                                '* Tue Sep 24 2013 Petr Hracek <*****@*****.**> 1.0.0-1\n',
                                '- Initial version\n',
                                '\n']]
        }
        sections = self.SPEC_FILE_OBJECT._split_sections()
        for key, value in six.iteritems(expected_sections):
            assert sections[key][0] == value[0]
            assert sections[key][1] == value[1]

    def test_get_spec_section(self):
        expected_section = ['%{_bindir}/file.txt\n',
                            '\n']
        section = self.SPEC_FILE_OBJECT.get_spec_section('%files')
        assert section == expected_section

    def test_spec_missing_file(self):
        files = {'missing': ['/usr/bin/test2']}
        self.SPEC_FILE_OBJECT.modify_spec_files_section(files)
        section = self.SPEC_FILE_OBJECT.get_spec_section('%files')
        expected = ['#BEGIN THIS MODIFIED BY REBASE-HELPER\n',
                    '%{_bindir}/test2\n',
                    '#END THIS MODIFIED BY REBASE-HELPER\n',
                    '%{_bindir}/file.txt\n',
                    '\n']
        assert expected == section

    def test_spec_remove_file(self):
        files = {'deleted': ['/usr/lib/test.so']}
        self.SPEC_FILE_OBJECT.modify_spec_files_section(files)
        section = self.SPEC_FILE_OBJECT.get_spec_section('%files devel')
        assert '%{_libdir}/test.so' not in section

    def test_spec_missing_and_remove_file(self):
        files = {'missing': ['/usr/bin/test2'],
                 'deleted': ['/usr/lib/my_test.so']}
        self.SPEC_FILE_OBJECT.modify_spec_files_section(files)
        section = self.SPEC_FILE_OBJECT.get_spec_section('%files')
        expected = ['#BEGIN THIS MODIFIED BY REBASE-HELPER\n',
                    '%{_bindir}/test2\n',
                    '#END THIS MODIFIED BY REBASE-HELPER\n',
                    '%{_bindir}/file.txt\n',
                    '\n']
        assert expected == section
        section_devel = self.SPEC_FILE_OBJECT.get_spec_section('%files devel')
        expected_devel = ['%{_bindir}/test_example\n',
                          '#BEGIN THIS MODIFIED BY REBASE-HELPER\n',
                          '#%{_libdir}/my_test.so\n\n',
                          '#END THIS MODIFIED BY REBASE-HELPER\n',
                          '\n']
        assert expected_devel == section_devel

    def test_spec_missing_from_logfile(self):
        shutil.move('build_missing.log', 'build.log')
        files = BuildLogAnalyzer.parse_log(self.WORKING_DIR, 'build.log')
        self.SPEC_FILE_OBJECT.modify_spec_files_section(files)
        section = self.SPEC_FILE_OBJECT.get_spec_section('%files')
        expected = ['#BEGIN THIS MODIFIED BY REBASE-HELPER\n',
                    '%{_bindir}/test2\n',
                    '#END THIS MODIFIED BY REBASE-HELPER\n',
                    '%{_bindir}/file.txt\n',
                    '\n']
        assert expected == section

    def test_spec_obsolete_from_logfile(self):
        shutil.move('build_obsoletes.log', 'build.log')
        files = BuildLogAnalyzer.parse_log(self.WORKING_DIR, 'build.log')
        self.SPEC_FILE_OBJECT.modify_spec_files_section(files)
        section = self.SPEC_FILE_OBJECT.get_spec_section('%files')
        assert '%{_libdir}/libtest.so' not in section

    def test_is_test_suite_enabled(self):
        found = self.SPEC_FILE_OBJECT.is_test_suite_enabled()
        assert found is True

    def test_set_extra_version_some_extra_version(self):
        self.SPEC_FILE_OBJECT.set_extra_version('b1')
        with open(self.SPEC_FILE_OBJECT.get_path()) as f:
            # 1st line
            assert f.readline() == '%global REBASE_EXTRA_VER b1\n'
            # 2nd line
            assert f.readline() == '%global REBASE_VER %{version}%{REBASE_EXTRA_VER}\n'
            while True:
                line = f.readline()
                if line == '#Source: ftp://ftp.test.org/%{name}-%{version}.tar.xz\n':
                    break
                assert line is not None
            # there is new Source0 after old commented out entry
            assert f.readline() == 'Source: ftp://ftp.test.org/%{name}-%{REBASE_VER}.tar.xz\n'
        # the release number was changed
        assert self.SPEC_FILE_OBJECT.get_release_number() == '0.1'
        # the release string now contains the extra version
        match = re.search(r'([0-9.]*[0-9]+)\.b1\w*', self.SPEC_FILE_OBJECT.get_release())
        assert match is not None
        assert match.group(1) == self.SPEC_FILE_OBJECT.get_release_number()

    def test_set_extra_version_no_extra_version(self):
        self.SPEC_FILE_OBJECT.set_extra_version('')
        with open(self.SPEC_FILE_OBJECT.get_path()) as f:
            # 1st line
            assert f.readline() != '%global REBASE_EXTRA_VER b1\n'
            # 2nd line
            assert f.readline() != '%global REBASE_VER %{version}%{REBASE_EXTRA_VER}\n'
        # the release number was changed
        assert self.SPEC_FILE_OBJECT.get_release_number() == '1'

    def test_redefine_release_with_macro(self):
        macro = '%{REBASE_VER}'
        self.SPEC_FILE_OBJECT.redefine_release_with_macro(macro)
        with open(self.SPEC_FILE_OBJECT.get_path()) as f:
            while f.readline() != '#Release: 33%{?dist}\n':
                pass
            assert f.readline() == 'Release: 33' + '.' + macro + '%{?dist}\n'

    def test_revert_redefine_release_with_macro(self):
        macro = '%{REBASE_VER}'
        self.SPEC_FILE_OBJECT.redefine_release_with_macro(macro)
        self.SPEC_FILE_OBJECT.revert_redefine_release_with_macro(macro)
        with open(self.SPEC_FILE_OBJECT.get_path()) as f:
            for line in f.readlines():
                if line.startswith('Release:'):
                    assert line == 'Release: 33%{?dist}\n'
                    return
        # the line has to be found, fail if not!
        assert False

    def test_get_extra_version_not_set(self):
        assert self.SPEC_FILE_OBJECT.get_extra_version() == ''

    def test_get_extra_version_set(self):
        self.SPEC_FILE_OBJECT.set_extra_version('rc1')
        assert self.SPEC_FILE_OBJECT.get_extra_version() == 'rc1'

    def test_update_changelog(self):
        changelog = []
        changelog.append('* Mon Jan 01 1970 Rebase-helper <*****@*****.**> - 1.2.3')
        changelog.append('- New upstream version 1.2.3')
        self.SPEC_FILE_OBJECT.insert_changelog(changelog)
        result = self.SPEC_FILE_OBJECT.get_spec_section('%changelog')
        assert changelog[0] == result[0]
        assert changelog[1] == result[1]

    def test_patch_macro(self):
        self.SPEC_FILE_OBJECT._correct_rebased_patches(['4'])
        self.SPEC_FILE_OBJECT._write_spec_file_to_disc()
        expected_patch = ['%patch4 -b .testing4 -p1\n']
        with open(self.SPEC_FILE) as spec:
            lines = spec.readlines()
        lines = [x for x in lines if x.startswith('%patch4')]
        assert expected_patch == lines

    def test_update_setup_dirname(self):
        prep = self.SPEC_FILE_OBJECT.get_spec_section('%prep')
        self.SPEC_FILE_OBJECT.update_setup_dirname('test-1.0.2')
        assert self.SPEC_FILE_OBJECT.get_spec_section('%prep') == prep

        self.SPEC_FILE_OBJECT.update_setup_dirname('test-1.0.2rc1')
        prep = self.SPEC_FILE_OBJECT.get_spec_section('%prep')
        assert '%setup -q -a 5 -n %{name}-%{REBASE_VER}' in prep

        self.SPEC_FILE_OBJECT.update_setup_dirname('test-1.0.2-rc1')
        prep = self.SPEC_FILE_OBJECT.get_spec_section('%prep')
        assert '%setup -q -a 5 -n %{name}-%{version}-%{REBASE_EXTRA_VER}' in prep

    def test_find_archive_target_in_prep(self):
        target = self.SPEC_FILE_OBJECT.find_archive_target_in_prep('documentation.tar.xz')
        assert target == 'test-1.0.2'
        target = self.SPEC_FILE_OBJECT.find_archive_target_in_prep('misc.zip')
        assert target == 'test-1.0.2/misc'