Skip to content

Commit b1576f3

Browse files
authored
Modernise DSL (#69)
1 parent e57f052 commit b1576f3

File tree

32 files changed

+501
-520
lines changed

32 files changed

+501
-520
lines changed

build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ allprojects {
3737
compilerOptions {
3838
jvmTarget.set(JvmTarget.JVM_17)
3939
freeCompilerArgs.addAll(
40+
"-Xjvm-default=all",
4041
"-opt-in=kotlin.RequiresOptIn"
4142
)
4243
}

core/src/integrationTest/kotlin/com/malinskiy/marathon/cache/gradle/GradleCacheContainer.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.malinskiy.marathon.cache.gradle
22

33
import org.testcontainers.containers.GenericContainer
44
import org.testcontainers.containers.wait.strategy.Wait
5+
import java.net.URI
56
import java.time.Duration
67

78
class GradleCacheContainer(image: String = "$DEFAULT_IMAGE_NAME:$DEFAULT_TAG") :
@@ -14,8 +15,8 @@ class GradleCacheContainer(image: String = "$DEFAULT_IMAGE_NAME:$DEFAULT_TAG") :
1415
.withStartupTimeout(Duration.ofSeconds(DEFAULT_STARTUP_TIMEOUT_SECONDS))
1516
}
1617

17-
val cacheUrl: String
18-
get() = "http://$containerIpAddress:$httpPort/cache/"
18+
val cacheUrl: URI
19+
get() = URI.create("http://$containerIpAddress:$httpPort/cache/")
1920

2021
private val httpPort: Int
2122
get() = getMappedPort(DEFAULT_PORT)

core/src/main/kotlin/com/malinskiy/marathon/Marathon.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class Marathon(
5151
private val logger = MarathonLogging.logger("Marathon")
5252

5353
private val configurationValidator = LogicalConfigurationValidator()
54-
private val strictRunProcessor = StrictRunProcessor(configuration.strictRunFilterConfiguration)
54+
private val strictRunProcessor = StrictRunProcessor(configuration.strictRunConfiguration)
5555

5656
private lateinit var scheduler: Scheduler
5757
private lateinit var hook: ShutdownHook

core/src/main/kotlin/com/malinskiy/marathon/analytics/TrackerFactory.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ internal class TrackerFactory(
4848

4949
track + mappingTracker
5050
track + cacheTestResultsTracker
51-
configuration.customAnalyticsTracker?.let { track + it }
51+
configuration.analyticsTracker?.let { track + it }
5252

5353
return delegatingTrackerInternal
5454
}

core/src/main/kotlin/com/malinskiy/marathon/cache/config/RemoteCacheConfiguration.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.malinskiy.marathon.cache.config
22

3+
import java.net.URI
4+
35
sealed class RemoteCacheConfiguration {
46

57
data class Enabled(
6-
val url: String,
8+
val url: URI,
79
val credentials: Credentials? = null
810
) : RemoteCacheConfiguration()
911

core/src/main/kotlin/com/malinskiy/marathon/cache/gradle/GradleHttpCacheService.kt

+1-3
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,11 @@ import kotlinx.coroutines.Dispatchers
2222
import kotlinx.coroutines.withContext
2323
import java.io.ByteArrayOutputStream
2424
import java.io.IOException
25-
import java.net.URI
2625
import java.net.URL
2726

2827
class GradleHttpCacheService(private val configuration: RemoteCacheConfiguration.Enabled) : CacheService {
2928

3029
private val httpClient = createClient()
31-
private val baseUri = URI.create(configuration.url)
3230

3331
private val logger = MarathonLogging.logger("GradleHttpCacheService")
3432

@@ -73,7 +71,7 @@ class GradleHttpCacheService(private val configuration: RemoteCacheConfiguration
7371
}
7472

7573
private fun CacheKey.entryUrl(): URL =
76-
baseUri.resolve(this.key).toURL()
74+
configuration.url.resolve(key).toURL()
7775

7876
private fun createClient(): HttpClient = HttpClient(Apache) {
7977
engine {

core/src/main/kotlin/com/malinskiy/marathon/cache/test/TestCacheLoader.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class TestCacheLoader(
6464
if (configuration.cache.isEnabled) {
6565
val testCacheBlackList: MutableList<Test> = arrayListOf()
6666
tests.tests.forEach { test ->
67-
if (configuration.strictRunFilterConfiguration.filter.matches(test)) {
67+
if (configuration.strictRunConfiguration.filter.matches(test)) {
6868
testCacheBlackList.add(test)
6969
} else {
7070
testsToCheck.send(TestToCheck(poolId, test, isStrictRun = false))

core/src/main/kotlin/com/malinskiy/marathon/execution/Configuration.kt

+23-23
Original file line numberDiff line numberDiff line change
@@ -22,114 +22,114 @@ private const val DEFAULT_OUTPUT_TIMEOUT_MILLIS: Long = 60_000
2222
data class Configuration(
2323
val outputDir: File,
2424

25-
val customAnalyticsTracker: Tracker?,
25+
val cache: CacheConfiguration,
2626
val poolingStrategy: PoolingStrategy,
2727
val shardingStrategy: ShardingStrategy,
2828
val sortingStrategy: SortingStrategy,
2929
val batchingStrategy: BatchingStrategy,
3030
val flakinessStrategy: FlakinessStrategy,
3131
val retryStrategy: RetryStrategy,
3232
val filteringConfiguration: FilteringConfiguration,
33-
val strictRunFilterConfiguration: StrictRunFilterConfiguration,
34-
val listener: MarathonListener?,
33+
val strictRunConfiguration: StrictRunConfiguration,
3534

36-
val cache: CacheConfiguration,
35+
val debug: Boolean,
3736
val ignoreFailures: Boolean,
3837
val strictMode: Boolean,
3938
val uncompletedTestRetryQuota: Int,
4039

41-
val testClassRegexes: Collection<Regex>,
4240
val includeSerialRegexes: Collection<Regex>,
4341
val excludeSerialRegexes: Collection<Regex>,
42+
val testClassRegexes: Collection<Regex>,
4443
val ignoreFailureRegexes: Collection<Regex>,
4544
val failFastFailureRegexes: Collection<Regex>,
4645

4746
val testOutputTimeoutMillis: Long,
4847
val noDevicesTimeoutMillis: Long,
49-
val debug: Boolean,
5048

49+
val analyticsTracker: Tracker?,
50+
val listener: MarathonListener?,
5151
val vendorConfiguration: VendorConfiguration
5252
) {
5353

5454
constructor(
5555
outputDir: File,
5656

57-
customAnalyticsTracker: Tracker?,
57+
cache: CacheConfiguration?,
5858
poolingStrategy: PoolingStrategy?,
5959
shardingStrategy: ShardingStrategy?,
6060
sortingStrategy: SortingStrategy?,
6161
batchingStrategy: BatchingStrategy?,
6262
flakinessStrategy: FlakinessStrategy?,
6363
retryStrategy: RetryStrategy?,
6464
filteringConfiguration: FilteringConfiguration?,
65-
strictRunFilterConfiguration: StrictRunFilterConfiguration?,
66-
listener: MarathonListener?,
65+
strictRunConfiguration: StrictRunConfiguration?,
6766

68-
cache: CacheConfiguration?,
67+
debug: Boolean?,
6968
ignoreFailures: Boolean?,
7069
strictMode: Boolean?,
7170
uncompletedTestRetryQuota: Int?,
7271

73-
testClassRegexes: Collection<Regex>?,
7472
includeSerialRegexes: Collection<Regex>?,
7573
excludeSerialRegexes: Collection<Regex>?,
74+
testClassRegexes: Collection<Regex>?,
7675
ignoreFailureRegexes: Collection<Regex>?,
7776
failFastFailureRegexes: Collection<Regex>?,
7877

7978
testOutputTimeoutMillis: Long?,
8079
noDevicesTimeoutMillis: Long?,
81-
debug: Boolean?,
8280

81+
analyticsTracker: Tracker?,
82+
listener: MarathonListener?,
8383
vendorConfiguration: VendorConfiguration
8484
) :
8585

8686
this(
8787
outputDir = outputDir,
88-
customAnalyticsTracker = customAnalyticsTracker,
88+
cache = cache ?: CacheConfiguration(),
8989
poolingStrategy = poolingStrategy ?: OmniPoolingStrategy(),
9090
shardingStrategy = shardingStrategy ?: ParallelShardingStrategy(),
9191
sortingStrategy = sortingStrategy ?: NoSortingStrategy(),
9292
batchingStrategy = batchingStrategy ?: IsolateBatchingStrategy(),
9393
flakinessStrategy = flakinessStrategy ?: IgnoreFlakinessStrategy(),
9494
retryStrategy = retryStrategy ?: NoRetryStrategy(),
95-
filteringConfiguration = filteringConfiguration ?: FilteringConfiguration(emptyList(), emptyList()),
96-
strictRunFilterConfiguration = strictRunFilterConfiguration ?: StrictRunFilterConfiguration(emptyList()),
97-
cache = cache ?: CacheConfiguration(),
95+
filteringConfiguration = filteringConfiguration ?: FilteringConfiguration(),
96+
strictRunConfiguration = strictRunConfiguration ?: StrictRunConfiguration(),
97+
debug = debug ?: true,
9898
ignoreFailures = ignoreFailures ?: false,
9999
strictMode = strictMode ?: false,
100-
listener = listener,
101100
uncompletedTestRetryQuota = uncompletedTestRetryQuota ?: Integer.MAX_VALUE,
102-
testClassRegexes = testClassRegexes ?: listOf(Regex("^((?!Abstract).)*Test$")),
103101
includeSerialRegexes = includeSerialRegexes ?: emptyList(),
104102
excludeSerialRegexes = excludeSerialRegexes ?: emptyList(),
103+
testClassRegexes = testClassRegexes ?: listOf(Regex("^((?!Abstract).)*Test$")),
105104
ignoreFailureRegexes = ignoreFailureRegexes ?: emptyList(),
106105
failFastFailureRegexes = failFastFailureRegexes ?: emptyList(),
107106
testOutputTimeoutMillis = testOutputTimeoutMillis ?: DEFAULT_OUTPUT_TIMEOUT_MILLIS,
108107
noDevicesTimeoutMillis = noDevicesTimeoutMillis ?: DEFAULT_NO_DEVICES_TIMEOUT_MILLIS,
109-
debug = debug ?: true,
108+
analyticsTracker = analyticsTracker,
109+
listener = listener,
110110
vendorConfiguration = vendorConfiguration
111111
)
112112

113113
fun toMap() =
114114
mapOf<String, String>(
115115
"outputDir" to outputDir.absolutePath,
116+
"cache" to cache.toString(),
116117
"pooling" to poolingStrategy.toString(),
117118
"sharding" to shardingStrategy.toString(),
118119
"sorting" to sortingStrategy.toString(),
119120
"batching" to batchingStrategy.toString(),
120121
"flakiness" to flakinessStrategy.toString(),
121122
"retry" to retryStrategy.toString(),
122123
"filtering" to filteringConfiguration.toString(),
123-
"strictRunFilter" to strictRunFilterConfiguration.toString(),
124-
"cache" to cache.toString(),
124+
"strictRun" to strictRunConfiguration.toString(),
125+
"debug" to debug.toString(),
125126
"ignoreFailures" to ignoreFailures.toString(),
126127
"strictMode" to strictMode.toString(),
127-
"testClassRegexes" to testClassRegexes.toString(),
128128
"includeSerialRegexes" to includeSerialRegexes.toString(),
129129
"excludeSerialRegexes" to excludeSerialRegexes.toString(),
130+
"testClassRegexes" to testClassRegexes.toString(),
130131
"testOutputTimeoutMillis" to testOutputTimeoutMillis.toString(),
131132
"noDevicesTimeoutMillis" to noDevicesTimeoutMillis.toString(),
132-
"debug" to debug.toString(),
133133
"vendorConfiguration" to vendorConfiguration.toString()
134134
)
135135
}

core/src/main/kotlin/com/malinskiy/marathon/execution/StrictRunChecker.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ interface StrictRunChecker {
1010
class ConfigurationStrictRunChecker(private val configuration: Configuration) : StrictRunChecker {
1111

1212
override fun isStrictRun(test: Test): Boolean =
13-
configuration.strictMode || configuration.strictRunFilterConfiguration.filter.matches(test)
13+
configuration.strictMode || configuration.strictRunConfiguration.filter.matches(test)
1414

1515
override fun hasFailFastFailures(stackTrace: String?): Boolean =
1616
stackTrace?.let { configuration.failFastFailureRegexes.any { it.matches(stackTrace) } } == true

core/src/main/kotlin/com/malinskiy/marathon/execution/StrictRunFilterConfiguration.kt renamed to core/src/main/kotlin/com/malinskiy/marathon/execution/StrictRunConfiguration.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.malinskiy.marathon.execution
22

33
import com.fasterxml.jackson.annotation.JsonProperty
44

5-
data class StrictRunFilterConfiguration(
5+
data class StrictRunConfiguration(
66
@JsonProperty("filter", required = false) val filter: Collection<TestFilter> = emptyList(),
77
@JsonProperty("runs", required = false) val runs: Int = 1
88
)

core/src/main/kotlin/com/malinskiy/marathon/execution/StrictRunProcessor.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.malinskiy.marathon.execution
22

33
import com.malinskiy.marathon.test.Test
44

5-
class StrictRunProcessor(private val configuration: StrictRunFilterConfiguration) {
5+
class StrictRunProcessor(private val configuration: StrictRunConfiguration) {
66

77
fun processShard(shard: TestShard): TestShard {
88
var testsForStrictRun = if (configuration.filter.isEmpty()) emptyList() else shard.tests.toList()

core/src/main/kotlin/com/malinskiy/marathon/execution/queue/TestResultReporter.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class TestResultReporter(
107107
}
108108

109109
private fun Test.isStrictRun(): Boolean =
110-
configuration.strictMode || configuration.strictRunFilterConfiguration.filter.matches(this)
110+
configuration.strictMode || configuration.strictRunConfiguration.filter.matches(this)
111111

112112
fun addShard(shard: TestShard) {
113113
val allTests = shard.tests + shard.flakyTests

core/src/test/kotlin/com/malinskiy/marathon/execution/queue/TestResultReporterSpec.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import com.malinskiy.marathon.analytics.internal.pub.Track
55
import com.malinskiy.marathon.createDeviceInfo
66
import com.malinskiy.marathon.device.DevicePoolId
77
import com.malinskiy.marathon.execution.SimpleClassnameFilter
8-
import com.malinskiy.marathon.execution.StrictRunFilterConfiguration
8+
import com.malinskiy.marathon.execution.StrictRunConfiguration
99
import com.malinskiy.marathon.execution.TestFilter
1010
import com.malinskiy.marathon.execution.TestResult
1111
import com.malinskiy.marathon.execution.TestShard
@@ -44,7 +44,7 @@ object TestResultReporterSpec : Spek(
4444

4545
fun strictFilterReporter(filter: TestFilter) = TestResultReporter(
4646
poolId,
47-
defaultConfig.copy(strictRunFilterConfiguration = StrictRunFilterConfiguration(filter = listOf(filter), runs = 3)),
47+
defaultConfig.copy(strictRunConfiguration = StrictRunConfiguration(filter = listOf(filter), runs = 3)),
4848
track
4949
).apply {
5050
addShard(TestShard(listOf(test, test, test)))

marathon-gradle-plugin/src/main/kotlin/com/malinskiy/marathon/BatchingStrategyConfiguration.kt

+31-19
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,43 @@ package com.malinskiy.marathon
33
import com.malinskiy.marathon.execution.strategy.BatchingStrategy
44
import com.malinskiy.marathon.execution.strategy.impl.batching.FixedSizeBatchingStrategy
55
import com.malinskiy.marathon.execution.strategy.impl.batching.IsolateBatchingStrategy
6-
import groovy.lang.Closure
6+
import org.gradle.api.Action
7+
import org.gradle.api.provider.Property
8+
import org.gradle.api.tasks.Nested
9+
import java.time.Duration
710
import java.time.Instant
811

9-
class BatchingStrategyConfiguration {
10-
var fixedSize: FixedSizeBatchingStrategyConfiguration? = null
12+
interface BatchingStrategyConfiguration {
13+
@get:Nested
14+
val fixedSize: FixedSizeBatchingStrategyConfiguration
1115

12-
fun fixedSize(block: FixedSizeBatchingStrategyConfiguration.() -> Unit) {
13-
fixedSize = FixedSizeBatchingStrategyConfiguration().also(block)
16+
fun fixedSize(action: Action<FixedSizeBatchingStrategyConfiguration>) {
17+
fixedSize.initDefaults()
18+
action.execute(fixedSize)
1419
}
20+
}
21+
22+
interface FixedSizeBatchingStrategyConfiguration {
23+
val size: Property<Int>
24+
val durationMillis: Property<Long>
25+
val percentile: Property<Double>
26+
val timeLimit: Property<Duration>
27+
val lastMileLength: Property<Int>
1528

16-
fun fixedSize(closure: Closure<*>) {
17-
fixedSize = FixedSizeBatchingStrategyConfiguration()
18-
closure.delegate = fixedSize
19-
closure.call()
29+
fun initDefaults() {
30+
size.convention(1)
31+
lastMileLength.convention(0)
2032
}
2133
}
2234

23-
class FixedSizeBatchingStrategyConfiguration {
24-
var size = 1
25-
var durationMillis: Long? = null
26-
var percentile: Double? = null
27-
var timeLimit: Instant? = null
28-
var lastMileLength: Int = 0
29-
}
35+
internal fun BatchingStrategyConfiguration.toStrategy(): BatchingStrategy =
36+
if (fixedSize.size.isPresent) fixedSize.toStrategy() else IsolateBatchingStrategy()
3037

31-
fun BatchingStrategyConfiguration.toStrategy(): BatchingStrategy = fixedSize?.let {
32-
FixedSizeBatchingStrategy(it.size, it.durationMillis, it.percentile, it.timeLimit, it.lastMileLength)
33-
} ?: IsolateBatchingStrategy()
38+
private fun FixedSizeBatchingStrategyConfiguration.toStrategy(): FixedSizeBatchingStrategy =
39+
FixedSizeBatchingStrategy(
40+
size = size.get(),
41+
durationMillis = durationMillis.orNull,
42+
percentile = percentile.orNull,
43+
timeLimit = timeLimit.orNull?.let { Instant.now().minus(it) },
44+
lastMileLength = lastMileLength.get()
45+
)

0 commit comments

Comments
 (0)