mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-23 10:54:33 +00:00
Bug 1222120 - Part 1: Add custom Robolectric test runner. r=vivek
This exports the buildDir to Robolectric via an Android-Gradle buildConfigField, and then lightly massages the existing test runner to use the exported value. --HG-- extra : commitid : FKCOBaaJbdn extra : rebase_source : b47d77c74b6d5179145c9539503a27630a3aa40c
This commit is contained in:
parent
fcfe5b7e24
commit
cad5e0726f
@ -9,6 +9,8 @@ android {
|
||||
defaultConfig {
|
||||
targetSdkVersion 22
|
||||
minSdkVersion 9
|
||||
// Used by Robolectric based tests; see TestRunner.
|
||||
buildConfigField 'String', 'BUILD_DIR', "\"${project.buildDir}\""
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
|
@ -7,6 +7,8 @@ android {
|
||||
defaultConfig {
|
||||
targetSdkVersion 22
|
||||
minSdkVersion 9
|
||||
// Used by Robolectric based tests; see TestRunner.
|
||||
buildConfigField 'String', 'BUILD_DIR', "\"${project.buildDir}\""
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
|
@ -0,0 +1,138 @@
|
||||
/**
|
||||
* The MIT License
|
||||
*
|
||||
* Copyright (c) 2010 Xtreme Labs and Pivotal Labs
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package org.mozilla.gecko.background.testhelpers;
|
||||
|
||||
import org.junit.runners.model.InitializationError;
|
||||
import org.robolectric.RobolectricGradleTestRunner;
|
||||
import org.robolectric.annotation.Config;
|
||||
import org.robolectric.manifest.AndroidManifest;
|
||||
import org.robolectric.res.FileFsFile;
|
||||
import org.robolectric.res.FsFile;
|
||||
import org.robolectric.util.Logger;
|
||||
import org.robolectric.util.ReflectionHelpers;
|
||||
|
||||
/**
|
||||
* Test runner customized for running unit tests either through the Gradle CLI or
|
||||
* Android Studio. The runner uses the build type and build flavor to compute the
|
||||
* resource, asset, and AndroidManifest paths.
|
||||
*
|
||||
* This test runner requires that you set the 'constants' field on the @Config
|
||||
* annotation (or the org.robolectric.Config.properties file) for your tests.
|
||||
*
|
||||
* This is a modified version of
|
||||
* https://github.com/robolectric/robolectric/blob/8676da2daa4c140679fb5903696b8191415cec8f/robolectric/src/main/java/org/robolectric/RobolectricGradleTestRunner.java
|
||||
* that uses a Gradle `buildConfigField` to find build outputs.
|
||||
* See https://github.com/robolectric/robolectric/issues/1648#issuecomment-113731011.
|
||||
*/
|
||||
public class TestRunner extends RobolectricGradleTestRunner {
|
||||
private FsFile buildFolder;
|
||||
|
||||
public TestRunner(Class<?> klass) throws InitializationError {
|
||||
super(klass);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AndroidManifest getAppManifest(Config config) {
|
||||
if (config.constants() == Void.class) {
|
||||
Logger.error("Field 'constants' not specified in @Config annotation");
|
||||
Logger.error("This is required when using RobolectricGradleTestRunner!");
|
||||
throw new RuntimeException("No 'constants' field in @Config annotation!");
|
||||
}
|
||||
|
||||
buildFolder = FileFsFile.from(getBuildDir(config)).join("intermediates");
|
||||
|
||||
final String type = getType(config);
|
||||
final String flavor = getFlavor(config);
|
||||
final String packageName = getPackageName(config);
|
||||
|
||||
final FsFile res;
|
||||
final FsFile assets;
|
||||
final FsFile manifest;
|
||||
|
||||
if (areResourcesFromLibrary()) {
|
||||
FsFile bundlesFolder = buildFolder.join("bundles", flavor, type);
|
||||
res = bundlesFolder.join("res");
|
||||
assets = bundlesFolder.join("assets");
|
||||
manifest = bundlesFolder.join("AndroidManifest.xml");
|
||||
} else {
|
||||
if (buildFolder.join("res", "merged").exists()) {
|
||||
res = buildFolder.join("res", "merged", flavor, type);
|
||||
} else if(buildFolder.join("res").exists()) {
|
||||
res = buildFolder.join("res", flavor, type);
|
||||
} else {
|
||||
throw new IllegalStateException("No resource folder found");
|
||||
}
|
||||
assets = buildFolder.join("assets", flavor, type);
|
||||
manifest = buildFolder.join("manifests", "full", flavor, type, "AndroidManifest.xml");
|
||||
}
|
||||
|
||||
Logger.debug("Robolectric assets directory: " + assets.getPath());
|
||||
Logger.debug(" Robolectric res directory: " + res.getPath());
|
||||
Logger.debug(" Robolectric manifest path: " + manifest.getPath());
|
||||
Logger.debug(" Robolectric package name: " + packageName);
|
||||
return new AndroidManifest(manifest, res, assets, packageName);
|
||||
}
|
||||
|
||||
private boolean areResourcesFromLibrary() {
|
||||
return buildFolder.join("bundles").exists();
|
||||
}
|
||||
|
||||
private static String getType(Config config) {
|
||||
try {
|
||||
return ReflectionHelpers.getStaticField(config.constants(), "BUILD_TYPE");
|
||||
} catch (Throwable e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static String getFlavor(Config config) {
|
||||
try {
|
||||
return ReflectionHelpers.getStaticField(config.constants(), "FLAVOR");
|
||||
} catch (Throwable e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static String getPackageName(Config config) {
|
||||
try {
|
||||
final String packageName = config.packageName();
|
||||
if (packageName != null && !packageName.isEmpty()) {
|
||||
return packageName;
|
||||
} else {
|
||||
return ReflectionHelpers.getStaticField(config.constants(), "APPLICATION_ID");
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private String getBuildDir(Config config) {
|
||||
try {
|
||||
return ReflectionHelpers.getStaticField(config.constants(), "BUILD_DIR");
|
||||
} catch (Throwable e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user