blob: 157623d5b0f77166240b662b89070188dc0e8026 [file] [log] [blame]
package com.android.testing.uiautomation;
import android.os.Bundle;
import android.test.AndroidTestRunner;
import android.test.InstrumentationTestRunner;
import java.io.IOException;
import java.lang.reflect.Field;
import junit.framework.AssertionFailedError;
import junit.framework.Test;
import junit.framework.TestListener;
public class UiAutomationTestRunner extends InstrumentationTestRunner {
// there's nothing fan
private Bundle mParams;
private AutomationProvider mAutomationProvider;
@Override
public void onCreate(Bundle arguments) {
mParams = new Bundle(arguments);
super.onCreate(arguments);
}
public Bundle getInitialParams() {
return mParams;
}
private AutomationProvider getAutomationProvider() throws IOException {
if (mAutomationProvider == null) {
mAutomationProvider = new AutomationProvider(getTargetContext());
}
return mAutomationProvider;
}
@Override
protected AndroidTestRunner getAndroidTestRunner() {
// TODO Auto-generated method stub
AndroidTestRunner testRunner = super.getAndroidTestRunner();
testRunner.addTestListener(new TestListener() {
@Override
public void startTest(Test test) {
Field[] fields = test.getClass().getDeclaredFields();
for (Field field : fields) {
if (field.getAnnotation(InjectParams.class) != null) {
if (Bundle.class.equals(field.getType())) {
field.setAccessible(true);
try {
field.set(test, mParams);
} catch (IllegalAccessException e) {
throw new RuntimeException("failed to inject Bundle parameter", e);
}
} else {
throw new IllegalArgumentException("Need Bundle type for injection");
}
}
if (field.getAnnotation(InjectAutomationProvider.class) != null) {
if (AutomationProvider.class.equals(field.getType())) {
field.setAccessible(true);
try {
field.set(test, getAutomationProvider());
} catch (IllegalAccessException e) {
throw new RuntimeException("failed to inject AutomationProvider", e);
} catch (IOException e) {
throw new RuntimeException("failed to init AutomationProvider", e);
}
}
}
}
}
@Override
public void endTest(Test test) {
}
@Override
public void addFailure(Test test, AssertionFailedError t) {
}
@Override
public void addError(Test test, Throwable t) {
}
});
return testRunner;
}
}