blob: 1c46f07e392544f2020277ea58e9c3a9c1dd30ee [file] [log] [blame]
package com.android.tools.build.test.multidevice;
import com.android.annotations.NonNull;
import com.android.builder.testing.api.DeviceProvider;
import org.gradle.api.GradleException;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.plugins.PluginContainer;
import java.lang.reflect.Method;
/**
* Allows the connected integration tests to be run in parallel.
*
* This plugin is automatically applied to all of the test projects, and registers a {@link
* DeviceProvider} which will return one of the connected devices.
*
* The {@link AdbPoolDeviceProvider} block test execution until a device is available in the global
* device pool, which is defined in buildSrc, and will return the device to the pool once {@link
* DeviceProvider#terminate()} is called.
*
* The other way to reserve devices in the pool is to use the Adb test rule.
*/
public class DevicePoolPlugin implements Plugin<Project> {
@Override
public void apply(@NonNull Project project) {
PluginContainer plugins = project.getPlugins();
if (plugins.hasPlugin("android") || plugins.hasPlugin("android-library") ||
plugins.hasPlugin("com.android.application") || plugins.hasPlugin("com.android.library")) {
Object androidExtension = project.getExtensions().getByName("android");
Class<?> clazz= androidExtension.getClass();
try {
Method m = clazz.getMethod("deviceProvider", DeviceProvider.class);
m.invoke(androidExtension, new AdbPoolDeviceProvider(project));
} catch (Exception e) {
throw new RuntimeException(e);
}
} else {
throw new GradleException(
"The android or android-library plugin has not been applied yet");
}
}
}