/
JavaToolchainDownloadSoakTest.groovy
136 lines (114 loc) · 4.38 KB
/
JavaToolchainDownloadSoakTest.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
* Copyright 2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.gradle.jvm.toolchain
import org.gradle.api.file.FileVisitDetails
import org.gradle.api.file.FileVisitor
import org.gradle.api.internal.file.collections.SingleIncludePatternFileTree
import org.gradle.integtests.fixtures.AbstractIntegrationSpec
class JavaToolchainDownloadSoakTest extends AbstractIntegrationSpec {
def setup() {
settingsFile << """
plugins {
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.2'
}
"""
buildFile << """
plugins {
id "java"
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(16)
}
}
"""
file("src/main/java/Foo.java") << "public class Foo {}"
executer.requireOwnGradleUserHomeDir()
executer
.withToolchainDownloadEnabled()
}
def "can download missing jdk automatically"() {
when:
result = executer
.withTasks("compileJava")
.run()
then:
javaClassFile("Foo.class").assertExists()
assertJdkWasDownloaded("eclipse_foundation")
}
def "can download missing j9 jdk automatically"() {
buildFile << """
java {
toolchain {
implementation = JvmImplementation.J9
}
}
"""
when:
result = executer
.withTasks("compileJava")
.run()
then:
javaClassFile("Foo.class").assertExists()
assertJdkWasDownloaded("openj9")
}
def "clean destination folder when downloading toolchain"() {
when: "build runs and doesn't have a local JDK to use for compilation"
result = executer
.withTasks("compileJava", "-Porg.gradle.java.installations.auto-detect=false")
.run()
then: "suitable JDK gets auto-provisioned"
javaClassFile("Foo.class").assertExists()
assertJdkWasDownloaded("eclipse_foundation")
when: "the marker file of the auto-provisioned JDK is deleted, making the JDK not detectable"
//delete marker file to make the previously downloaded installation undetectable
def markerFile = findMarkerFile(executer.gradleUserHomeDir.file("jdks"))
markerFile.delete()
assert !markerFile.exists()
and: "build runs again"
executer
.withTasks("compileJava", "-Porg.gradle.java.installations.auto-detect=false", "-Porg.gradle.java.installations.auto-download=true")
.run()
then: "the JDK is auto-provisioned again and its files, even though they are already there don't trigger an error, they just get overwritten"
markerFile.exists()
}
private void assertJdkWasDownloaded(String implementation) {
assert executer.gradleUserHomeDir.file("jdks").listFiles({ file ->
file.name.contains("-16-") && file.name.contains(implementation)
} as FileFilter)
}
def cleanup() {
executer.gradleUserHomeDir.file("jdks").deleteDir()
}
private static File findMarkerFile(File directory) {
File markerFile
new SingleIncludePatternFileTree(directory, "**").visit(new FileVisitor() {
@Override
void visitDir(FileVisitDetails dirDetails) {
}
@Override
void visitFile(FileVisitDetails fileDetails) {
if (fileDetails.file.name == "provisioned.ok") {
markerFile = fileDetails.file
}
}
})
if (markerFile == null) {
throw new RuntimeException("Marker file not found in " + directory.getAbsolutePath() + "")
}
return markerFile
}
}