Esempio n. 1
0
class ExtractSourcePackageFilesTest(TestCase):
    """
    Tests for the task
    :class:`distro_tracker.extract_source_files.ExtractSourcePackageFiles`.
    """
    def setUp(self):
        self.task = ExtractSourcePackageFiles()
        self.srcpkg = self.create_source_package()

    def run_task(self, force_update=False):
        """
        Initiates the task run.

        :param bool force_update: force a full run
        """
        if force_update:
            self.task.initialize(force_update=True)
        self.task.execute()

    def setup_debian_dir(self, pkg_directory, files_to_create=None,
                         extra_files=[], contents=b'Contents'):
        debian_dir = os.path.join(pkg_directory, 'debian')
        os.makedirs(debian_dir)
        if files_to_create is None:
            files_to_create = self.task.ALL_FILES_TO_EXTRACT

        for file_name in itertools.chain(files_to_create, extra_files):
            file_path = os.path.join(debian_dir, file_name)
            with open(file_path, 'wb') as f:
                f.write(contents)

        return debian_dir

    def assertExtractedFilesInDB(self, expected=None):
        if expected is None:
            expected = self.task.ALL_FILES_TO_EXTRACT
        expected = set(expected)
        extracted = set([
            x.name for x in self.srcpkg.extracted_source_files.all()
        ])
        self.assertSetEqual(expected, extracted)

    def test_create_extracted_files(self, mock_cache):
        """
        Tests that the task creates an
        :class:`distro_tracker.core.models.ExtractedSourceFile` instance.
        """
        with make_temp_directory('dtracker-pkg-dir') as pkg_directory:
            mock_cache.return_value = pkg_directory
            self.setup_debian_dir(pkg_directory, ['changelog'])
            self.run_task()

        self.assertExtractedFilesInDB(['changelog'])

    def test_create_extracted_files_only_wanted_files(self, mock_cache):
        """
        Tests that the task creates an
        :class:`distro_tracker.core.models.ExtractedSourceFile` instance.
        """
        with make_temp_directory('dtracker-pkg-dir') as pkg_directory:
            mock_cache.return_value = pkg_directory
            self.setup_debian_dir(pkg_directory, extra_files=['other-file'])
            self.run_task()

        self.assertExtractedFilesInDB()

    def test_create_extracted_files_with_non_utf8_content(self, mock_cache):
        """
        Tests that the task creates an
        :class:`distro_tracker.core.models.ExtractedSourceFile` instance
        even when the content of the file is not valid UTF-8.
        """
        with make_temp_directory('dtracker-pkg-dir') as pkg_directory:
            mock_cache.return_value = pkg_directory
            self.setup_debian_dir(pkg_directory, ['changelog'],
                                  contents='Raphaël'.encode('latin1'))
            self.run_task()

        self.assertExtractedFilesInDB(['changelog'])

    def test_task_force_update_no_existing_files(self, mock_cache):
        """
        Test that the force_update mode extracts missing files for already
        processed source packages.
        """
        self.task.item_mark_processed(self.srcpkg)

        with make_temp_directory('dtracker-pkg-dir') as pkg_directory:
            mock_cache.return_value = pkg_directory
            self.setup_debian_dir(pkg_directory)
            self.run_task(force_update=True)

        self.assertExtractedFilesInDB()

    def test_task_with_existing_files(self, mock_cache):
        """
        Ensure task doesn't overwrite existing files when it re-process
        a package that was already processed.
        """
        # Make a previously extracted file.
        original_content = b'Original content'
        self.srcpkg.extracted_source_files.create(
            name='changelog',
            extracted_file=ContentFile(original_content, name='changelog'))

        with make_temp_directory('dtracker-pkg-dir') as pkg_directory:
            mock_cache.return_value = pkg_directory
            self.setup_debian_dir(pkg_directory)
            self.run_task()

        self.assertExtractedFilesInDB()

        # Check that the existing file was not changed.
        extracted_file = ExtractedSourceFile.objects.get(
            name='changelog', source_package=self.srcpkg)
        extracted_file.extracted_file.open()
        content = extracted_file.extracted_file.read()
        extracted_file.extracted_file.close()
        self.assertEqual(original_content, content)

    def test_task_remove_unwanted_file(self, mock_cache):
        # Make a previously extracted file that we no longer extract
        original_content = 'Original content'
        ExtractedSourceFile.objects.create(
            source_package=self.srcpkg,
            name='we-dont-want-this-any-more',
            extracted_file=ContentFile(original_content, name='changelog'))

        with make_temp_directory('dtracker-pkg-dir') as pkg_directory:
            mock_cache.return_value = pkg_directory
            self.setup_debian_dir(pkg_directory)
            self.run_task()

        self.assertExtractedFilesInDB()