| Index: gdb/testsuite/gdb.perf/lib/perftest/perftest.py | 
| diff --git a/gdb/testsuite/gdb.perf/lib/perftest/perftest.py b/gdb/testsuite/gdb.perf/lib/perftest/perftest.py | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..e3982303e6225bd904893ed94ffca00f86a1f641 | 
| --- /dev/null | 
| +++ b/gdb/testsuite/gdb.perf/lib/perftest/perftest.py | 
| @@ -0,0 +1,73 @@ | 
| +# Copyright (C) 2013 Free Software Foundation, Inc. | 
| + | 
| +# This program is free software; you can redistribute it and/or modify | 
| +# it under the terms of the GNU General Public License as published by | 
| +# the Free Software Foundation; either version 3 of the License, or | 
| +# (at your option) any later version. | 
| +# | 
| +# This program is distributed in the hope that it will be useful, | 
| +# but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| +# GNU General Public License for more details. | 
| +# | 
| +# You should have received a copy of the GNU General Public License | 
| +# along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
| + | 
| +import testresult | 
| +import reporter | 
| +from measure import Measure | 
| +from measure import MeasurementCpuTime | 
| +from measure import MeasurementWallTime | 
| +from measure import MeasurementVmSize | 
| + | 
| +class TestCase(object): | 
| +    """Base class of all performance testing cases. | 
| + | 
| +    Each sub-class should override methods execute_test, in which | 
| +    several GDB operations are performed and measured by attribute | 
| +    measure.  Sub-class can also override method warm_up optionally | 
| +    if the test case needs warm up. | 
| +    """ | 
| + | 
| +    def __init__(self, name, measure): | 
| +        """Constructor of TestCase. | 
| + | 
| +        Construct an instance of TestCase with a name and a measure | 
| +        which is to measure the test by several different measurements. | 
| +        """ | 
| + | 
| +        self.name = name | 
| +        self.measure = measure | 
| + | 
| +    def execute_test(self): | 
| +        """Abstract method to do the actual tests.""" | 
| +        raise NotImplementedError("Abstract Method.") | 
| + | 
| +    def warm_up(self): | 
| +        """Do some operations to warm up the environment.""" | 
| +        pass | 
| + | 
| +    def run(self, warm_up=True, append=True): | 
| +        """Run this test case. | 
| + | 
| +        It is a template method to invoke method warm_up, | 
| +        execute_test, and finally report the measured results. | 
| +        If parameter warm_up is True, run method warm_up.  If parameter | 
| +        append is True, the test result will be appended instead of | 
| +        overwritten. | 
| +        """ | 
| +        if warm_up: | 
| +            self.warm_up() | 
| + | 
| +        self.execute_test() | 
| +        self.measure.report(reporter.TextReporter(append), self.name) | 
| + | 
| +class TestCaseWithBasicMeasurements(TestCase): | 
| +    """Test case measuring CPU time, wall time and memory usage.""" | 
| + | 
| +    def __init__(self, name): | 
| +        result_factory = testresult.SingleStatisticResultFactory() | 
| +        measurements = [MeasurementCpuTime(result_factory.create_result()), | 
| +                        MeasurementWallTime(result_factory.create_result()), | 
| +                        MeasurementVmSize(result_factory.create_result())] | 
| +        super (TestCaseWithBasicMeasurements, self).__init__ (name, Measure(measurements)) | 
|  |