1119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu/*
2119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * Copyright (C) 2016 The Android Open Source Project
3119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu *
4119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * Licensed under the Apache License, Version 2.0 (the "License");
5119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * you may not use this file except in compliance with the License.
6119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * You may obtain a copy of the License at
7119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu *
8119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu *      http://www.apache.org/licenses/LICENSE-2.0
9119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu *
10119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * Unless required by applicable law or agreed to in writing, software
11119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * distributed under the License is distributed on an "AS IS" BASIS,
12119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * See the License for the specific language governing permissions and
14119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * limitations under the License.
15119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu */
16119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu
17119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhupackage android.perftests.utils;
18119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu
19119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhuimport android.support.test.InstrumentationRegistry;
20119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu
21578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhuimport org.junit.rules.TestRule;
22119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhuimport org.junit.runner.Description;
23578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhuimport org.junit.runners.model.Statement;
24119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu
25119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhuimport static junit.framework.Assert.assertFalse;
26119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhuimport static junit.framework.Assert.assertTrue;
27119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu
28119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu/**
29119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * Use this rule to make sure we report the status after the test success.
30119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu *
31119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * <code>
32119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu *
33119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
34119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * @Test public void functionName() {
35119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu *     ...
36119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu *     BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
37119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu *     while (state.keepRunning()) {
38119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu *         // DO YOUR TEST HERE!
39119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu *     }
40119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu *     ...
41119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * }
42119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * </code>
43119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu *
44119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * When test succeeded, the status report will use the key as
45119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * "functionName[optional subTestName]_*"
46119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu *
47119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * Notice that optional subTestName can't be just numbers, that means each sub test needs to have a
48119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu * name when using parameterization.
49119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu */
50119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu
51578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhupublic class PerfStatusReporter implements TestRule {
52119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu    private final BenchmarkState mState = new BenchmarkState();
53119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu
54119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu    public BenchmarkState getBenchmarkState() {
55119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu        return mState;
56119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu    }
57119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu
58119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu    @Override
59578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu    public Statement apply(Statement base, Description description) {
60578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu        return new Statement() {
61578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu            @Override
62578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu            public void evaluate() throws Throwable {
63578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                String invokeMethodName = description.getMethodName();
64578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                // validate and simplify the function name.
65578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                // First, remove the "test" prefix which normally comes from CTS test.
66578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                // Then make sure the [subTestName] is valid, not just numbers like [0].
67578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                if (invokeMethodName.startsWith("test")) {
68578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                    assertTrue("The test name " + invokeMethodName + " is too short",
69578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                            invokeMethodName.length() > 5);
70578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                    invokeMethodName = invokeMethodName.substring(4, 5).toLowerCase()
71578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                            + invokeMethodName.substring(5);
72578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                }
73119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu
74578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                int index = invokeMethodName.lastIndexOf('[');
75578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                if (index > 0) {
76578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                    boolean allDigits = true;
77578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                    for (int i = index + 1; i < invokeMethodName.length() - 1; i++) {
78578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                        if (!Character.isDigit(invokeMethodName.charAt(i))) {
79578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                            allDigits = false;
80578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                            break;
81578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                        }
82578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                    }
83578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                    assertFalse("The name in [] can't contain only digits for " + invokeMethodName,
84578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                            allDigits);
85119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu                }
86119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu
87578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                base.evaluate();
88119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu
89578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                mState.sendFullStatusReport(InstrumentationRegistry.getInstrumentation(),
90578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu                        invokeMethodName);
91578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu            }
92578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu        };
93578f47149d9cc674fd5a0e7f7ce8453cb54d8979Teng-Hui Zhu    }
94119265d05e16c11d84bc51194dd0af6234a7ca4eTeng-Hui Zhu}
95