# -*- coding: utf-8 -*- # SPDX-License-Identifier: GPL-2.0+ # # Copyright 2017 Google, Inc # import contextlib import os import re import shutil import sys import tempfile import unittest from io import StringIO import gitutil import patchstream import settings import tools @contextlib.contextmanager def capture(): import sys oldout,olderr = sys.stdout, sys.stderr try: out=[StringIO(), StringIO()] sys.stdout,sys.stderr = out yield out finally: sys.stdout,sys.stderr = oldout, olderr out[0] = out[0].getvalue() out[1] = out[1].getvalue() class TestFunctional(unittest.TestCase): def setUp(self): self.tmpdir = tempfile.mkdtemp(prefix='patman.') def tearDown(self): shutil.rmtree(self.tmpdir) @staticmethod def GetPath(fname): return os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), 'test', fname) @classmethod def GetText(self, fname): return open(self.GetPath(fname), encoding='utf-8').read() @classmethod def GetPatchName(self, subject): fname = re.sub('[ :]', '-', subject) return fname.replace('--', '-') def CreatePatchesForTest(self, series): cover_fname = None fname_list = [] for i, commit in enumerate(series.commits): clean_subject = self.GetPatchName(commit.subject) src_fname = '%04d-%s.patch' % (i + 1, clean_subject[:52]) fname = os.path.join(self.tmpdir, src_fname) shutil.copy(self.GetPath(src_fname), fname) fname_list.append(fname) if series.get('cover'): src_fname = '0000-cover-letter.patch' cover_fname = os.path.join(self.tmpdir, src_fname) fname = os.path.join(self.tmpdir, src_fname) shutil.copy(self.GetPath(src_fname), fname) return cover_fname, fname_list def testBasic(self): """Tests the basic flow of patman This creates a series from some hard-coded patches build from a simple tree with the following metadata in the top commit: Series-to: u-boot Series-prefix: RFC Series-cc: Stefan Brüns Cover-letter-cc: Lord Mëlchett Series-version: 2 Series-changes: 4 - Some changes Cover-letter: test: A test patch series This is a test of how the cover leter works END and this in the first commit: Series-notes: some notes about some things from the first commit END Commit-notes: Some notes about the first commit END with the following commands: git log -n2 --reverse >/path/to/tools/patman/test/test01.txt git format-patch --subject-prefix RFC --cover-letter HEAD~2 mv 00* /path/to/tools/patman/test It checks these aspects: - git log can be processed by patchstream - emailing patches uses the correct command - CC file has information on each commit - cover letter has the expected text and subject - each patch has the correct subject - dry-run information prints out correctly - unicode is handled correctly - Series-to, Series-cc, Series-prefix, Cover-letter - Cover-letter-cc, Series-version, Series-changes, Series-notes - Commit-notes """ process_tags = True ignore_bad_tags = True stefan = b'Stefan Br\xc3\xbcns '.decode('utf-8') rick = 'Richard III ' mel = b'Lord M\xc3\xablchett '.decode('utf-8') ed = b'Lond Edmund Blackadd\xc3\xabr