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