-
Notifications
You must be signed in to change notification settings - Fork 4.5k
/
ParallelDownloadsPerformanceTest.groovy
159 lines (129 loc) · 5.31 KB
/
ParallelDownloadsPerformanceTest.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
/*
* Copyright 2017 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.performance.regression.corefeature
import org.eclipse.jetty.webapp.WebAppContext
import org.gradle.performance.AbstractCrossVersionPerformanceTest
import org.gradle.performance.WithExternalRepository
import org.gradle.performance.annotations.RunFor
import org.gradle.performance.annotations.Scenario
import org.gradle.profiler.BuildContext
import org.gradle.profiler.BuildMutator
import javax.servlet.DispatcherType
import javax.servlet.Filter
import javax.servlet.FilterChain
import javax.servlet.FilterConfig
import javax.servlet.ServletException
import javax.servlet.ServletRequest
import javax.servlet.ServletResponse
import javax.servlet.http.HttpServletRequest
import java.util.concurrent.atomic.AtomicInteger
import static org.gradle.performance.annotations.ScenarioType.SLOW
import static org.gradle.performance.results.OperatingSystem.LINUX
@RunFor(
@Scenario(type = SLOW, operatingSystems = [LINUX], testProjects = ["springBootApp"])
)
class ParallelDownloadsPerformanceTest extends AbstractCrossVersionPerformanceTest implements WithExternalRepository {
File tmpRepoDir = temporaryFolder.createDir('repository')
@Override
File getRepoDir() {
tmpRepoDir
}
def setup() {
runner.targetVersions = ["6.8.2-20210218002439+0000"]
// Example project requires TaskContainer.register
runner.minimumBaseVersion = "4.9"
runner.warmUpRuns = 5
runner.runs = 15
runner.addBuildMutator { invocationSettings ->
new BuildMutator() {
@Override
void afterBuild(BuildContext context, Throwable error) {
cleanupCache(invocationSettings.gradleUserHome)
}
private void cleanupCache(File userHomeDir) {
['modules-2', 'external-resources'].each {
new File("$userHomeDir/caches/$it").deleteDir()
}
}
}
}
}
def "resolves dependencies from external repository"() {
startServer()
given:
runner.tasksToRun = ['resolveDependencies']
runner.args = ['-I', 'init.gradle', "-PmirrorPath=${repoDir.absolutePath}", "-PmavenRepoURL=http://127.0.0.1:${serverPort}/", "-Dorg.gradle.parallel=false"]
when:
def result = runner.run()
then:
result.assertCurrentVersionHasNotRegressed()
cleanup:
stopServer()
}
def "resolves dependencies from external repository (parallel)"() {
startServer()
given:
runner.tasksToRun = ['resolveDependencies']
runner.args = ['-I', 'init.gradle', "-PmirrorPath=${repoDir.absolutePath}", "-PmavenRepoURL=http://127.0.0.1:${serverPort}/", '--parallel']
when:
def result = runner.run()
then:
result.assertCurrentVersionHasNotRegressed()
cleanup:
stopServer()
}
@Override
WebAppContext createContext() {
def context = new WebAppContext()
context.addFilter(SimulatedDownloadLatencyFilter, '/*', EnumSet.of(DispatcherType.REQUEST))
context
}
static class SimulatedDownloadLatencyFilter implements Filter {
// don't put those numbers too high, or the test is going to be really slow for each iteration!
private final static int[] DELAYS = [2, 3, 5, 8, 13, 21, 34, 55]
private final static boolean LOG = false
private final static Map<String, Integer> FACTORS = [
'jar': 10,
'xml': 3,
'pom': 3
].withDefault { 1 }
private final AtomicInteger concurrency = new AtomicInteger()
@Override
void init(FilterConfig filterConfig) throws ServletException {
}
@Override
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request
def path = httpRequest.servletPath
// compute a digest based on the path, allowing us to use the same latency for the same request each time
int sig = DELAYS[path.bytes.sum() % DELAYS.length]
def ext = path.contains('.') ? path.substring(1 + path.lastIndexOf('.')) : ''
int latency = sig * FACTORS[ext]
def file = path.substring(path.lastIndexOf('/'))
if (LOG) {
println "File ${file} : ${latency}ms - concurrent requests: ${concurrency.incrementAndGet()}"
}
if (latency) {
sleep latency
}
concurrency.decrementAndGet()
chain.doFilter(request, response)
}
@Override
void destroy() {
}
}
}