xref: /OK3568_Linux_fs/u-boot/tools/patman/test.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun# -*- coding: utf-8 -*-
2*4882a593Smuzhiyun#
3*4882a593Smuzhiyun# Copyright (c) 2011 The Chromium OS Authors.
4*4882a593Smuzhiyun#
5*4882a593Smuzhiyun# SPDX-License-Identifier:	GPL-2.0+
6*4882a593Smuzhiyun#
7*4882a593Smuzhiyun
8*4882a593Smuzhiyunimport os
9*4882a593Smuzhiyunimport tempfile
10*4882a593Smuzhiyunimport unittest
11*4882a593Smuzhiyun
12*4882a593Smuzhiyunimport checkpatch
13*4882a593Smuzhiyunimport gitutil
14*4882a593Smuzhiyunimport patchstream
15*4882a593Smuzhiyunimport series
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun
18*4882a593Smuzhiyunclass TestPatch(unittest.TestCase):
19*4882a593Smuzhiyun    """Test this program
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun    TODO: Write tests for the rest of the functionality
22*4882a593Smuzhiyun    """
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun    def testBasic(self):
25*4882a593Smuzhiyun        """Test basic filter operation"""
26*4882a593Smuzhiyun        data='''
27*4882a593Smuzhiyun
28*4882a593SmuzhiyunFrom 656c9a8c31fa65859d924cd21da920d6ba537fad Mon Sep 17 00:00:00 2001
29*4882a593SmuzhiyunFrom: Simon Glass <sjg@chromium.org>
30*4882a593SmuzhiyunDate: Thu, 28 Apr 2011 09:58:51 -0700
31*4882a593SmuzhiyunSubject: [PATCH (resend) 3/7] Tegra2: Add more clock support
32*4882a593Smuzhiyun
33*4882a593SmuzhiyunThis adds functions to enable/disable clocks and reset to on-chip peripherals.
34*4882a593Smuzhiyun
35*4882a593Smuzhiyuncmd/pci.c:152:11: warning: format ‘%llx’ expects argument of type
36*4882a593Smuzhiyun   ‘long long unsigned int’, but argument 3 has type
37*4882a593Smuzhiyun   ‘u64 {aka long unsigned int}’ [-Wformat=]
38*4882a593Smuzhiyun
39*4882a593SmuzhiyunBUG=chromium-os:13875
40*4882a593SmuzhiyunTEST=build U-Boot for Seaboard, boot
41*4882a593Smuzhiyun
42*4882a593SmuzhiyunChange-Id: I80fe1d0c0b7dd10aa58ce5bb1d9290b6664d5413
43*4882a593Smuzhiyun
44*4882a593SmuzhiyunReview URL: http://codereview.chromium.org/6900006
45*4882a593Smuzhiyun
46*4882a593SmuzhiyunSigned-off-by: Simon Glass <sjg@chromium.org>
47*4882a593Smuzhiyun---
48*4882a593Smuzhiyun arch/arm/cpu/armv7/tegra2/Makefile         |    2 +-
49*4882a593Smuzhiyun arch/arm/cpu/armv7/tegra2/ap20.c           |   57 ++----
50*4882a593Smuzhiyun arch/arm/cpu/armv7/tegra2/clock.c          |  163 +++++++++++++++++
51*4882a593Smuzhiyun'''
52*4882a593Smuzhiyun        expected='''
53*4882a593Smuzhiyun
54*4882a593SmuzhiyunFrom 656c9a8c31fa65859d924cd21da920d6ba537fad Mon Sep 17 00:00:00 2001
55*4882a593SmuzhiyunFrom: Simon Glass <sjg@chromium.org>
56*4882a593SmuzhiyunDate: Thu, 28 Apr 2011 09:58:51 -0700
57*4882a593SmuzhiyunSubject: [PATCH (resend) 3/7] Tegra2: Add more clock support
58*4882a593Smuzhiyun
59*4882a593SmuzhiyunThis adds functions to enable/disable clocks and reset to on-chip peripherals.
60*4882a593Smuzhiyun
61*4882a593Smuzhiyuncmd/pci.c:152:11: warning: format ‘%llx’ expects argument of type
62*4882a593Smuzhiyun   ‘long long unsigned int’, but argument 3 has type
63*4882a593Smuzhiyun   ‘u64 {aka long unsigned int}’ [-Wformat=]
64*4882a593Smuzhiyun
65*4882a593SmuzhiyunSigned-off-by: Simon Glass <sjg@chromium.org>
66*4882a593Smuzhiyun---
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun arch/arm/cpu/armv7/tegra2/Makefile         |    2 +-
69*4882a593Smuzhiyun arch/arm/cpu/armv7/tegra2/ap20.c           |   57 ++----
70*4882a593Smuzhiyun arch/arm/cpu/armv7/tegra2/clock.c          |  163 +++++++++++++++++
71*4882a593Smuzhiyun'''
72*4882a593Smuzhiyun        out = ''
73*4882a593Smuzhiyun        inhandle, inname = tempfile.mkstemp()
74*4882a593Smuzhiyun        infd = os.fdopen(inhandle, 'w')
75*4882a593Smuzhiyun        infd.write(data)
76*4882a593Smuzhiyun        infd.close()
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun        exphandle, expname = tempfile.mkstemp()
79*4882a593Smuzhiyun        expfd = os.fdopen(exphandle, 'w')
80*4882a593Smuzhiyun        expfd.write(expected)
81*4882a593Smuzhiyun        expfd.close()
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun        patchstream.FixPatch(None, inname, series.Series(), None)
84*4882a593Smuzhiyun        rc = os.system('diff -u %s %s' % (inname, expname))
85*4882a593Smuzhiyun        self.assertEqual(rc, 0)
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun        os.remove(inname)
88*4882a593Smuzhiyun        os.remove(expname)
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun    def GetData(self, data_type):
91*4882a593Smuzhiyun        data='''From 4924887af52713cabea78420eff03badea8f0035 Mon Sep 17 00:00:00 2001
92*4882a593SmuzhiyunFrom: Simon Glass <sjg@chromium.org>
93*4882a593SmuzhiyunDate: Thu, 7 Apr 2011 10:14:41 -0700
94*4882a593SmuzhiyunSubject: [PATCH 1/4] Add microsecond boot time measurement
95*4882a593Smuzhiyun
96*4882a593SmuzhiyunThis defines the basics of a new boot time measurement feature. This allows
97*4882a593Smuzhiyunlogging of very accurate time measurements as the boot proceeds, by using
98*4882a593Smuzhiyunan available microsecond counter.
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun%s
101*4882a593Smuzhiyun---
102*4882a593Smuzhiyun README              |   11 ++++++++
103*4882a593Smuzhiyun MAINTAINERS         |    3 ++
104*4882a593Smuzhiyun common/bootstage.c  |   50 ++++++++++++++++++++++++++++++++++++
105*4882a593Smuzhiyun include/bootstage.h |   71 +++++++++++++++++++++++++++++++++++++++++++++++++++
106*4882a593Smuzhiyun include/common.h    |    8 ++++++
107*4882a593Smuzhiyun 5 files changed, 141 insertions(+), 0 deletions(-)
108*4882a593Smuzhiyun create mode 100644 common/bootstage.c
109*4882a593Smuzhiyun create mode 100644 include/bootstage.h
110*4882a593Smuzhiyun
111*4882a593Smuzhiyundiff --git a/README b/README
112*4882a593Smuzhiyunindex 6f3748d..f9e4e65 100644
113*4882a593Smuzhiyun--- a/README
114*4882a593Smuzhiyun+++ b/README
115*4882a593Smuzhiyun@@ -2026,6 +2026,17 @@ The following options need to be configured:
116*4882a593Smuzhiyun 		example, some LED's) on your board. At the moment,
117*4882a593Smuzhiyun 		the following checkpoints are implemented:
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun+- Time boot progress
120*4882a593Smuzhiyun+		CONFIG_BOOTSTAGE
121*4882a593Smuzhiyun+
122*4882a593Smuzhiyun+		Define this option to enable microsecond boot stage timing
123*4882a593Smuzhiyun+		on supported platforms. For this to work your platform
124*4882a593Smuzhiyun+		needs to define a function timer_get_us() which returns the
125*4882a593Smuzhiyun+		number of microseconds since reset. This would normally
126*4882a593Smuzhiyun+		be done in your SOC or board timer.c file.
127*4882a593Smuzhiyun+
128*4882a593Smuzhiyun+		You can add calls to bootstage_mark() to set time markers.
129*4882a593Smuzhiyun+
130*4882a593Smuzhiyun - Standalone program support:
131*4882a593Smuzhiyun 		CONFIG_STANDALONE_LOAD_ADDR
132*4882a593Smuzhiyun
133*4882a593Smuzhiyundiff --git a/MAINTAINERS b/MAINTAINERS
134*4882a593Smuzhiyunindex b167b028ec..beb7dc634f 100644
135*4882a593Smuzhiyun--- a/MAINTAINERS
136*4882a593Smuzhiyun+++ b/MAINTAINERS
137*4882a593Smuzhiyun@@ -474,3 +474,8 @@ S:	Maintained
138*4882a593Smuzhiyun T:	git git://git.denx.de/u-boot.git
139*4882a593Smuzhiyun F:	*
140*4882a593Smuzhiyun F:	*/
141*4882a593Smuzhiyun+
142*4882a593Smuzhiyun+BOOTSTAGE
143*4882a593Smuzhiyun+M:	Simon Glass <sjg@chromium.org>
144*4882a593Smuzhiyun+L:	u-boot@lists.denx.de
145*4882a593Smuzhiyun+F:	common/bootstage.c
146*4882a593Smuzhiyundiff --git a/common/bootstage.c b/common/bootstage.c
147*4882a593Smuzhiyunnew file mode 100644
148*4882a593Smuzhiyunindex 0000000..2234c87
149*4882a593Smuzhiyun--- /dev/null
150*4882a593Smuzhiyun+++ b/common/bootstage.c
151*4882a593Smuzhiyun@@ -0,0 +1,37 @@
152*4882a593Smuzhiyun+/*
153*4882a593Smuzhiyun+ * Copyright (c) 2011, Google Inc. All rights reserved.
154*4882a593Smuzhiyun+ *
155*4882a593Smuzhiyun+ * SPDX-License-Identifier:	GPL-2.0+
156*4882a593Smuzhiyun+ */
157*4882a593Smuzhiyun+
158*4882a593Smuzhiyun+/*
159*4882a593Smuzhiyun+ * This module records the progress of boot and arbitrary commands, and
160*4882a593Smuzhiyun+ * permits accurate timestamping of each. The records can optionally be
161*4882a593Smuzhiyun+ * passed to kernel in the ATAGs
162*4882a593Smuzhiyun+ */
163*4882a593Smuzhiyun+
164*4882a593Smuzhiyun+#include <common.h>
165*4882a593Smuzhiyun+
166*4882a593Smuzhiyun+struct bootstage_record {
167*4882a593Smuzhiyun+	u32 time_us;
168*4882a593Smuzhiyun+	const char *name;
169*4882a593Smuzhiyun+};
170*4882a593Smuzhiyun+
171*4882a593Smuzhiyun+static struct bootstage_record record[BOOTSTAGE_COUNT];
172*4882a593Smuzhiyun+
173*4882a593Smuzhiyun+u32 bootstage_mark(enum bootstage_id id, const char *name)
174*4882a593Smuzhiyun+{
175*4882a593Smuzhiyun+	struct bootstage_record *rec = &record[id];
176*4882a593Smuzhiyun+
177*4882a593Smuzhiyun+	/* Only record the first event for each */
178*4882a593Smuzhiyun+%sif (!rec->name) {
179*4882a593Smuzhiyun+		rec->time_us = (u32)timer_get_us();
180*4882a593Smuzhiyun+		rec->name = name;
181*4882a593Smuzhiyun+	}
182*4882a593Smuzhiyun+	if (!rec->name &&
183*4882a593Smuzhiyun+	%ssomething_else) {
184*4882a593Smuzhiyun+		rec->time_us = (u32)timer_get_us();
185*4882a593Smuzhiyun+		rec->name = name;
186*4882a593Smuzhiyun+	}
187*4882a593Smuzhiyun+%sreturn rec->time_us;
188*4882a593Smuzhiyun+}
189*4882a593Smuzhiyun--
190*4882a593Smuzhiyun1.7.3.1
191*4882a593Smuzhiyun'''
192*4882a593Smuzhiyun        signoff = 'Signed-off-by: Simon Glass <sjg@chromium.org>\n'
193*4882a593Smuzhiyun        tab = '	'
194*4882a593Smuzhiyun        indent = '    '
195*4882a593Smuzhiyun        if data_type == 'good':
196*4882a593Smuzhiyun            pass
197*4882a593Smuzhiyun        elif data_type == 'no-signoff':
198*4882a593Smuzhiyun            signoff = ''
199*4882a593Smuzhiyun        elif data_type == 'spaces':
200*4882a593Smuzhiyun            tab = '   '
201*4882a593Smuzhiyun        elif data_type == 'indent':
202*4882a593Smuzhiyun            indent = tab
203*4882a593Smuzhiyun        else:
204*4882a593Smuzhiyun            print('not implemented')
205*4882a593Smuzhiyun        return data % (signoff, tab, indent, tab)
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun    def SetupData(self, data_type):
208*4882a593Smuzhiyun        inhandle, inname = tempfile.mkstemp()
209*4882a593Smuzhiyun        infd = os.fdopen(inhandle, 'w')
210*4882a593Smuzhiyun        data = self.GetData(data_type)
211*4882a593Smuzhiyun        infd.write(data)
212*4882a593Smuzhiyun        infd.close()
213*4882a593Smuzhiyun        return inname
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun    def testGood(self):
216*4882a593Smuzhiyun        """Test checkpatch operation"""
217*4882a593Smuzhiyun        inf = self.SetupData('good')
218*4882a593Smuzhiyun        result = checkpatch.CheckPatch(inf)
219*4882a593Smuzhiyun        self.assertEqual(result.ok, True)
220*4882a593Smuzhiyun        self.assertEqual(result.problems, [])
221*4882a593Smuzhiyun        self.assertEqual(result.errors, 0)
222*4882a593Smuzhiyun        self.assertEqual(result.warnings, 0)
223*4882a593Smuzhiyun        self.assertEqual(result.checks, 0)
224*4882a593Smuzhiyun        self.assertEqual(result.lines, 62)
225*4882a593Smuzhiyun        os.remove(inf)
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun    def testNoSignoff(self):
228*4882a593Smuzhiyun        inf = self.SetupData('no-signoff')
229*4882a593Smuzhiyun        result = checkpatch.CheckPatch(inf)
230*4882a593Smuzhiyun        self.assertEqual(result.ok, False)
231*4882a593Smuzhiyun        self.assertEqual(len(result.problems), 1)
232*4882a593Smuzhiyun        self.assertEqual(result.errors, 1)
233*4882a593Smuzhiyun        self.assertEqual(result.warnings, 0)
234*4882a593Smuzhiyun        self.assertEqual(result.checks, 0)
235*4882a593Smuzhiyun        self.assertEqual(result.lines, 62)
236*4882a593Smuzhiyun        os.remove(inf)
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun    def testSpaces(self):
239*4882a593Smuzhiyun        inf = self.SetupData('spaces')
240*4882a593Smuzhiyun        result = checkpatch.CheckPatch(inf)
241*4882a593Smuzhiyun        self.assertEqual(result.ok, False)
242*4882a593Smuzhiyun        self.assertEqual(len(result.problems), 3)
243*4882a593Smuzhiyun        self.assertEqual(result.errors, 0)
244*4882a593Smuzhiyun        self.assertEqual(result.warnings, 3)
245*4882a593Smuzhiyun        self.assertEqual(result.checks, 0)
246*4882a593Smuzhiyun        self.assertEqual(result.lines, 62)
247*4882a593Smuzhiyun        os.remove(inf)
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun    def testIndent(self):
250*4882a593Smuzhiyun        inf = self.SetupData('indent')
251*4882a593Smuzhiyun        result = checkpatch.CheckPatch(inf)
252*4882a593Smuzhiyun        self.assertEqual(result.ok, False)
253*4882a593Smuzhiyun        self.assertEqual(len(result.problems), 1)
254*4882a593Smuzhiyun        self.assertEqual(result.errors, 0)
255*4882a593Smuzhiyun        self.assertEqual(result.warnings, 0)
256*4882a593Smuzhiyun        self.assertEqual(result.checks, 1)
257*4882a593Smuzhiyun        self.assertEqual(result.lines, 62)
258*4882a593Smuzhiyun        os.remove(inf)
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun
261*4882a593Smuzhiyunif __name__ == "__main__":
262*4882a593Smuzhiyun    unittest.main()
263*4882a593Smuzhiyun    gitutil.RunTests()
264