aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Williams <antixian666@gmail.com>2017-10-31 17:01:39 -0700
committerGitHub <noreply@github.com>2017-10-31 17:01:39 -0700
commit4e556b3e5ccc4aa5098667a2a2380b1769b6fcaa (patch)
tree07fd4427da1700b59ac57716c0854dedd7131a79
parentff553803a14e756a8d1de3b95db42746853515fe (diff)
parent40b081b6a1d24b8200f91b10f3b4d5edc74813be (diff)
downloadrobolectric-shadows-4e556b3e5ccc4aa5098667a2a2380b1769b6fcaa.tar.gz
Merge pull request #3493 from robolectric/circleci
Use CircleCI instead of Travis for builds
-rw-r--r--build.gradle36
-rw-r--r--buildSrc/src/main/groovy/AndroidSdk.groovy14
-rw-r--r--buildSrc/src/main/groovy/RoboJavaModulePlugin.groovy21
-rw-r--r--buildSrc/src/main/groovy/ShadowsPlugin.groovy80
-rw-r--r--circle.yml43
-rw-r--r--gradle/wrapper/gradle-wrapper.properties2
-rw-r--r--processor/build.gradle4
-rw-r--r--processor/src/main/java/org/robolectric/annotation/processing/RobolectricProcessor.java8
-rw-r--r--processor/src/test/java/org/robolectric/annotation/processing/RobolectricProcessorTest.java22
-rw-r--r--processor/src/test/java/org/robolectric/annotation/processing/validator/RealObjectValidatorTest.java5
-rw-r--r--processor/src/test/java/org/robolectric/annotation/processing/validator/SingleClassSubject.java3
11 files changed, 169 insertions, 69 deletions
diff --git a/build.gradle b/build.gradle
index 3c89bf8fd..c0d8cd754 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,3 +1,16 @@
+buildscript {
+ repositories { jcenter() }
+
+ dependencies {
+ classpath 'com.netflix.nebula:gradle-aggregate-javadocs-plugin:2.2.+'
+ classpath 'ch.raffael.pegdown-doclet:pegdown-doclet:1.3'
+ }
+}
+
+plugins {
+ id "net.ltgt.apt" version "0.12" // automatic annotation processing
+}
+
allprojects {
repositories {
mavenLocal()
@@ -8,12 +21,13 @@ allprojects {
version = thisVersion
}
-buildscript {
- repositories { jcenter() }
+apply plugin: 'idea'
+apply plugin: 'net.ltgt.apt-idea'
- dependencies {
- classpath 'com.netflix.nebula:gradle-aggregate-javadocs-plugin:2.2.+'
- classpath 'ch.raffael.pegdown-doclet:pegdown-doclet:1.3'
+idea {
+ project {
+ // experimental: whether annotation processing will be configured in the IDE; only actually used with the 'idea' task.
+ configureAnnotationProcessing = true
}
}
@@ -33,5 +47,17 @@ task aggregateTestReports(type: TestReport) {
}
}
+task prefetchSdks() {
+ def sdkConfigurations = []
+ AndroidSdk.ALL_SDKS.each { androidSdk ->
+ sdkConfigurations << configurations.create("sdk${androidSdk.apiLevel}")
+ dependencies.add("sdk${androidSdk.apiLevel}", androidSdk.coordinates)
+ }
+}
+
+task prefetchDependencies(dependsOn: allprojects.collect { p -> "${p.path}:dependencies" }) {
+ dependsOn "prefetchSdks"
+}
+
// for use of external initialization scripts...
project.ext.allSdks = AndroidSdk.ALL_SDKS
diff --git a/buildSrc/src/main/groovy/AndroidSdk.groovy b/buildSrc/src/main/groovy/AndroidSdk.groovy
index 4d92c6fc8..07264b316 100644
--- a/buildSrc/src/main/groovy/AndroidSdk.groovy
+++ b/buildSrc/src/main/groovy/AndroidSdk.groovy
@@ -28,8 +28,20 @@ class AndroidSdk implements Comparable<AndroidSdk> {
this.frameworkSdkBuildVersion = frameworkSdkBuildVersion
}
+ String getGroupId() {
+ return "org.robolectric"
+ }
+
+ String getArtifactId() {
+ return "android-all"
+ }
+
+ String getVersion() {
+ return "${androidVersion}-robolectric-${frameworkSdkBuildVersion}"
+ }
+
String getCoordinates() {
- return "org.robolectric:android-all:${androidVersion}-robolectric-${frameworkSdkBuildVersion}"
+ return "${groupId}:${artifactId}:${version}"
}
String getJarFileName() {
diff --git a/buildSrc/src/main/groovy/RoboJavaModulePlugin.groovy b/buildSrc/src/main/groovy/RoboJavaModulePlugin.groovy
index 3ace21c80..e69979c19 100644
--- a/buildSrc/src/main/groovy/RoboJavaModulePlugin.groovy
+++ b/buildSrc/src/main/groovy/RoboJavaModulePlugin.groovy
@@ -37,6 +37,8 @@ class RoboJavaModulePlugin implements Plugin<Project> {
// it's weird that compileOnly deps aren't included for test compilation; fix that:
project.sourceSets {
+ generated
+
test.compileClasspath += project.configurations.compileOnly
}
@@ -60,8 +62,12 @@ class RoboJavaModulePlugin implements Plugin<Project> {
events = ["failed", "skipped"]
}
- minHeapSize = "2048m"
- maxHeapSize = "4096m"
+ minHeapSize = "1024m"
+ maxHeapSize = "3172m"
+
+ if (System.env['GRADLE_MAX_PARALLEL_FORKS'] != null) {
+ maxParallelForks = Integer.parseInt(System.env['GRADLE_MAX_PARALLEL_FORKS'])
+ }
def forwardedSystemProperties = System.properties
.findAll { k,v -> k.startsWith("robolectric.") }
@@ -85,10 +91,13 @@ class RoboJavaModulePlugin implements Plugin<Project> {
task('sourcesJar', type: Jar, dependsOn: classes) {
classifier "sources"
- from sourceSets.main.allJava
+ from sourceSets.main.allJava + sourceSets.generated.allJava
}
- javadoc.failOnError = false
+ javadoc {
+ failOnError = false
+ source = sourceSets.main.allJava + sourceSets.generated.allJava
+ }
task('javadocJar', type: Jar, dependsOn: javadoc) {
classifier "javadoc"
@@ -153,8 +162,8 @@ class RoboJavaModulePlugin implements Plugin<Project> {
"https://oss.sonatype.org/service/local/staging/deploy/maven2/"
repository(url: url) {
authentication(
- userName: System.properties["sonatype-login"],
- password: System.properties["sonatype-password"]
+ userName: System.properties["sonatype-login"] || System.env['sonatypeLogin'],
+ password: System.properties["sonatype-password"] || System.env['sonatypePassword']
)
}
diff --git a/buildSrc/src/main/groovy/ShadowsPlugin.groovy b/buildSrc/src/main/groovy/ShadowsPlugin.groovy
index 7b61e64f0..3799151c7 100644
--- a/buildSrc/src/main/groovy/ShadowsPlugin.groovy
+++ b/buildSrc/src/main/groovy/ShadowsPlugin.groovy
@@ -1,59 +1,75 @@
import org.gradle.api.Plugin
import org.gradle.api.Project
-import org.gradle.api.tasks.compile.JavaCompile
-import org.gradle.util.GFileUtils
+
+import java.util.jar.JarFile
@SuppressWarnings("GroovyUnusedDeclaration")
class ShadowsPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
+ project.apply plugin: "idea"
+ project.apply plugin: "net.ltgt.apt-idea"
+
project.extensions.create("shadows", ShadowsPluginExtension)
- project.configurations {
- robolectricProcessor
+ project.dependencies {
+ apt project.project(":processor")
}
- project.dependencies {
- robolectricProcessor project.project(":processor")
+ def compileJavaTask = project.tasks["compileJava"]
+ compileJavaTask.doFirst {
+ options.compilerArgs.add("-Aorg.robolectric.annotation.processing.shadowPackage=${project.shadows.packageName}")
}
- def generatedSourcesDir = "${project.buildDir}/generated-shadows"
+ def aptGeneratedSrcDir = new File(project.buildDir, 'generated/source/apt/main')
- project.sourceSets.main.java.srcDirs += project.file(generatedSourcesDir)
+ project.sourceSets {
+ generated {
+ java {
+ srcDirs = [aptGeneratedSrcDir]
+ }
+ }
+ }
- project.task("generateShadowProvider", type: JavaCompile, description: "Generate Shadows.shadowOf()s class") { task ->
- classpath = project.configurations.robolectricProcessor
- source = project.sourceSets.main.java
- destinationDir = project.file(generatedSourcesDir)
+ // verify that we have the apt-generated files in our javadoc and sources jars
+ project.tasks['javadocJar'].doLast { task ->
+ def shadowPackageNameDir = project.shadows.packageName.replaceAll(/\./, '/')
+ checkForFile(task.archivePath, "${shadowPackageNameDir}/Shadows.html")
+ }
- doFirst {
- logger.info "Generating Shadows.java for ${project.name}…"
+ project.tasks['sourcesJar'].doLast { task ->
+ def shadowPackageNameDir = project.shadows.packageName.replaceAll(/\./, '/')
+ checkForFile(task.archivePath, "${shadowPackageNameDir}/Shadows.java")
+ }
- // reset our classpath at the last minute, since other plugins might mutate
- // compileJava's classpath and we want to pick up any changes…
- classpath = project.tasks['compileJava'].classpath + project.configurations.robolectricProcessor
+ project.idea {
+ module {
+ apt {
+ // whether generated sources dirs are added as generated sources root
+ addGeneratedSourcesDirs = true
+ // whether the apt and testApt dependencies are added as module dependencies
+ addAptDependencies = true
- options.compilerArgs.addAll(
- "-proc:only",
- "-processor", "org.robolectric.annotation.processing.RobolectricProcessor",
- "-Aorg.robolectric.annotation.processing.shadowPackage=${project.shadows.packageName}"
- )
+ // The following are mostly internal details; you shouldn't ever need to configure them.
+ // whether the compileOnly and testCompileOnly dependencies are added as module dependencies
+ addCompileOnlyDependencies = false // defaults to true in Gradle < 2.12
+ // the dependency scope used for apt and/or compileOnly dependencies (when enabled above)
+ mainDependenciesScope = "PROVIDED" // defaults to "COMPILE" in Gradle < 3.4, or when using the Gradle integration in IntelliJ IDEA
+ }
}
- doLast {
- def src = project.file("$generatedSourcesDir/META-INF/services/org.robolectric.internal.ShadowProvider")
- def dest = project.file("${project.buildDir}/resources/main/META-INF/services/org.robolectric.internal.ShadowProvider")
-
- GFileUtils.mkdirs(dest.getParentFile());
- GFileUtils.copyFile(src, dest);
- }
}
-
- def compileJavaTask = project.tasks["compileJava"]
- compileJavaTask.dependsOn("generateShadowProvider")
}
static class ShadowsPluginExtension {
String packageName
}
+
+ private void checkForFile(jar, String name) {
+ def files = new JarFile(jar).entries().collect { it.name }.toSet()
+
+ if (!files.contains(name)) {
+ throw new RuntimeException("Missing file ${name} in ${jar}")
+ }
+ }
}
diff --git a/circle.yml b/circle.yml
index 0766c46ff..012f6cfd5 100644
--- a/circle.yml
+++ b/circle.yml
@@ -4,24 +4,51 @@ jobs:
working_directory: ~/code
docker:
- image: circleci/android:api-26-alpha
+ resource_class: xlarge
environment:
- JVM_OPTS: -Xmx3200m
+ JVM_OPTS: -Xmx3172m
+ GRADLE_MAX_PARALLEL_FORKS: 2
steps:
- checkout
+ - run:
+ name: Calculate Cache Hash
+ command: |
+ find . \( -name \*.gradle -or -name \*.groovy -or -name \*.sh -or -name \*.rb -or -name circle.yml \) -exec shasum {} \; | sort > .cache-hash
+ cat .cache-hash
+ - run:
+ name: Install Maven
+ command: sudo apt-get update; sudo apt-get install maven
- restore_cache:
- key: jars-{{ checksum "build.gradle" }}
+ key: cache-{{ checksum ".cache-hash" }}
- run:
name: Download Dependencies
- command: ./scripts/install-dependencies.rb
+ command: |
+ sdkmanager --install 'platforms;android-27'
+ ./scripts/install-dependencies.rb
+ ./gradlew prefetchDependencies
- save_cache:
paths:
- ~/.gradle
- key: jars-{{ checksum "build.gradle" }}
+ - ~/.m2
+ - /opt/android/sdk/platforms/android-27
+ key: cache-{{ checksum ".cache-hash" }}
+ - run:
+ name: Build and Test
+ command: SKIP_JAVADOC=true ./gradlew clean assemble test --info --stacktrace --continue
- run:
- name: Run Tests
- command: ./gradlew test
+ name: Collect Test Results
+ command: |
+ mkdir -p ~/junit/
+ find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/junit/ \;
+ when: always
+ - store_test_results:
+ path: ~/junit
- store_artifacts:
path: build/reports
destination: reports
- - store_test_results:
- path: build/test-results
+ - run:
+ name: Upload Snapshot
+ command: |
+ if [ "${CIRCLE_BRANCH}" == "master" ]; then
+ ./gradlew upload --no-rebuild
+ fi \ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index bf1b63c34..c583957d2 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.2.1-all.zip
diff --git a/processor/build.gradle b/processor/build.gradle
index 03de51a05..5ee74548d 100644
--- a/processor/build.gradle
+++ b/processor/build.gradle
@@ -6,6 +6,10 @@ new RoboJavaModulePlugin(
deploy: true
).apply(project)
+// Disable annotation processor for tests
+compileTestJava {
+ options.compilerArgs.add("-proc:none")
+}
dependencies {
// Project dependencies
diff --git a/processor/src/main/java/org/robolectric/annotation/processing/RobolectricProcessor.java b/processor/src/main/java/org/robolectric/annotation/processing/RobolectricProcessor.java
index 0b0fd4808..95882bdbb 100644
--- a/processor/src/main/java/org/robolectric/annotation/processing/RobolectricProcessor.java
+++ b/processor/src/main/java/org/robolectric/annotation/processing/RobolectricProcessor.java
@@ -1,5 +1,6 @@
package org.robolectric.annotation.processing;
+import com.google.common.annotations.VisibleForTesting;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -57,7 +58,8 @@ public class RobolectricProcessor extends AbstractProcessor {
* @param options simulated options that would ordinarily
* be passed in the {@link ProcessingEnvironment}.
*/
- RobolectricProcessor(Map<String, String> options) {
+ @VisibleForTesting
+ public RobolectricProcessor(Map<String, String> options) {
processOptions(options);
}
@@ -108,6 +110,10 @@ public class RobolectricProcessor extends AbstractProcessor {
this.shadowPackage = options.get(PACKAGE_OPT);
this.shouldInstrumentPackages =
!"false".equalsIgnoreCase(options.get(SHOULD_INSTRUMENT_PKG_OPT));
+
+ if (this.shadowPackage == null) {
+ throw new IllegalArgumentException("no package specified for " + PACKAGE_OPT);
+ }
}
}
diff --git a/processor/src/test/java/org/robolectric/annotation/processing/RobolectricProcessorTest.java b/processor/src/test/java/org/robolectric/annotation/processing/RobolectricProcessorTest.java
index 33501a287..6b7a7725b 100644
--- a/processor/src/test/java/org/robolectric/annotation/processing/RobolectricProcessorTest.java
+++ b/processor/src/test/java/org/robolectric/annotation/processing/RobolectricProcessorTest.java
@@ -32,21 +32,19 @@ import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class RobolectricProcessorTest {
- private static final Map<String,String> DEFAULT_OPTS = new HashMap<>();
-
- static {
- DEFAULT_OPTS.put(PACKAGE_OPT, "org.robolectric");
- }
+ public static final Map<String,String> DEFAULT_OPTS = new HashMap<String, String>() {{
+ put(PACKAGE_OPT, "org.robolectric");
+ }};
@Test
public void robolectricProcessor_supportsPackageOption() {
- assertThat(new RobolectricProcessor().getSupportedOptions()).contains(PACKAGE_OPT);
+ assertThat(new RobolectricProcessor(DEFAULT_OPTS).getSupportedOptions()).contains(PACKAGE_OPT);
}
@Test
public void robolectricProcessor_supportsShouldInstrumentPackageOption() {
assertThat(
- new RobolectricProcessor().getSupportedOptions()).contains(SHOULD_INSTRUMENT_PKG_OPT);
+ new RobolectricProcessor(DEFAULT_OPTS).getSupportedOptions()).contains(SHOULD_INSTRUMENT_PKG_OPT);
}
@Test
@@ -57,7 +55,7 @@ public class RobolectricProcessorTest {
SHADOW_PROVIDER_SOURCE,
SHADOW_EXTRACTOR_SOURCE,
forSourceString("HelloWorld", "final class HelloWorld {}")))
- .processedWith(new RobolectricProcessor())
+ .processedWith(new RobolectricProcessor(DEFAULT_OPTS))
.compilesWithoutError();
//.and().generatesNoSources(); Should add this assertion onces
// it becomes available in compile-testing
@@ -190,7 +188,7 @@ public class RobolectricProcessorTest {
SHADOW_PROVIDER_SOURCE,
SHADOW_EXTRACTOR_SOURCE,
forResource("org/robolectric/annotation/TestWithUnrecognizedAnnotation.java")))
- .processedWith(new RobolectricProcessor())
+ .processedWith(new RobolectricProcessor(DEFAULT_OPTS))
.compilesWithoutError();
}
@@ -198,7 +196,7 @@ public class RobolectricProcessorTest {
public void shouldGracefullyHandleNoAnythingClass_withNoRealObject() {
assertAbout(javaSource())
.that(forResource("org/robolectric/annotation/processing/shadows/ShadowAnything.java"))
- .processedWith(new RobolectricProcessor())
+ .processedWith(new RobolectricProcessor(DEFAULT_OPTS))
.failsToCompile();
}
@@ -209,7 +207,7 @@ public class RobolectricProcessorTest {
SHADOW_PROVIDER_SOURCE,
SHADOW_EXTRACTOR_SOURCE,
forResource("org/robolectric/annotation/processing/shadows/ShadowRealObjectWithCorrectAnything.java")))
- .processedWith(new RobolectricProcessor())
+ .processedWith(new RobolectricProcessor(DEFAULT_OPTS))
.failsToCompile();
}
@@ -253,7 +251,7 @@ public class RobolectricProcessorTest {
.that(ImmutableList.of(
ROBO_SOURCE,
forResource("org/robolectric/annotation/processing/shadows/DocumentedObjectShadow.java")))
- .processedWith(new RobolectricProcessor())
+ .processedWith(new RobolectricProcessor(DEFAULT_OPTS))
.compilesWithoutError();
JsonParser jsonParser = new JsonParser();
String jsonFile = "build/docs/json/org.robolectric.Robolectric.DocumentedObject.json";
diff --git a/processor/src/test/java/org/robolectric/annotation/processing/validator/RealObjectValidatorTest.java b/processor/src/test/java/org/robolectric/annotation/processing/validator/RealObjectValidatorTest.java
index a37796b13..38dd39f5b 100644
--- a/processor/src/test/java/org/robolectric/annotation/processing/validator/RealObjectValidatorTest.java
+++ b/processor/src/test/java/org/robolectric/annotation/processing/validator/RealObjectValidatorTest.java
@@ -3,6 +3,7 @@ package org.robolectric.annotation.processing.validator;
import static com.google.common.truth.Truth.assertAbout;
import static com.google.testing.compile.JavaFileObjects.forResource;
import static com.google.testing.compile.JavaSourcesSubjectFactory.javaSources;
+import static org.robolectric.annotation.processing.RobolectricProcessorTest.DEFAULT_OPTS;
import static org.robolectric.annotation.processing.validator.SingleClassSubject.singleClass;
import static org.robolectric.annotation.processing.validator.Utils.SHADOW_EXTRACTOR_SOURCE;
@@ -102,7 +103,7 @@ public class RealObjectValidatorTest {
.that(ImmutableList.of(
SHADOW_EXTRACTOR_SOURCE,
forResource("org/robolectric/annotation/processing/shadows/ShadowRealObjectWithCorrectType.java")))
- .processedWith(new RobolectricProcessor())
+ .processedWith(new RobolectricProcessor(DEFAULT_OPTS))
.compilesWithoutError();
}
@@ -120,7 +121,7 @@ public class RealObjectValidatorTest {
.that(ImmutableList.of(
SHADOW_EXTRACTOR_SOURCE,
forResource("org/robolectric/annotation/processing/shadows/ShadowRealObjectWithCorrectClassName.java")))
- .processedWith(new RobolectricProcessor())
+ .processedWith(new RobolectricProcessor(DEFAULT_OPTS))
.compilesWithoutError();
}
diff --git a/processor/src/test/java/org/robolectric/annotation/processing/validator/SingleClassSubject.java b/processor/src/test/java/org/robolectric/annotation/processing/validator/SingleClassSubject.java
index 92a024bd8..e17061293 100644
--- a/processor/src/test/java/org/robolectric/annotation/processing/validator/SingleClassSubject.java
+++ b/processor/src/test/java/org/robolectric/annotation/processing/validator/SingleClassSubject.java
@@ -2,6 +2,7 @@ package org.robolectric.annotation.processing.validator;
import static com.google.common.truth.Truth.assertAbout;
import static com.google.testing.compile.JavaSourcesSubjectFactory.javaSources;
+import static org.robolectric.annotation.processing.RobolectricProcessorTest.DEFAULT_OPTS;
import com.google.common.collect.ImmutableList;
import com.google.common.truth.FailureStrategy;
@@ -37,7 +38,7 @@ public final class SingleClassSubject extends Subject<SingleClassSubject, String
source = JavaFileObjects.forResource(Utils.toResourcePath(subject));
tester = assertAbout(javaSources())
.that(ImmutableList.of(source, Utils.ROBO_SOURCE, Utils.SHADOW_EXTRACTOR_SOURCE))
- .processedWith(new RobolectricProcessor());
+ .processedWith(new RobolectricProcessor(DEFAULT_OPTS));
}
public SuccessfulCompilationClause compilesWithoutError() {