summaryrefslogtreecommitdiffstats
path: root/test-runner/android/test/PerformanceTestBase.java
blob: 572a9b8137a969a2489adf1fece664b18dc3288e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.test;

import android.os.Bundle;
import android.os.PerformanceCollector;
import android.os.PerformanceCollector.PerformanceResultsWriter;

import java.lang.reflect.Method;

/**
 * Provides hooks and wrappers to automatically and manually collect and report
 * performance data in tests.
 *
 * {@hide} Pending approval for public API.
 */
public class PerformanceTestBase extends InstrumentationTestCase implements PerformanceTestCase {

    private static PerformanceCollector sPerfCollector = new PerformanceCollector();
    private static int sNumTestMethods = 0;
    private static int sNumTestMethodsLeft = 0;

    // Count number of tests, used to emulate beforeClass and afterClass from JUnit4
    public PerformanceTestBase() {
        if (sNumTestMethods == 0) {
            Method methods[] = getClass().getMethods();
            for (Method m : methods) {
                if (m.getName().startsWith("test")) {
                    sNumTestMethods ++;
                    sNumTestMethodsLeft ++;
                }
            }
        }
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        // @beforeClass
        // Will skew timing measured by TestRunner, but not by PerformanceCollector
        if (sNumTestMethodsLeft == sNumTestMethods) {
            sPerfCollector.beginSnapshot(this.getClass().getName());
        }
    }

    @Override
    protected void tearDown() throws Exception {
        // @afterClass
        // Will skew timing measured by TestRunner, but not by PerformanceCollector
        if (--sNumTestMethodsLeft == 0) {
            sPerfCollector.endSnapshot();
        }
        super.tearDown();
    }

    public void setPerformanceResultsWriter(PerformanceResultsWriter writer) {
        sPerfCollector.setPerformanceResultsWriter(writer);
    }

    /**
     * @see PerformanceCollector#beginSnapshot(String)
     */
    protected void beginSnapshot(String label) {
        sPerfCollector.beginSnapshot(label);
    }

    /**
     * @see PerformanceCollector#endSnapshot()
     */
    protected Bundle endSnapshot() {
        return sPerfCollector.endSnapshot();
    }

    /**
     * @see PerformanceCollector#startTiming(String)
     */
    protected void startTiming(String label) {
        sPerfCollector.startTiming(label);
    }

    /**
     * @see PerformanceCollector#addIteration(String)
     */
    protected Bundle addIteration(String label) {
        return sPerfCollector.addIteration(label);
    }

    /**
     * @see PerformanceCollector#stopTiming(String)
     */
    protected Bundle stopTiming(String label) {
        return sPerfCollector.stopTiming(label);
    }

    public int startPerformance(PerformanceTestCase.Intermediates intermediates) {
        return 0;
    }

    public boolean isPerformanceOnly() {
        return true;
    }
}