Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ buildscript {
}
}
dependencies {
classpath "gradle.plugin.com.browserstack.gradle:browserstack-gradle-plugin:3.0.5"
classpath "gradle.plugin.com.browserstack.gradle:browserstack-gradle-plugin:3.1.0"
}
}

Expand Down
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ plugins {
id 'com.gradle.plugin-publish' version '0.11.0'
}

version '3.0.5'
version '3.1.0'

pluginBundle {
website = 'https://www.browserstack.com'
Expand All @@ -17,7 +17,7 @@ pluginBundle {
description = 'Runs Espresso tests on BrowserStack'
tags = ['espresso', 'test', 'browserstack', 'app', 'automate',
'app-automate', 'appautomate', 'app-live', 'applive']
version = '3.0.5'
version = '3.1.0'
}
}
}
Expand Down
150 changes: 93 additions & 57 deletions src/main/java/com/browserstack/gradle/BrowserStackPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,72 +6,108 @@
import org.gradle.api.Plugin;
import org.gradle.api.Project;

import java.util.ArrayList;
import java.util.List;

public class BrowserStackPlugin implements Plugin<Project> {

private static final String DEFAULT_GROUP = "BrowserStack";
private static final String DEFAULT_GROUP = "BrowserStack";

public void apply(Project project) {
public void apply(Project project) {

BrowserStackConfigExtension browserStackConfigExtension = project.getExtensions()
.create("browserStackConfig", BrowserStackConfigExtension.class);
BrowserStackConfigExtension browserStackConfigExtension = project.getExtensions()
.create("browserStackConfig", BrowserStackConfigExtension.class);

// Get android appExtension
AppExtension appExtension = (AppExtension) project.getExtensions().getByName("android");
// Get android appExtension
AppExtension appExtension = (AppExtension) project.getExtensions().getByName("android");

// Get all application variants or flavour combinations.
DomainObjectSet<ApplicationVariant> appVariants = appExtension.getApplicationVariants();
// Get all application variants or flavour combinations.
DomainObjectSet<ApplicationVariant> appVariants = appExtension.getApplicationVariants();

// Create tasks for each variant
appVariants.all(applicationVariant -> {
String applicationVariantName = null;
try {
applicationVariantName = Tools.capitalize(applicationVariant.getName());
} catch (Exception e) {
return;
}
// Create tasks for each variant
final Boolean[] isCLITaskCreated = new Boolean[1];
isCLITaskCreated[0] = false;
appVariants.all(applicationVariant -> {
String applicationVariantName = null;
try {
applicationVariantName = Tools.capitalize(applicationVariant.getName());
} catch (Exception e) {
return;
}

// Since we can't use an outer variable in lambda expression which is not final.
final String appVariantName = applicationVariantName;
// Since we can't use an outer variable in lambda expression which is not final.
final String appVariantName = applicationVariantName;
project.getTasks().create("execute" + appVariantName + "TestsOnBrowserstack", EspressoTask.class, (task) -> {
task.setGroup(DEFAULT_GROUP);
task.setDescription("Uploads app / tests to AppAutomate and executes them");
// Run Espresso tests without building the apk and test apk
if (!project.hasProperty("skipBuildingApks")) {
task.dependsOn("assemble" + appVariantName, "assemble" + appVariantName + "AndroidTest");
}
task.setAppVariantBaseName(applicationVariant.getBaseName());
task.setUsername(browserStackConfigExtension.getUsername());
task.setAccessKey(browserStackConfigExtension.getAccessKey());
task.setCustomId(browserStackConfigExtension.getCustomId());
task.setConfigFilePath(browserStackConfigExtension.getConfigFilePath());
task.setHost(Constants.BROWSERSTACK_API_HOST);
task.setDebug(browserStackConfigExtension.isDebug());
});

project.getTasks().create("execute" + appVariantName + "TestsOnBrowserstack", EspressoTask.class, (task) -> {
task.setGroup(DEFAULT_GROUP);
task.setDescription("Uploads app / tests to AppAutomate and executes them");
// Run Espresso tests without building the apk and test apk
if (!project.hasProperty("skipBuildingApks") ) {
task.dependsOn("assemble" + appVariantName, "assemble" + appVariantName + "AndroidTest");
}
task.setAppVariantBaseName(applicationVariant.getBaseName());
task.setUsername(browserStackConfigExtension.getUsername());
task.setAccessKey(browserStackConfigExtension.getAccessKey());
task.setCustomId(browserStackConfigExtension.getCustomId());
task.setConfigFilePath(browserStackConfigExtension.getConfigFilePath());
task.setHost(Constants.BROWSERSTACK_API_HOST);
task.setDebug(browserStackConfigExtension.isDebug());
});
project.getTasks().create("upload" + appVariantName + "ToBrowserstackAppLive", AppLiveUploadTask.class, (task) -> {
task.setGroup(DEFAULT_GROUP);
task.setDescription("Uploads app to AppLive");
task.dependsOn("assemble" + appVariantName);
task.setAppVariantBaseName(applicationVariant.getBaseName());
task.setHost(Constants.BROWSERSTACK_API_HOST);
task.setUsername(browserStackConfigExtension.getUsername());
task.setAccessKey(browserStackConfigExtension.getAccessKey());
task.setCustomId(browserStackConfigExtension.getCustomId());
task.setDebug(browserStackConfigExtension.isDebug());
});

project.getTasks().create("upload" + appVariantName + "ToBrowserstackAppLive", AppLiveUploadTask.class, (task) -> {
task.setGroup(DEFAULT_GROUP);
task.setDescription("Uploads app to AppLive");
task.dependsOn("assemble" + appVariantName);
task.setAppVariantBaseName(applicationVariant.getBaseName());
task.setHost(Constants.BROWSERSTACK_API_HOST);
task.setUsername(browserStackConfigExtension.getUsername());
task.setAccessKey(browserStackConfigExtension.getAccessKey());
task.setCustomId(browserStackConfigExtension.getCustomId());
task.setDebug(browserStackConfigExtension.isDebug());
});
project.getTasks().create("upload" + appVariantName + "ToBrowserstackAppAutomate", AppAutomateUploadTask.class, (task) -> {
task.setGroup(DEFAULT_GROUP);
task.setDescription("Uploads app to AppAutomate");
task.dependsOn("assemble" + appVariantName);
task.setAppVariantBaseName(applicationVariant.getBaseName());
task.setHost(Constants.BROWSERSTACK_API_HOST);
task.setUsername(browserStackConfigExtension.getUsername());
task.setAccessKey(browserStackConfigExtension.getAccessKey());
task.setCustomId(browserStackConfigExtension.getCustomId());
task.setDebug(browserStackConfigExtension.isDebug());
});
if (!isCLITaskCreated[0]) {
project.getTasks().create("browserstackCLIWrapper", CLI.class, (task) -> {
task.setGroup(DEFAULT_GROUP);
task.setDescription("Just a wrapper on the Browserstack CLI. A way to run any Browserstack CLI command directly from gradle. \n" +
"\n" +
"\n" +
"For reference on Browserstack CLI please visit https://www.browserstack.com/app-automate/browserstack-cli\n" +
"\n" +
"\n" +
"Any CLI command passed in the custom option -PcliCommand will be executed and the results will be displayed on the terminal.\n" +
"\n" +
"\n" +
"For example:\n" +
"\n" +
"gradle browserstackCLIWrapper -PcliCommand=”app-automate apps”\n" +
"\n" +
"The browserstack CLI command app-automate apps would run and the result will be displayed on the terminal. ");

project.getTasks().create("upload" + appVariantName + "ToBrowserstackAppAutomate", AppAutomateUploadTask.class, (task) -> {
task.setGroup(DEFAULT_GROUP);
task.setDescription("Uploads app to AppAutomate");
task.dependsOn("assemble" + appVariantName);
task.setAppVariantBaseName(applicationVariant.getBaseName());
task.setHost(Constants.BROWSERSTACK_API_HOST);
task.setUsername(browserStackConfigExtension.getUsername());
task.setAccessKey(browserStackConfigExtension.getAccessKey());
task.setCustomId(browserStackConfigExtension.getCustomId());
task.setDebug(browserStackConfigExtension.isDebug());
});
});
}
task.dependsOn("assemble" + appVariantName);
task.setAppVariantBaseName(applicationVariant.getBaseName());
task.setHost(Constants.BROWSERSTACK_API_HOST);
task.setUsername(browserStackConfigExtension.getUsername());
task.setAccessKey(browserStackConfigExtension.getAccessKey());
task.setCustomId(browserStackConfigExtension.getCustomId());
task.setDebug(browserStackConfigExtension.isDebug());
if (project.hasProperty("command")) {
System.out.println("Command found: " + project.findProperty("command").toString());
task.setCommand(project.property("command").toString());
}
});
isCLITaskCreated[0] = true;
}
});
}
}
12 changes: 8 additions & 4 deletions src/main/java/com/browserstack/gradle/BrowserStackTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ public class BrowserStackTask extends DefaultTask {

private String appVariantBaseName = "debug";

public String command ;

public void setAppVariantBaseName(String appVariantBaseName) {
this.appVariantBaseName = appVariantBaseName;
}
Expand Down Expand Up @@ -70,8 +72,11 @@ public void setHost(String host) {
this.host = host;
}

protected JSONObject constructDefaultBuildParams() {
JSONObject params = new JSONObject();
public String getCommand() { return command; }

public void setCommand(String command) { this.command = command; }

protected JSONObject constructDefaultBuildParams() { JSONObject params = new JSONObject();

params.put("app", app);
// for monitoring, not for external use
Expand Down Expand Up @@ -149,16 +154,15 @@ public Map<String, Path> locateApks(boolean ignoreTestPath) throws IOException {
String dir = System.getProperty("user.dir");
List<Path> appApkFiles = new ArrayList<>();
List<Path> testApkFiles = new ArrayList<>();

Files.find(Paths.get(dir), Constants.APP_SEARCH_MAX_DEPTH, (filePath, fileAttr) -> isValidFile(filePath, fileAttr))
.forEach(f -> {

if (f.toString().endsWith("-androidTest.apk")) {
testApkFiles.add(f);
} else {
appApkFiles.add(f);
}
});

debugApkPath = findMostRecentPath(appApkFiles);
testApkPath = findMostRecentPath(testApkFiles);

Expand Down
Loading