blob: 61a35c7a7196932f04df711513cf9766bf7a195f [file] [log] [blame]
apply plugin: 'wrapper'
allprojects {
version = versionNumber + '-' + releaseType
// We want to see all test results. This is equivalatent to setting --continue
// on the command line.
gradle.startParameter.continueOnFailure = true
repositories {
mavenLocal()
mavenCentral()
maven { url "http://repo.spring.io/release" }
maven { url "http://repo.spring.io/milestone" }
maven { url "http://repo.spring.io/snapshot" }
maven { url "http://repo.spring.io/libs-release" }
maven { url "http://repo.spring.io/ext-release-local" }
maven { url "http://dist.gemstone.com/maven/release" }
}
group = "org.apache.geode"
apply plugin: 'idea'
apply plugin: 'eclipse'
buildRoot = buildRoot.trim()
if (!buildRoot.isEmpty()) {
buildDir = buildRoot + project.path.replace(":", "/") + "/build"
}
gradle.taskGraph.whenReady( { graph ->
tasks.withType(Tar).each { tar ->
tar.compression = Compression.GZIP
tar.extension = 'tar.gz'
}
} )
}
task clean (type: Delete) {
delete rootProject.buildDir
if (!buildRoot.isEmpty()) {
delete buildRoot
}
}
def testResultsDir(def parent, def name) {
new File(parent, name)
}
def writeTestProperties(def parent, def name) {
def availablePortFinder = AvailablePortFinder.createPrivate()
def props = new Properties()
props.setProperty('mcast-port', Integer.toString(availablePortFinder.nextAvailable))
props.setProperty('log-level', 'config')
def propsFile = new File(testResultsDir(parent, name), 'gemfire.properties')
def writer = propsFile.newWriter()
props.store(writer, 'Autogenerated Gemfire properties')
}
task combineReports(type: TestReport) {
description 'Combines the test reports.'
destinationDir = file "${rootProject.buildDir}/reports/combined"
doLast {
println "All test reports at ${rootProject.buildDir}/reports/combined"
}
}
gradle.taskGraph.whenReady({ graph ->
tasks.getByName('combineReports').reportOn rootProject.subprojects.collect{ it.tasks.withType(Test) }.flatten()
})
subprojects {
apply plugin: 'java'
// apply compiler options
gradle.taskGraph.whenReady( { graph ->
tasks.withType(JavaCompile).each { javac ->
javac.configure {
sourceCompatibility '1.7'
targetCompatibility '1.7'
options.encoding = 'UTF-8'
}
}
})
// apply default manifest
gradle.taskGraph.whenReady( { graph ->
tasks.withType(Jar).each { jar ->
jar.doFirst {
manifest {
attributes(
"Manifest-Version" : "1.0",
"Created-By" : System.getProperty("user.name"),
"Title" : rootProject.name,
"Version" : version,
"Vendor" : "Pivotal Software, Inc."
)
}
}
}
})
configurations {
provided {
description 'a dependency that is provided externally at runtime'
visible true
}
testOutput {
extendsFrom testCompile
description 'a dependency that exposes test artifacts'
}
}
// Here we want to disable all transitive dependencies on external artifacts. This
// allows us to lock down library versions. However, we want project dependencies to
// be transitive such that the libraries of a dependent project are automatically included.
configurations.all {
dependencies.all { dep ->
if (dep instanceof ModuleDependency && !(dep instanceof ProjectDependency)) {
dep.transitive = false
}
}
}
// Configuration for Checkstyle, FindBugs
if (project.hasProperty("staticAnalysis")) {
apply plugin: 'checkstyle'
//Checkstyle configuration
configurations.checkstyle {
dependencies.all { dep ->
dep.transitive = true
}
}
//Findbugs configuration
apply plugin: 'findbugs'
configurations.findbugs {
dependencies.all { dep ->
dep.transitive = true
}
}
// Switch default Findbugs report to HTML for developers
def findbugsXmlEnabled = false
def findbugsHtmlEnabled = true
// Provide ability to change report type to XML for ingesting into other ap
if ( project.hasProperty("findbugsXmlReport") ) {
findbugsXmlEnabled = true
findbugsHtmlEnabled = false
}
configurations.findbugs {
dependencies.all { dep ->
dep.transitive = true
}
findbugs.effort = 'max'
findbugs.reportLevel = 'high'
}
tasks.withType(FindBugs) {
reports {
xml.enabled = findbugsXmlEnabled
html.enabled = findbugsHtmlEnabled
}
}
}
// JaCoCo configuration
if (project.hasProperty("codeCoverage")) {
apply plugin: 'jacoco'
configurations.jacocoAnt {
dependencies.all { dep ->
dep.transitive = true
}
}
jacocoTestReport {
reports {
csv.enabled false
html.destination "${buildDir}/jacocoTestHtml"
}
}
task jacocoIntegrationTestReport (type: JacocoReport) {
reports {
csv.enabled false
sourceSets project.sourceSets.main
html.destination "${buildDir}/jacocoIntegrationTestHtml"
executionData = fileTree(dir: 'build/jacoco', include: '**/integrationTest.exec')
}
}
task jacocoDistributedTestReport (type: JacocoReport) {
reports {
csv.enabled false
sourceSets project.sourceSets.main
html.destination "${buildDir}/jacocoDistributedTestHtml"
executionData = fileTree(dir: 'build/jacoco', include: '**/distributedTest.exec')
}
}
task jacocoOverallTestReport (type: JacocoReport) {
reports {
csv.enabled false
sourceSets project.sourceSets.main
html.destination "${buildDir}/jacocoOverallTestHtml"
executionData = fileTree(dir: 'build/jacoco', include: '**/*.exec')
}
}
}
eclipse {
classpath {
defaultOutputDir = file('build-eclipse')
downloadSources = true
plusConfigurations += [ configurations.provided ]
}
// Several files have UTF-8 encoding and Eclipse running on Windows
// will have trouble unless we tell it to use UTF-8 encoding.
// This setting needs to go into the core.resources.prefs file,
// which the JDT script isn't set up to configure
eclipseJdt << {
File f = file('.settings/org.eclipse.core.resources.prefs')
f.write('eclipse.preferences.version=1\n')
f.append('encoding/<project>=utf-8')
}
}
cleanEclipse << {
delete '.settings/org.eclipse.core.resources.prefs'
}
tasks.eclipse.dependsOn(cleanEclipse)
idea {
module {
downloadSources = true
scopes.PROVIDED.plus += [ configurations.provided ]
}
}
task jarTest (type: Jar, dependsOn: testClasses) {
description 'Assembles a jar archive of test classes.'
from sourceSets.test.output
classifier 'test'
}
artifacts {
testOutput jarTest
}
sourceSets {
main.compileClasspath += configurations.provided
main.runtimeClasspath -= configurations.provided
test.compileClasspath += configurations.provided
test.runtimeClasspath += configurations.provided
}
javadoc.classpath += configurations.provided
dependencies {
compile 'org.springframework:spring-aop:3.2.12.RELEASE'
compile 'org.springframework:spring-beans:3.2.12.RELEASE'
compile 'org.springframework:spring-context:3.2.12.RELEASE'
compile 'org.springframework:spring-context-support:3.2.12.RELEASE'
compile 'org.springframework:spring-core:3.2.12.RELEASE'
compile 'org.springframework:spring-expression:3.2.12.RELEASE'
compile 'org.springframework:spring-web:3.2.12.RELEASE'
compile 'org.springframework:spring-webmvc:3.2.12.RELEASE'
testCompile 'com.github.stefanbirkner:system-rules:1.9.0'
testCompile 'edu.umd.cs.mtc:multithreadedtc:1.01'
testCompile 'junit:junit:4.12'
testCompile 'org.hamcrest:hamcrest-all:1.3'
testCompile 'org.jmock:jmock:2.8.1'
testCompile 'org.jmock:jmock-junit4:2.8.1'
testCompile 'org.jmock:jmock-legacy:2.8.1'
testRuntime 'cglib:cglib-nodep:3.1'
testRuntime 'org.objenesis:objenesis:2.1'
testRuntime 'org.ow2.asm:asm:5.0.3'
}
test {
include '**/*JUnitTest.class'
useJUnit {
includeCategories 'com.gemstone.gemfire.test.junit.categories.UnitTest'
excludeCategories 'com.gemstone.gemfire.test.junit.categories.IntegrationTest'
excludeCategories 'com.gemstone.gemfire.test.junit.categories.DistributedTest'
}
// run each test in its own vm to avoid interference issues if a test doesn't clean up
// state
//forkEvery 1
doFirst {
writeTestProperties(buildDir, name)
}
}
//This target does not run any tests. Rather, it validates that there are no
//tests that are missing a category annotation
task checkMissedTests(type: Test) {
include '**/*JUnitTest.class'
useJUnit {
excludeCategories 'com.gemstone.gemfire.test.junit.categories.UnitTest'
excludeCategories 'com.gemstone.gemfire.test.junit.categories.IntegrationTest'
}
beforeTest { descriptor ->
throw new GradleException("The test " + descriptor.getClassName() + "." + descriptor.getName() + " does not include a junit category.");
}
}
task integrationTest(type:Test) {
include '**/*JUnitTest.class'
useJUnit {
excludeCategories 'com.gemstone.gemfire.test.junit.categories.UnitTest'
includeCategories 'com.gemstone.gemfire.test.junit.categories.IntegrationTest'
excludeCategories 'com.gemstone.gemfire.test.junit.categories.DistributedTest'
}
forkEvery 1
doFirst {
writeTestProperties(buildDir, name)
}
}
task distributedTest(type:Test) {
include '**/*DUnitTest.class'
// TODO add @Category(DistributedTest.class) to dunit tests
// useJUnit {
// excludeCategories 'com.gemstone.gemfire.test.junit.categories.UnitTest'
// excludeCategories 'com.gemstone.gemfire.test.junit.categories.IntegrationTest'
// includeCategories 'com.gemstone.gemfire.test.junit.categories.DistributedTest'
// }
//I'm hoping this might deal with SOME OOMEs I've seen
forkEvery 30
}
// apply common test configuration
gradle.taskGraph.whenReady( { graph ->
tasks.withType(Test).each { test ->
check.dependsOn test
test.configure {
onlyIf { ! Boolean.getBoolean('skip.tests') }
def resultsDir = testResultsDir(buildDir, test.name)
workingDir resultsDir.absolutePath
reports.html.destination = file "$buildDir/reports/$name"
testLogging {
exceptionFormat = 'full'
}
maxHeapSize '768m'
jvmArgs = ['-XX:+HeapDumpOnOutOfMemoryError', '-XX:MaxPermSize=256M', '-ea']
systemProperties = [
'gemfire.DEFAULT_MAX_OPLOG_SIZE' : '10',
'gemfire.disallowMcastDefaults' : 'true',
'jline.terminal' : 'jline.UnsupportedTerminal',
]
def eol = System.getProperty('line.separator')
def progress = new File(resultsDir, "$test.name-progress.txt")
beforeTest { desc ->
def now = new Date().format('yyyy-MM-dd HH:mm:ss.SSS Z')
progress << "$now Starting test $desc.className $desc.name$eol"
}
afterTest { desc, result ->
def now = new Date().format('yyyy-MM-dd HH:mm:ss.SSS Z')
progress << "$now Completed test $desc.className $desc.name with result: ${result.resultType}$eol"
}
doFirst {
resultsDir.deleteDir()
resultsDir.mkdirs()
}
}
}
})
check.dependsOn integrationTest
check.dependsOn distributedTest
check.dependsOn checkMissedTests
combineReports.mustRunAfter check, test, integrationTest, distributedTest,checkMissedTests
build.finalizedBy combineReports
check.finalizedBy combineReports
test.finalizedBy combineReports
integrationTest.finalizedBy combineReports
distributedTest.finalizedBy combineReports
checkMissedTests.finalizedBy combineReports
// Make sure clean task for rootProject runs last
clean.finalizedBy rootProject.clean
}