blob: 8550630e10146916378691166519bc877a21bca6 [file] [log] [blame]
Julien Desprez5eb42492017-01-31 16:16:05 +00001/*
2 * Copyright (C) 2017 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 */
16package com.android.tradefed.suite.checker;
17
Julien Despreza5397f12019-03-28 09:46:16 -070018import com.android.annotations.VisibleForTesting;
Julien Desprez59358372019-07-27 10:44:23 -070019import com.android.tradefed.config.Option;
Julien Desprez5eb42492017-01-31 16:16:05 +000020import com.android.tradefed.device.DeviceNotAvailableException;
21import com.android.tradefed.device.ITestDevice;
22import com.android.tradefed.log.LogUtil.CLog;
Julien Desprez3e4d47d2018-05-23 15:53:40 -070023import com.android.tradefed.suite.checker.StatusCheckerResult.CheckStatus;
Betty Zhou8fd29192019-05-30 10:52:32 -070024import com.android.tradefed.util.ProcessInfo;
Betty Zhoua9ad95c2019-07-15 18:21:05 -070025import com.android.tradefed.util.StreamUtil;
Betty Zhou8fd29192019-05-30 10:52:32 -070026
Julien Desprez5eb42492017-01-31 16:16:05 +000027
28/**
29 * Check if the pid of system_server has changed from before and after a module run. A new pid would
30 * mean a runtime restart occurred during the module run.
31 */
32public class SystemServerStatusChecker implements ISystemStatusChecker {
33
Julien Desprez59358372019-07-27 10:44:23 -070034 @Option(
35 name = "disable-recovery-reboot",
36 description =
37 "If status checker is detected down (no process), attempt to reboot the device."
38 )
39 private boolean mShouldRecover = true;
40
Betty Zhou8fd29192019-05-30 10:52:32 -070041 private ProcessInfo mSystemServerProcess;
Julien Despreze46d9372020-05-15 11:21:58 -070042 private boolean mShouldSkip = false;
Julien Desprez5eb42492017-01-31 16:16:05 +000043
44 /** {@inheritDoc} */
45 @Override
Julien Desprez3e4d47d2018-05-23 15:53:40 -070046 public StatusCheckerResult preExecutionCheck(ITestDevice device)
47 throws DeviceNotAvailableException {
Julien Despreze46d9372020-05-15 11:21:58 -070048 if (mShouldSkip) {
49 return new StatusCheckerResult(CheckStatus.SUCCESS);
50 }
51 // process info relies on a time function fixed after P
52 if (device.getApiLevel() < 29) {
53 mShouldSkip = true;
54 CLog.d("Api level is under 29 skipping SystemServerStatusChecker");
55 return new StatusCheckerResult(CheckStatus.SUCCESS);
56 }
Betty Zhou8fd29192019-05-30 10:52:32 -070057 mSystemServerProcess = device.getProcessByName("system_server");
Julien Desprez3e4d47d2018-05-23 15:53:40 -070058 StatusCheckerResult result = new StatusCheckerResult(CheckStatus.SUCCESS);
Betty Zhou8fd29192019-05-30 10:52:32 -070059 if (mSystemServerProcess == null) {
Julien Desprez59358372019-07-27 10:44:23 -070060 if (mShouldRecover) {
61 device.reboot();
62 }
Betty Zhou8fd29192019-05-30 10:52:32 -070063 String message = "No valid system_server process is found.";
Julien Desprez3e4d47d2018-05-23 15:53:40 -070064 CLog.w(message);
65 result.setStatus(CheckStatus.FAILED);
Julien Desprez5166ee02019-03-05 15:44:19 -080066 result.setBugreportNeeded(true);
Julien Desprez3e4d47d2018-05-23 15:53:40 -070067 result.setErrorMessage(message);
68 return result;
Julien Desprez5eb42492017-01-31 16:16:05 +000069 }
Julien Desprez3e4d47d2018-05-23 15:53:40 -070070 return result;
Julien Desprez5eb42492017-01-31 16:16:05 +000071 }
72
73 /** {@inheritDoc} */
74 @Override
Julien Desprez3e4d47d2018-05-23 15:53:40 -070075 public StatusCheckerResult postExecutionCheck(ITestDevice device)
76 throws DeviceNotAvailableException {
Julien Despreze46d9372020-05-15 11:21:58 -070077 if (mShouldSkip) {
78 return new StatusCheckerResult(CheckStatus.SUCCESS);
79 }
Betty Zhou8fd29192019-05-30 10:52:32 -070080 if (mSystemServerProcess == null) {
81 CLog.d(
82 "No valid system_server process was found in preExecutionCheck, "
83 + "skipping system_server postExecutionCheck.");
Julien Desprez3e4d47d2018-05-23 15:53:40 -070084 return new StatusCheckerResult(CheckStatus.SUCCESS);
Julien Desprez5eb42492017-01-31 16:16:05 +000085 }
Betty Zhoua9ad95c2019-07-15 18:21:05 -070086 try {
87 if (!device.deviceSoftRestarted(mSystemServerProcess)) {
88 return new StatusCheckerResult(CheckStatus.SUCCESS);
89 }
90 } catch (RuntimeException e) {
91 CLog.w(StreamUtil.getStackTrace(e));
Betty Zhou8fd29192019-05-30 10:52:32 -070092 StatusCheckerResult result = new StatusCheckerResult(CheckStatus.FAILED);
93 result.setBugreportNeeded(true);
Betty Zhoua9ad95c2019-07-15 18:21:05 -070094 result.setErrorMessage(StreamUtil.getStackTrace(e));
Betty Zhou8fd29192019-05-30 10:52:32 -070095 return result;
Julien Desprez04103452017-02-28 12:20:35 +000096 }
Betty Zhou8fd29192019-05-30 10:52:32 -070097
Julien Desprez3e4d47d2018-05-23 15:53:40 -070098 StatusCheckerResult result = new StatusCheckerResult(CheckStatus.FAILED);
Betty Zhou8fd29192019-05-30 10:52:32 -070099 result.setBugreportNeeded(true);
Betty Zhoua9ad95c2019-07-15 18:21:05 -0700100 result.setErrorMessage("The system-server crashed during test execution");
Julien Desprez3e4d47d2018-05-23 15:53:40 -0700101 return result;
Julien Desprez5eb42492017-01-31 16:16:05 +0000102 }
103
Julien Despreza5397f12019-03-28 09:46:16 -0700104 /** Returns the current time. */
105 @VisibleForTesting
106 protected long getCurrentTime() {
107 return System.currentTimeMillis();
108 }
109
Julien Desprez5eb42492017-01-31 16:16:05 +0000110}