buildscript { repositories { jcenter() } dependencies { // NOTE: Always use fixed version codes not dynamic ones, e.g. 0.7.3 instead of 0.7.+, see README for more information classpath 'com.novoda:gradle-android-test-plugin:0.10.0' } } apply plugin: 'java' apply plugin: 'android-test' apply plugin: 'jacoco' dependencies { testCompile 'junit:junit:4.11' testCompile 'com.google.android:android:4.1.1.4' testCompile('com.squareup:fest-android:1.0.+') { exclude module: 'support-v4' } testCompile ('org.robolectric:robolectric:2.3') { exclude module: 'classworlds' exclude module: 'maven-artifact' exclude module: 'maven-artifact-manager' exclude module: 'maven-error-diagnostics' exclude module: 'maven-model' exclude module: 'maven-plugin-registry' exclude module: 'maven-profile' exclude module: 'maven-project' exclude module: 'maven-settings' exclude module: 'nekohtml' exclude module: 'plexus-container-default' exclude module: 'plexus-interpolation' exclude module: 'plexus-utils' exclude module: 'support-v4' // crazy but my android studio don't like this dependency and to fix it remove .idea and re import project exclude module: 'wagon-file' exclude module: 'wagon-http-lightweight' exclude module: 'wagon-http-shared' exclude module: 'wagon-provider-api' } } test { exclude '**/*$*' } android { projectUnderTest ':OpenKeychain' } jacoco { toolVersion = "0.7.2.201409121644" } def coverageSourceDirs = [ '../OpenKeychain/src/main/java', '../OpenKeychain/src/gen', '../OpenKeychain/build/source/apt/debug', '../OpenKeychain/build/source/generated/buildConfig/debug', '../OpenKeychain/build/source/generated/r/debug' ] jacocoTestReport { reports { xml.enabled = true html.destination "${buildDir}/jacocoHtml" } // class R is used, but usage will not be covered, so ignore this class from report classDirectories = fileTree(dir: '../OpenKeychain/build/intermediates/classes/debug/org/sufficientlysecure/keychain', exclude: [ 'R*.class' ]) additionalSourceDirs = files(coverageSourceDirs) executionData = files('build/jacoco/testDebug.exec') } // new workaround to force add custom output dirs for android studio task addTest { def file = file(project.name + ".iml") doLast { try { def parsedXml = (new XmlParser()).parse(file) def node = parsedXml.component[1] def outputNode = parsedXml.component[1].output[0] def outputTestNode = parsedXml.component[1].'output-test'[0] def rewrite = false new Node(node, 'sourceFolder', ['url': 'file://$MODULE_DIR$/' + "${it}", 'isTestSource': "true"]) if(outputNode == null) { new Node(node, 'output', ['url': 'file://$MODULE_DIR$/build/resources/testDebug']) } else { if(outputNode.attributes['url'] != 'file://$MODULE_DIR$/build/resources/testDebug') { outputNode.attributes = ['url': 'file://$MODULE_DIR$/build/resources/testDebug'] rewrite = true } } if(outputTestNode == null) { new Node(node, 'output-test', ['url': 'file://$MODULE_DIR$/build/test-classes/debug']) } else { if(outputTestNode.attributes['url'] != 'file://$MODULE_DIR$/build/test-classes/debug') { outputTestNode.attributes = ['url': 'file://$MODULE_DIR$/build/test-classes/debug'] rewrite = true } } if(rewrite) { def writer = new StringWriter() new XmlNodePrinter(new PrintWriter(writer)).print(parsedXml) file.text = writer.toString() } } catch (FileNotFoundException e) { // iml not found, common on command line only builds } } } // always do the addtest on prebuild gradle.projectsEvaluated { testDebugClasses.dependsOn(addTest) }