-
Notifications
You must be signed in to change notification settings - Fork 6
/
AutoTest.groovy
166 lines (133 loc) · 4.59 KB
/
AutoTest.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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
import org.codehaus.groovy.grails.plugins.PluginManagerHolder
scriptEnv = 'test'
includeTargets << grailsScript("_GrailsArgParsing")
includeTargets << grailsScript("_GrailsClean")
includeTargets << grailsScript("_GrailsCompile")
includeTargets << grailsScript("_GrailsInit")
includeTargets << grailsScript("_GrailsPackage")
includeTargets << grailsScript("_GrailsTest")
TEST_PHASE_AND_TYPE_SEPARATOR = ':'
recompileFrequency = System.getProperty("recompile.frequency")
recompileFrequency = recompileFrequency ? recompileFrequency.toInteger() : 3
target(main: "Auto test") {
depends(checkVersion,
configureProxy,
parseArguments,
cleanTestReports,
packageApp)
// The test targeting patterns
def testTargeters = []
// The params that target a phase and/or type
def phaseAndTypeTargeters = []
// Separate the type/phase targeters from the test targeters
argsMap["params"].each {
def destination = it.contains(TEST_PHASE_AND_TYPE_SEPARATOR) ? phaseAndTypeTargeters : testTargeters
destination << it
}
// If we are targeting tests, set testNames (from _GrailsTest)
if (testTargeters) testNames = testTargeters
// treat pre 1.2 phase targeting args as '«phase»:' for backwards compatibility
["unit", "integration", "functional", "other"].each {
if (argsMap[it]) {
phaseAndTypeTargeters << "${it}${TEST_PHASE_AND_TYPE_SEPARATOR}"
argsMap.remove(it) // these are not test "options"
}
}
// process the phaseAndTypeTargeters, populating the targetPhasesAndTypes map from _GrailsTest
phaseAndTypeTargeters.each {
def parts = it.split(TEST_PHASE_AND_TYPE_SEPARATOR, 2)
def targetPhase = parts[0] ?: TEST_PHASE_WILDCARD
def targetType = parts[1] ?: TEST_TYPE_WILDCARD
if (!targetPhasesAndTypes.containsKey(targetPhase)) targetPhasesAndTypes[targetPhase] = []
targetPhasesAndTypes[targetPhase] << targetType
}
// Any switch style args are "test options" (from _GrailsTest)
argsMap.each {
if (it.key != 'params') {
testOptions[it.key] = it.value
}
}
if (argsMap["xml"]) {
reportFormats = [ "xml" ]
createTestReports = false
}
else {
createTestReports = !argsMap["no-reports"]
}
reRunTests = argsMap["rerun"]
// run tests
allTests()
println '---------------------'
println 'Auto Test is running.'
println '---------------------'
Long lastModified = new Date().time
Boolean autoRecompile = true
Boolean keepRunning = true
while (keepRunning) {
if (autoRecompile) {
lastModified = checkModificationTime(lastModified) {
try {
cleanTestReports()
compile()
Thread currentThread = Thread.currentThread()
classLoader = new URLClassLoader([classesDir.toURI().toURL()] as URL[], rootLoader)
currentThread.setContextClassLoader classLoader
PluginManagerHolder.pluginManager = null
// reload plugins
loadPlugins()
// run tests
allTests()
println '--------------------------------'
println 'Tests run. Auto Test is running.'
println '--------------------------------'
} catch (Throwable e) {
logError("Error running tests", e)
exit(1)
}
}
}
sleep(recompileFrequency * 1000)
}
}
setDefaultTarget(main)
private checkModificationTime(def lastModified, def callback) {
def foldersToCheck = [ "${basedir}/grails-app",
"${basedir}/test",
"${basedir}/src"]
def tmp = lastModified
foldersToCheck.each { folderName ->
def folder = new File(folderName)
folder.eachDir { file ->
def fileModificationTime = checkFileModificationTime(file, tmp)
if (fileModificationTime > tmp) {
tmp = fileModificationTime
}
}
}
if(lastModified < tmp) {
try {
callback()
}
catch(Exception e) {
logError("Error automatically running tests", e)
}
}
lastModified = tmp
return lastModified
}
private checkFileModificationTime(def file, def tmp) {
def fileModificationTime
if (file.isDirectory()) {
for (nestedFile in file.listFiles()) {
fileModificationTime = checkFileModificationTime(nestedFile, tmp)
if (fileModificationTime > tmp) {
return fileModificationTime
}
}
}
fileModificationTime = file.lastModified()
if (fileModificationTime > tmp) {
tmp = fileModificationTime
}
return tmp
}