Blob Blame History Raw
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import os
import shutil
import subprocess
import tempfile
import unittest
import sys

import pygit2_wrapper as pygit2

import git_sort
import lib
import tests.support


class TestSeriesInsert(unittest.TestCase):
    def setUp(self):
        os.environ["XDG_CACHE_HOME"] = tempfile.mkdtemp(prefix="gs_cache")

        # setup stub linux repository
        os.environ["LINUX_GIT"] = tempfile.mkdtemp(prefix="gs_repo")
        self.repo = pygit2.init_repository(os.environ["LINUX_GIT"])

        author = pygit2.Signature('Alice Author', 'alice@authors.tld')
        committer = pygit2.Signature('Cecil Committer', 'cecil@committers.tld')
        tree = self.repo.TreeBuilder().write()

        parent = []
        commits = []
        for i in range(3):
            subject = "mainline %d" % (i,)
            cid = self.repo.create_commit(
                "refs/heads/master",
                author,
                committer,
                "%s\n\nlog" % (subject,),
                tree,
                parent
            )
            parent = [cid]
            commits.append(cid)
        self.commits = commits

        self.repo.remotes.create(
            "origin",
            "git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git")
        self.repo.references.create("refs/remotes/origin/master", commits[-1])

        self.index = git_sort.SortIndex(self.repo)

        # setup stub kernel-source content
        self.ks_dir = tempfile.mkdtemp(prefix="gs_ks")
        patch_dir = os.path.join(self.ks_dir, "patches.suse")
        self.si_path = os.path.join(lib.libdir(), "series_insert.py")
        os.mkdir(patch_dir)
        os.chdir(patch_dir)
        for commit in commits:
            tests.support.format_patch(self.repo.get(commit),
                                       mainline="v3.45-rc6")
        series = os.path.join(self.ks_dir, "series.conf");
        content = tests.support.format_series((
            (None,
             ("patches.suse/mainline-%d.patch" % (i,) for i in (0, 2,))),
        ))
        with open(series, mode="w") as f:
            f.write(content)

    def tearDown(self):
        shutil.rmtree(os.environ["XDG_CACHE_HOME"])
        shutil.rmtree(os.environ["LINUX_GIT"])
        shutil.rmtree(self.ks_dir)


    def test_simple(self):
        os.chdir(self.ks_dir)

        series = "series.conf"

        subprocess.check_call([self.si_path, "patches.suse/mainline-1.patch"])
        with open(series) as f:
            content = f.read()
        self.assertEqual(content,
            tests.support.format_series((
                (None,
                 ("patches.suse/mainline-%d.patch" % (i,) for i in range(3))),
            )))

    def test_invalid(self):
        os.chdir(self.ks_dir)

        content = []
        with open("patches.suse/mainline-1.patch") as f:
            for line in f:
                if line.startswith("Git-commit: "):
                    line = "Git-commit: invalid\n"
                content.append(line)
        with open("patches.suse/mainline-1.patch", mode="w+") as f:
            f.writelines(content)

        try:
            subprocess.check_output([self.si_path, "patches.suse/mainline-1.patch"],
                                   stderr=subprocess.STDOUT)
        except subprocess.CalledProcessError as err:
            self.assertEqual(err.returncode, 1)
            self.assertEqual(
                err.output.decode(),
                "Error: Git-commit tag \"invalid\" in patch "
                "\"patches.suse/mainline-1.patch\" is not a valid revision.\n")
        else:
            self.assertTrue(False)

    def test_noheader(self):
        os.chdir(self.ks_dir)

        content = []
        with open("patches.suse/mainline-1.patch") as f:
            for line in f:
                if not line.startswith("Git-commit: ") and not line.startswith("Patch-mainline: "):
                    content.append(line)
        with open("patches.suse/mainline-1.patch", mode="w+") as f:
            f.writelines(content)

        try:
            subprocess.check_output([self.si_path, "patches.suse/mainline-1.patch"],
                                   stderr=subprocess.STDOUT)
        except subprocess.CalledProcessError as err:
            self.assertEqual(err.returncode, 1)
            self.assertEqual(
                err.output.decode(),
                'Error: There is a problem with patch "patches.suse/mainline-1.patch". '
                'The Patch-mainline tag is missing.\n')
        else:
            self.assertTrue(False)


if __name__ == '__main__':
    # Run a single testcase
    suite = unittest.TestLoader().loadTestsFromTestCase(TestSeriesInsert)
    unittest.TextTestRunner(verbosity=2).run(suite)