diff --git a/.circleci/config.yml b/.circleci/config.yml index d1407a18..ccd3cff7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,14 +12,20 @@ jobs: key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}-{{ checksum "core/build.gradle" }}-{{ checksum "core-android/build.gradle" }} - run: name: Get Dependencies - command: ./gradlew androidDependencies + command: ./gradlew androidDependencies --no-daemon - save_cache: paths: - ~/.gradle key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}-{{ checksum "core/build.gradle" }}-{{ checksum "core-android/build.gradle" }} - run: name: Run Tests - command: ./gradlew check + command: ./gradlew check --stacktrace --no-parallel --no-daemon + - run: + name: Run Tests Firebase + command: mkdir ~/gcloud + && curl https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-291.0.0-linux-x86_64.tar.gz | tar xz -C ~/gcloud + && echo "export PATH=~/gcloud/google-cloud-sdk/bin:$PATH" >> $BASH_ENV + && ./gradlew runInstrumentedTestsOnFirebase --stacktrace --no-daemon - store_artifacts: path: app/build/reports destination: app/reports @@ -34,6 +40,8 @@ jobs: destination: feature/push/reports - store_test_results: path: app/build/test-results + - store_test_results: + path: core-android/build/test-results - store_test_results: path: core/build/test-results - store_test_results: @@ -41,4 +49,3 @@ jobs: - store_test_results: path: feature/push/build/test-results - diff --git a/README.md b/README.md index 325ff6b7..01386485 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,5 @@ Experimental architecture app with example usage intended to be a showcase, test - `Navigator` pattern to be able to easily navigate without `Context` - `TopActivityProvider` to avoid having `Context` dependencie everywhere and to be able to have cleaner pure Kotlin interfaces - Uses [LiveData-Testing](https://github.com/jraska/livedata-testing) to test ViewModel. [Article](https://android.jlelse.eu/effective-livedata-and-viewmodel-testing-17f25069fcd4) -- Module Graph generation into Graphviz is implemented together with highlighting longest path in the graph. See [PR #205](https://github.com/jraska/github-client/pull/205} -- Module Graph measurement is used to assert height of dependency graph. See `/buildSrc` and [PR #205](https://github.com/jraska/github-client/pull/204). -Adding features by decoration to all screens implemented. See [PR #189](https://github.com/jraska/github-client/pull/189) +- Example usage of [module graph assertion](https://proandroiddev.com/module-rules-protect-your-build-time-and-architecture-d1194c7cc6bc) - see [here](https://github.com/jraska/github-client/blob/be3b06558118721968547de9237e9b48d1a8833d/app/build.gradle#L141). +- Tests are run on Firebase Test Lab. [See PR](https://github.com/jraska/github-client/pull/233) diff --git a/app/build.gradle b/app/build.gradle index 59a4d502..4bfd62e6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -146,6 +146,8 @@ moduleGraphAssert { } apply plugin: 'com.google.gms.google-services' + +apply from: 'firebase-test-lab.gradle' repositories { mavenCentral() } diff --git a/app/firebase-test-lab.gradle b/app/firebase-test-lab.gradle new file mode 100644 index 00000000..6e2110b0 --- /dev/null +++ b/app/firebase-test-lab.gradle @@ -0,0 +1,42 @@ +project.afterEvaluate { + def setupGCloudProject = tasks.register("setupGCloudProject", Exec.class) { + commandLine = "gcloud config set project github-client-25b47".split(' ') + dependsOn(project.tasks.named("assembleDebugAndroidTest")) + } + + def setupGCloudAccount = tasks.register("setupGCloudAccount", Exec.class) { + def credentialsPath = createCredentialsFile() + commandLine = "gcloud auth activate-service-account --key-file $credentialsPath".split(' ') + + dependsOn(setupGCloudProject) + } + + tasks.register("runInstrumentedTestsOnFirebase", Exec.class) { + def appApk = "${project.buildDir}/outputs/apk/debug/app-debug.apk" + def testApk = "${project.buildDir}/outputs/apk/androidTest/debug/app-debug-androidTest.apk" + def device = "model=flame,version=29,locale=en,orientation=portrait" + + commandLine = + ("gcloud " + + "firebase test android run " + + "--app $appApk " + + "--test $testApk " + + "--device $device " + + "--no-performance-metrics") + .split(' ') + + dependsOn(project.tasks.named("assembleDebugAndroidTest")) + dependsOn(project.tasks.named("assembleDebug")) + dependsOn(setupGCloudAccount) + } +} + +String createCredentialsFile() { + def credentialsPath = "$projectDir/credentials.json" + def credentials = System.getenv("GCLOUD_CREDENTIALS") + if (credentials != null) { + new File(credentialsPath).write(credentials) + } + return credentialsPath +} + diff --git a/build.gradle b/build.gradle index 698f0982..4814b617 100644 --- a/build.gradle +++ b/build.gradle @@ -9,8 +9,8 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:3.6.3' - classpath 'com.google.gms:google-services:4.3.3' classpath 'com.google.firebase:firebase-plugins:2.0.0' + classpath 'com.google.gms:google-services:4.3.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'io.fabric.tools:gradle:1.31.2' } @@ -41,3 +41,11 @@ subprojects { } } } + +subprojects { + tasks.configureEach { + if (name.startsWith("lint")) { + enabled = false + } + } +} diff --git a/gradle.properties b/gradle.properties index 48251c9f..ee0bca22 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ # suppress inspection "UnusedProperty" for whole file # Default value: -Xmx1024m -XX:MaxPermSize=256m -org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx2560m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 org.gradle.parallel=true org.gradle.daemon=true android.useAndroidX=true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 84a90661..fd0c5a38 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.2.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.4-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists