1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.inputmethod.stresstest; 18 19 import com.android.compatibility.common.util.SystemUtil; 20 21 import org.junit.rules.TestWatcher; 22 import org.junit.runner.Description; 23 24 import java.text.SimpleDateFormat; 25 import java.util.Date; 26 27 /** 28 * Takes a screenshot when the test fails. 29 * 30 * <p>Use {@link com.android.tradefed.device.metric.FilePullerLogCollector} to collect screenshots 31 * taken. 32 * For example, in AndroidTest.xml: 33 * <code> 34 * <metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector"> 35 * <option name="directory-keys" value="/sdcard/MyTest/" /> 36 * <option name="collect-on-run-ended-only" value="true" /> 37 * </metrics_collector> 38 * </code> 39 * in MyTest.java: 40 * <code> 41 * @Rule 42 * public ScreenCaptureRule mScreenCaptureRule = new ScreenCaptureRule("/sdcard/MyTest"); 43 * </code> 44 */ 45 public class ScreenCaptureRule extends TestWatcher { 46 47 private static final String TAG = "ScreenCaptureRule"; 48 49 private final String mOutDir; 50 ScreenCaptureRule(String outDir)51 public ScreenCaptureRule(String outDir) { 52 mOutDir = outDir; 53 } 54 55 @Override failed(Throwable e, Description description)56 protected void failed(Throwable e, Description description) { 57 super.failed(e, description); 58 String time = new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date()); 59 String fileName = "screenshot-" + time + ".png"; 60 capture(fileName); 61 } 62 63 /** Take a screenshot. */ capture(String fileName)64 public void capture(String fileName) { 65 SystemUtil.runCommandAndPrintOnLogcat(TAG, String.format("mkdir -p %s", mOutDir)); 66 SystemUtil.runCommandAndPrintOnLogcat(TAG, 67 String.format("screencap %s/%s", mOutDir, fileName)); 68 } 69 } 70