blob: 22ab077c092f972421a7c592717d06df4fbf8c92 [file] [log] [blame]
/*
* Copyright (C) 2019 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 com.android.tradefed.retry;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.invoker.IInvocationContext;
import com.android.tradefed.result.TestRunResult;
import com.android.tradefed.testtype.IRemoteTest;
import com.android.tradefed.testtype.suite.ModuleDefinition;
import java.util.List;
/**
* Interface driving the retry decision and applying the filter on the class for more targeted
* retry.
*/
public interface IRetryDecision {
/** Whether or not to enable auto-retry. */
public boolean isAutoRetryEnabled();
/** The {@link com.android.tradefed.retry.RetryStrategy} used during auto-retry. */
public RetryStrategy getRetryStrategy();
/** Whether or not to reboot the device before the last attempt. */
public boolean rebootAtLastAttempt();
/** The maximum number of attempts during auto-retry. */
public int getMaxRetryCount();
/** Returns true if we should use the updated reporting. */
public boolean useUpdatedReporting();
/** Decide whether or not the module preparation should be retried. */
public RetryPreparationDecision shouldRetryPreparation(
ModuleDefinition module, int attempt, int maxAttempt);
/** Set the current invocation context. */
public void setInvocationContext(IInvocationContext context);
/**
* Decide whether or not retry should be attempted. Also make any necessary changes to the
* {@link IRemoteTest} to be retried (Applying filters, etc.).
*
* @param test The {@link IRemoteTest} that just ran.
* @param attemptJustExecuted The number of the attempt that we just ran.
* @param previousResults The list of {@link TestRunResult} of the test that just ran.
* @return True if we should retry, False otherwise.
* @throws DeviceNotAvailableException Can be thrown during device recovery
*/
public boolean shouldRetry(
IRemoteTest test, int attemptJustExecuted, List<TestRunResult> previousResults)
throws DeviceNotAvailableException;
/**
* Decide whether or not retry should be attempted. Also make any necessary changes to the
* {@link IRemoteTest} to be retried (Applying filters, etc.).
*
* @param test The {@link IRemoteTest} that just ran.
* @param module The {@link ModuleDefinition} object for the test module.
* @param attemptJustExecuted The number of the attempt that we just ran.
* @param previousResults The list of {@link TestRunResult} of the test that just ran.
* @param dnae The {@link DeviceNotAvailableException} of device not available exception.
* @return True if we should retry, False otherwise.
* @throws DeviceNotAvailableException Can be thrown during device recovery
*/
public boolean shouldRetry(
IRemoteTest test,
ModuleDefinition module,
int attemptJustExecuted,
List<TestRunResult> previousResults,
DeviceNotAvailableException dnae)
throws DeviceNotAvailableException;
/**
* {@link #shouldRetry(IRemoteTest, int, List)} will most likely be called before the last retry
* attempt, so we might be missing the very last attempt results for statistics purpose. This
* method allows those results to be provided for proper statistics calculations.
*
* @param lastResults
*/
public void addLastAttempt(List<TestRunResult> lastResults);
/** Returns the {@link RetryStatistics} representing the retry. */
public RetryStatistics getRetryStatistics();
/** Add an entry to skip retrying it. */
public default void addToSkipRetryList(String filterEntry) {
// Empty by default on purpose
}
}