xref: /openbmc/u-boot/tools/patman/test.py (revision 4ac5df4b)
12eb5fc13SSimon Glass# -*- coding: utf-8 -*-
283d290c5STom Rini# SPDX-License-Identifier: GPL-2.0+
30d24de9dSSimon Glass#
40d24de9dSSimon Glass# Copyright (c) 2011 The Chromium OS Authors.
50d24de9dSSimon Glass#
60d24de9dSSimon Glass
70d24de9dSSimon Glassimport os
80d24de9dSSimon Glassimport tempfile
90d24de9dSSimon Glassimport unittest
100d24de9dSSimon Glass
110d24de9dSSimon Glassimport checkpatch
120d24de9dSSimon Glassimport gitutil
130d24de9dSSimon Glassimport patchstream
140d24de9dSSimon Glassimport series
150d24de9dSSimon Glass
160d24de9dSSimon Glass
170d24de9dSSimon Glassclass TestPatch(unittest.TestCase):
180d24de9dSSimon Glass    """Test this program
190d24de9dSSimon Glass
200d24de9dSSimon Glass    TODO: Write tests for the rest of the functionality
210d24de9dSSimon Glass    """
220d24de9dSSimon Glass
230d24de9dSSimon Glass    def testBasic(self):
240d24de9dSSimon Glass        """Test basic filter operation"""
250d24de9dSSimon Glass        data='''
260d24de9dSSimon Glass
270d24de9dSSimon GlassFrom 656c9a8c31fa65859d924cd21da920d6ba537fad Mon Sep 17 00:00:00 2001
280d24de9dSSimon GlassFrom: Simon Glass <sjg@chromium.org>
290d24de9dSSimon GlassDate: Thu, 28 Apr 2011 09:58:51 -0700
300d24de9dSSimon GlassSubject: [PATCH (resend) 3/7] Tegra2: Add more clock support
310d24de9dSSimon Glass
320d24de9dSSimon GlassThis adds functions to enable/disable clocks and reset to on-chip peripherals.
330d24de9dSSimon Glass
342eb5fc13SSimon Glasscmd/pci.c:152:11: warning: format ‘%llx’ expects argument of type
352eb5fc13SSimon Glass   ‘long long unsigned int’, but argument 3 has type
362eb5fc13SSimon Glass   ‘u64 {aka long unsigned int}’ [-Wformat=]
372eb5fc13SSimon Glass
380d24de9dSSimon GlassBUG=chromium-os:13875
390d24de9dSSimon GlassTEST=build U-Boot for Seaboard, boot
400d24de9dSSimon Glass
410d24de9dSSimon GlassChange-Id: I80fe1d0c0b7dd10aa58ce5bb1d9290b6664d5413
420d24de9dSSimon Glass
430d24de9dSSimon GlassReview URL: http://codereview.chromium.org/6900006
440d24de9dSSimon Glass
450d24de9dSSimon GlassSigned-off-by: Simon Glass <sjg@chromium.org>
460d24de9dSSimon Glass---
470d24de9dSSimon Glass arch/arm/cpu/armv7/tegra2/Makefile         |    2 +-
480d24de9dSSimon Glass arch/arm/cpu/armv7/tegra2/ap20.c           |   57 ++----
490d24de9dSSimon Glass arch/arm/cpu/armv7/tegra2/clock.c          |  163 +++++++++++++++++
500d24de9dSSimon Glass'''
510d24de9dSSimon Glass        expected='''
520d24de9dSSimon Glass
530d24de9dSSimon GlassFrom 656c9a8c31fa65859d924cd21da920d6ba537fad Mon Sep 17 00:00:00 2001
540d24de9dSSimon GlassFrom: Simon Glass <sjg@chromium.org>
550d24de9dSSimon GlassDate: Thu, 28 Apr 2011 09:58:51 -0700
560d24de9dSSimon GlassSubject: [PATCH (resend) 3/7] Tegra2: Add more clock support
570d24de9dSSimon Glass
580d24de9dSSimon GlassThis adds functions to enable/disable clocks and reset to on-chip peripherals.
590d24de9dSSimon Glass
602eb5fc13SSimon Glasscmd/pci.c:152:11: warning: format ‘%llx’ expects argument of type
612eb5fc13SSimon Glass   ‘long long unsigned int’, but argument 3 has type
622eb5fc13SSimon Glass   ‘u64 {aka long unsigned int}’ [-Wformat=]
632eb5fc13SSimon Glass
640d24de9dSSimon GlassSigned-off-by: Simon Glass <sjg@chromium.org>
650d24de9dSSimon Glass---
66e752edcbSSimon Glass
670d24de9dSSimon Glass arch/arm/cpu/armv7/tegra2/Makefile         |    2 +-
680d24de9dSSimon Glass arch/arm/cpu/armv7/tegra2/ap20.c           |   57 ++----
690d24de9dSSimon Glass arch/arm/cpu/armv7/tegra2/clock.c          |  163 +++++++++++++++++
700d24de9dSSimon Glass'''
710d24de9dSSimon Glass        out = ''
720d24de9dSSimon Glass        inhandle, inname = tempfile.mkstemp()
730d24de9dSSimon Glass        infd = os.fdopen(inhandle, 'w')
740d24de9dSSimon Glass        infd.write(data)
750d24de9dSSimon Glass        infd.close()
760d24de9dSSimon Glass
770d24de9dSSimon Glass        exphandle, expname = tempfile.mkstemp()
780d24de9dSSimon Glass        expfd = os.fdopen(exphandle, 'w')
790d24de9dSSimon Glass        expfd.write(expected)
800d24de9dSSimon Glass        expfd.close()
810d24de9dSSimon Glass
820d24de9dSSimon Glass        patchstream.FixPatch(None, inname, series.Series(), None)
830d24de9dSSimon Glass        rc = os.system('diff -u %s %s' % (inname, expname))
840d24de9dSSimon Glass        self.assertEqual(rc, 0)
850d24de9dSSimon Glass
860d24de9dSSimon Glass        os.remove(inname)
870d24de9dSSimon Glass        os.remove(expname)
880d24de9dSSimon Glass
890d24de9dSSimon Glass    def GetData(self, data_type):
906c328f29SSimon Glass        data='''From 4924887af52713cabea78420eff03badea8f0035 Mon Sep 17 00:00:00 2001
910d24de9dSSimon GlassFrom: Simon Glass <sjg@chromium.org>
920d24de9dSSimon GlassDate: Thu, 7 Apr 2011 10:14:41 -0700
930d24de9dSSimon GlassSubject: [PATCH 1/4] Add microsecond boot time measurement
940d24de9dSSimon Glass
950d24de9dSSimon GlassThis defines the basics of a new boot time measurement feature. This allows
960d24de9dSSimon Glasslogging of very accurate time measurements as the boot proceeds, by using
970d24de9dSSimon Glassan available microsecond counter.
980d24de9dSSimon Glass
990d24de9dSSimon Glass%s
1000d24de9dSSimon Glass---
1010d24de9dSSimon Glass README              |   11 ++++++++
1026c328f29SSimon Glass MAINTAINERS         |    3 ++
1030d24de9dSSimon Glass common/bootstage.c  |   50 ++++++++++++++++++++++++++++++++++++
1040d24de9dSSimon Glass include/bootstage.h |   71 +++++++++++++++++++++++++++++++++++++++++++++++++++
1050d24de9dSSimon Glass include/common.h    |    8 ++++++
1060d24de9dSSimon Glass 5 files changed, 141 insertions(+), 0 deletions(-)
1070d24de9dSSimon Glass create mode 100644 common/bootstage.c
1080d24de9dSSimon Glass create mode 100644 include/bootstage.h
1090d24de9dSSimon Glass
1100d24de9dSSimon Glassdiff --git a/README b/README
1110d24de9dSSimon Glassindex 6f3748d..f9e4e65 100644
1120d24de9dSSimon Glass--- a/README
1130d24de9dSSimon Glass+++ b/README
1140d24de9dSSimon Glass@@ -2026,6 +2026,17 @@ The following options need to be configured:
1150d24de9dSSimon Glass 		example, some LED's) on your board. At the moment,
1160d24de9dSSimon Glass 		the following checkpoints are implemented:
1170d24de9dSSimon Glass
1180d24de9dSSimon Glass+- Time boot progress
1190d24de9dSSimon Glass+		CONFIG_BOOTSTAGE
1200d24de9dSSimon Glass+
1210d24de9dSSimon Glass+		Define this option to enable microsecond boot stage timing
1220d24de9dSSimon Glass+		on supported platforms. For this to work your platform
1230d24de9dSSimon Glass+		needs to define a function timer_get_us() which returns the
1240d24de9dSSimon Glass+		number of microseconds since reset. This would normally
1250d24de9dSSimon Glass+		be done in your SOC or board timer.c file.
1260d24de9dSSimon Glass+
1270d24de9dSSimon Glass+		You can add calls to bootstage_mark() to set time markers.
1280d24de9dSSimon Glass+
1290d24de9dSSimon Glass - Standalone program support:
1300d24de9dSSimon Glass 		CONFIG_STANDALONE_LOAD_ADDR
1310d24de9dSSimon Glass
1326c328f29SSimon Glassdiff --git a/MAINTAINERS b/MAINTAINERS
1336c328f29SSimon Glassindex b167b028ec..beb7dc634f 100644
1346c328f29SSimon Glass--- a/MAINTAINERS
1356c328f29SSimon Glass+++ b/MAINTAINERS
1366c328f29SSimon Glass@@ -474,3 +474,8 @@ S:	Maintained
1376c328f29SSimon Glass T:	git git://git.denx.de/u-boot.git
1386c328f29SSimon Glass F:	*
1396c328f29SSimon Glass F:	*/
1406c328f29SSimon Glass+
1416c328f29SSimon Glass+BOOTSTAGE
1426c328f29SSimon Glass+M:	Simon Glass <sjg@chromium.org>
1436c328f29SSimon Glass+L:	u-boot@lists.denx.de
1446c328f29SSimon Glass+F:	common/bootstage.c
1450d24de9dSSimon Glassdiff --git a/common/bootstage.c b/common/bootstage.c
1460d24de9dSSimon Glassnew file mode 100644
1470d24de9dSSimon Glassindex 0000000..2234c87
1480d24de9dSSimon Glass--- /dev/null
1490d24de9dSSimon Glass+++ b/common/bootstage.c
1506c328f29SSimon Glass@@ -0,0 +1,37 @@
151*fe6ef1e9SChris Packham+%s
1520d24de9dSSimon Glass+/*
1530d24de9dSSimon Glass+ * Copyright (c) 2011, Google Inc. All rights reserved.
1540d24de9dSSimon Glass+ *
1550d24de9dSSimon Glass+ */
1560d24de9dSSimon Glass+
1570d24de9dSSimon Glass+/*
1580d24de9dSSimon Glass+ * This module records the progress of boot and arbitrary commands, and
1590d24de9dSSimon Glass+ * permits accurate timestamping of each. The records can optionally be
1600d24de9dSSimon Glass+ * passed to kernel in the ATAGs
1610d24de9dSSimon Glass+ */
1620d24de9dSSimon Glass+
1630d24de9dSSimon Glass+#include <common.h>
1640d24de9dSSimon Glass+
1650d24de9dSSimon Glass+struct bootstage_record {
1666c328f29SSimon Glass+	u32 time_us;
1670d24de9dSSimon Glass+	const char *name;
1680d24de9dSSimon Glass+};
1690d24de9dSSimon Glass+
1700d24de9dSSimon Glass+static struct bootstage_record record[BOOTSTAGE_COUNT];
1710d24de9dSSimon Glass+
1726c328f29SSimon Glass+u32 bootstage_mark(enum bootstage_id id, const char *name)
1730d24de9dSSimon Glass+{
1740d24de9dSSimon Glass+	struct bootstage_record *rec = &record[id];
1750d24de9dSSimon Glass+
1760d24de9dSSimon Glass+	/* Only record the first event for each */
1770d24de9dSSimon Glass+%sif (!rec->name) {
1786c328f29SSimon Glass+		rec->time_us = (u32)timer_get_us();
1790d24de9dSSimon Glass+		rec->name = name;
1800d24de9dSSimon Glass+	}
181d29fe6e2SSimon Glass+	if (!rec->name &&
182d29fe6e2SSimon Glass+	%ssomething_else) {
1836c328f29SSimon Glass+		rec->time_us = (u32)timer_get_us();
184d29fe6e2SSimon Glass+		rec->name = name;
185d29fe6e2SSimon Glass+	}
1860d24de9dSSimon Glass+%sreturn rec->time_us;
1870d24de9dSSimon Glass+}
1880d24de9dSSimon Glass--
1890d24de9dSSimon Glass1.7.3.1
1900d24de9dSSimon Glass'''
1910d24de9dSSimon Glass        signoff = 'Signed-off-by: Simon Glass <sjg@chromium.org>\n'
192*fe6ef1e9SChris Packham        license = '// SPDX-License-Identifier: GPL-2.0+'
1930d24de9dSSimon Glass        tab = '	'
194d29fe6e2SSimon Glass        indent = '    '
1950d24de9dSSimon Glass        if data_type == 'good':
1960d24de9dSSimon Glass            pass
1970d24de9dSSimon Glass        elif data_type == 'no-signoff':
1980d24de9dSSimon Glass            signoff = ''
199*fe6ef1e9SChris Packham        elif data_type == 'no-license':
200*fe6ef1e9SChris Packham            license = ''
2010d24de9dSSimon Glass        elif data_type == 'spaces':
2020d24de9dSSimon Glass            tab = '   '
203d29fe6e2SSimon Glass        elif data_type == 'indent':
204d29fe6e2SSimon Glass            indent = tab
2050d24de9dSSimon Glass        else:
206a920a17bSPaul Burton            print('not implemented')
207*fe6ef1e9SChris Packham        return data % (signoff, license, tab, indent, tab)
2080d24de9dSSimon Glass
2090d24de9dSSimon Glass    def SetupData(self, data_type):
2100d24de9dSSimon Glass        inhandle, inname = tempfile.mkstemp()
2110d24de9dSSimon Glass        infd = os.fdopen(inhandle, 'w')
2120d24de9dSSimon Glass        data = self.GetData(data_type)
2130d24de9dSSimon Glass        infd.write(data)
2140d24de9dSSimon Glass        infd.close()
2150d24de9dSSimon Glass        return inname
2160d24de9dSSimon Glass
217d29fe6e2SSimon Glass    def testGood(self):
2180d24de9dSSimon Glass        """Test checkpatch operation"""
2190d24de9dSSimon Glass        inf = self.SetupData('good')
220d29fe6e2SSimon Glass        result = checkpatch.CheckPatch(inf)
221d29fe6e2SSimon Glass        self.assertEqual(result.ok, True)
222d29fe6e2SSimon Glass        self.assertEqual(result.problems, [])
223d29fe6e2SSimon Glass        self.assertEqual(result.errors, 0)
224d29fe6e2SSimon Glass        self.assertEqual(result.warnings, 0)
225d29fe6e2SSimon Glass        self.assertEqual(result.checks, 0)
2266c328f29SSimon Glass        self.assertEqual(result.lines, 62)
2270d24de9dSSimon Glass        os.remove(inf)
2280d24de9dSSimon Glass
229d29fe6e2SSimon Glass    def testNoSignoff(self):
2300d24de9dSSimon Glass        inf = self.SetupData('no-signoff')
231d29fe6e2SSimon Glass        result = checkpatch.CheckPatch(inf)
232d29fe6e2SSimon Glass        self.assertEqual(result.ok, False)
233d29fe6e2SSimon Glass        self.assertEqual(len(result.problems), 1)
234d29fe6e2SSimon Glass        self.assertEqual(result.errors, 1)
235d29fe6e2SSimon Glass        self.assertEqual(result.warnings, 0)
236d29fe6e2SSimon Glass        self.assertEqual(result.checks, 0)
2376c328f29SSimon Glass        self.assertEqual(result.lines, 62)
2380d24de9dSSimon Glass        os.remove(inf)
2390d24de9dSSimon Glass
240*fe6ef1e9SChris Packham    def testNoLicense(self):
241*fe6ef1e9SChris Packham        inf = self.SetupData('no-license')
242*fe6ef1e9SChris Packham        result = checkpatch.CheckPatch(inf)
243*fe6ef1e9SChris Packham        self.assertEqual(result.ok, False)
244*fe6ef1e9SChris Packham        self.assertEqual(len(result.problems), 1)
245*fe6ef1e9SChris Packham        self.assertEqual(result.errors, 0)
246*fe6ef1e9SChris Packham        self.assertEqual(result.warnings, 1)
247*fe6ef1e9SChris Packham        self.assertEqual(result.checks, 0)
248*fe6ef1e9SChris Packham        self.assertEqual(result.lines, 62)
249*fe6ef1e9SChris Packham        os.remove(inf)
250*fe6ef1e9SChris Packham
251d29fe6e2SSimon Glass    def testSpaces(self):
2520d24de9dSSimon Glass        inf = self.SetupData('spaces')
253d29fe6e2SSimon Glass        result = checkpatch.CheckPatch(inf)
254d29fe6e2SSimon Glass        self.assertEqual(result.ok, False)
2556c328f29SSimon Glass        self.assertEqual(len(result.problems), 3)
256d29fe6e2SSimon Glass        self.assertEqual(result.errors, 0)
2576c328f29SSimon Glass        self.assertEqual(result.warnings, 3)
258d29fe6e2SSimon Glass        self.assertEqual(result.checks, 0)
2596c328f29SSimon Glass        self.assertEqual(result.lines, 62)
260d29fe6e2SSimon Glass        os.remove(inf)
261d29fe6e2SSimon Glass
262d29fe6e2SSimon Glass    def testIndent(self):
263d29fe6e2SSimon Glass        inf = self.SetupData('indent')
264d29fe6e2SSimon Glass        result = checkpatch.CheckPatch(inf)
265d29fe6e2SSimon Glass        self.assertEqual(result.ok, False)
266d29fe6e2SSimon Glass        self.assertEqual(len(result.problems), 1)
267d29fe6e2SSimon Glass        self.assertEqual(result.errors, 0)
268d29fe6e2SSimon Glass        self.assertEqual(result.warnings, 0)
269d29fe6e2SSimon Glass        self.assertEqual(result.checks, 1)
2706c328f29SSimon Glass        self.assertEqual(result.lines, 62)
2710d24de9dSSimon Glass        os.remove(inf)
2720d24de9dSSimon Glass
2730d24de9dSSimon Glass
2740d24de9dSSimon Glassif __name__ == "__main__":
2750d24de9dSSimon Glass    unittest.main()
2760d24de9dSSimon Glass    gitutil.RunTests()
277