Skip to content

Commit 182a775

Browse files
committed
feat(core): add progress api + rework reporters
1 parent 8b5087f commit 182a775

File tree

50 files changed

+927
-314
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+927
-314
lines changed

buildSrc/src/main/kotlin/Versions.kt

+11
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ object Versions {
5151
val jsonAssert = "1.5.3"
5252
val xmlUnit = "2.10.0"
5353
val assertk = "0.28.1"
54+
55+
val grpc = "1.59.0"
56+
val grpcKotlin = "1.4.0"
57+
val grpcOkhttp = "1.59.0"
58+
val protobufGradle = "0.9.4"
59+
val protobuf = "3.25.0"
5460
}
5561

5662
object BuildPlugins {
@@ -97,6 +103,11 @@ object Libraries {
97103
val kotlinProcess = "com.github.pgreze:kotlin-process:${Versions.kotlinProcess}"
98104
val okhttp = "com.squareup.okhttp3:okhttp:${Versions.okhttp}"
99105
val ktorNetwork = "io.ktor:ktor-network:${Versions.ktor}"
106+
val protobufLite = "com.google.protobuf:protobuf-javalite:${Versions.protobuf}"
107+
val grpcStub = "io.grpc:grpc-stub:${Versions.grpc}"
108+
val grpcKotlinStub = "io.grpc:grpc-kotlin-stub:${Versions.grpcKotlin}"
109+
val grpcProtobufLite = "io.grpc:grpc-protobuf-lite:${Versions.grpc}"
110+
val grpcOkhttp = "io.grpc:grpc-okhttp:${Versions.grpcOkhttp}"
100111
}
101112

102113
object TestLibraries {

configuration/src/main/kotlin/com/malinskiy/marathon/config/Configuration.kt

+6-6
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ data class Configuration private constructor(
5050
val analyticsTracking: Boolean,
5151
val bugsnagReporting: Boolean,
5252
val deviceInitializationTimeoutMillis: Long,
53-
val ciConfiguration: CIConfiguration,
53+
val progressConfiguration: ProgressConfiguration,
5454
) {
5555
fun toMap() =
5656
mapOf<String, String>(
@@ -76,7 +76,7 @@ data class Configuration private constructor(
7676
"screenRecordingPolicy" to screenRecordingPolicy.toString(),
7777
"vendorConfiguration" to vendorConfiguration.toString(),
7878
"deviceInitializationTimeoutMillis" to deviceInitializationTimeoutMillis.toString(),
79-
"ciConfiguration" to ciConfiguration.toString(),
79+
"progressConfiguration" to progressConfiguration.toString(),
8080
)
8181

8282
override fun equals(other: Any?): Boolean {
@@ -110,7 +110,7 @@ data class Configuration private constructor(
110110
if (analyticsTracking != other.analyticsTracking) return false
111111
if (bugsnagReporting != other.bugsnagReporting) return false
112112
if (deviceInitializationTimeoutMillis != other.deviceInitializationTimeoutMillis) return false
113-
if (ciConfiguration != other.ciConfiguration) return false
113+
if (progressConfiguration != other.progressConfiguration) return false
114114

115115
return true
116116
}
@@ -141,7 +141,7 @@ data class Configuration private constructor(
141141
result = 31 * result + analyticsTracking.hashCode()
142142
result = 31 * result + bugsnagReporting.hashCode()
143143
result = 31 * result + deviceInitializationTimeoutMillis.hashCode()
144-
result = 31 * result + ciConfiguration.hashCode()
144+
result = 31 * result + progressConfiguration.hashCode()
145145
return result
146146
}
147147

@@ -177,7 +177,7 @@ data class Configuration private constructor(
177177

178178
var outputConfiguration: OutputConfiguration = OutputConfiguration(),
179179
var vendorConfiguration: VendorConfiguration = VendorConfiguration.EmptyVendorConfiguration(),
180-
var ciConfiguration: CIConfiguration = CIConfiguration.None,
180+
var progressConfiguration: ProgressConfiguration = ProgressConfiguration.Auto,
181181
) {
182182
fun build(): Configuration {
183183
return Configuration(
@@ -206,7 +206,7 @@ data class Configuration private constructor(
206206
analyticsTracking = analyticsTracking,
207207
bugsnagReporting = bugsnagReporting,
208208
deviceInitializationTimeoutMillis = deviceInitializationTimeoutMillis,
209-
ciConfiguration = ciConfiguration,
209+
progressConfiguration = progressConfiguration,
210210
)
211211
}
212212
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.malinskiy.marathon.config
2+
3+
import com.fasterxml.jackson.annotation.JsonSubTypes
4+
import com.fasterxml.jackson.annotation.JsonTypeInfo
5+
6+
@JsonTypeInfo(
7+
use = JsonTypeInfo.Id.NAME,
8+
include = JsonTypeInfo.As.PROPERTY,
9+
property = "type"
10+
)
11+
@JsonSubTypes(
12+
JsonSubTypes.Type(value = ProgressConfiguration.Auto::class, name = "auto"),
13+
JsonSubTypes.Type(value = ProgressConfiguration.Custom::class, name = "custom"),
14+
)
15+
16+
sealed class ProgressConfiguration {
17+
data object Auto : ProgressConfiguration()
18+
data class Custom(val values: List<ProgressReporterConfiguration>) : ProgressConfiguration()
19+
}
20+
21+
@JsonTypeInfo(
22+
use = JsonTypeInfo.Id.NAME,
23+
include = JsonTypeInfo.As.PROPERTY,
24+
property = "type"
25+
)
26+
@JsonSubTypes(
27+
JsonSubTypes.Type(value = ProgressReporterConfiguration.Stdout::class, name = "stdout"),
28+
JsonSubTypes.Type(value = ProgressReporterConfiguration.Teamcity::class, name = "teamcity"),
29+
JsonSubTypes.Type(value = ProgressReporterConfiguration.Device::class, name = "device"),
30+
JsonSubTypes.Type(value = ProgressReporterConfiguration.Billing::class, name = "billing"),
31+
JsonSubTypes.Type(value = ProgressReporterConfiguration.JUnit::class, name = "junit"),
32+
JsonSubTypes.Type(value = ProgressReporterConfiguration.Timeline::class, name = "timeline"),
33+
JsonSubTypes.Type(value = ProgressReporterConfiguration.Raw::class, name = "raw"),
34+
JsonSubTypes.Type(value = ProgressReporterConfiguration.Allure::class, name = "allure"),
35+
JsonSubTypes.Type(value = ProgressReporterConfiguration.Html::class, name = "html"),
36+
JsonSubTypes.Type(value = ProgressReporterConfiguration.ApiV1::class, name = "api_v1"),
37+
)
38+
sealed class ProgressReporterConfiguration {
39+
data object Stdout : ProgressReporterConfiguration()
40+
data object Teamcity : ProgressReporterConfiguration()
41+
data object Device : ProgressReporterConfiguration()
42+
data object Billing : ProgressReporterConfiguration()
43+
data object JUnit : ProgressReporterConfiguration()
44+
data object Timeline : ProgressReporterConfiguration()
45+
data object Raw : ProgressReporterConfiguration()
46+
data object Test : ProgressReporterConfiguration()
47+
data object Allure : ProgressReporterConfiguration()
48+
data object Html : ProgressReporterConfiguration()
49+
data class ApiV1(val target: String, val run_id: String) : ProgressReporterConfiguration()
50+
}

core/build.gradle.kts

+43
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
2+
import com.google.protobuf.gradle.id
3+
import com.google.protobuf.gradle.remove
24

35
plugins {
46
idea
@@ -7,6 +9,7 @@ plugins {
79
id("org.jetbrains.dokka")
810
jacoco
911
id("com.github.gmazzo.buildconfig") version "5.5.0"
12+
id("com.google.protobuf") version Versions.protobufGradle
1013
}
1114

1215
sourceSets {
@@ -62,6 +65,11 @@ dependencies {
6265
implementation(Libraries.scalr)
6366
api(Libraries.koin)
6467
api(Libraries.bugsnag)
68+
api(Libraries.protobufLite)
69+
api(Libraries.grpcProtobufLite)
70+
api(Libraries.grpcKotlinStub)
71+
api(Libraries.grpcOkhttp)
72+
api(Libraries.grpcStub)
6573
testImplementation(project(":vendor:vendor-test"))
6674
testImplementation(TestLibraries.junit5)
6775
testImplementation(TestLibraries.kluent)
@@ -90,3 +98,38 @@ val integrationTest = task<Test>("integrationTest") {
9098
setupDeployment()
9199
setupKotlinCompiler()
92100
setupTestTask()
101+
102+
protobuf {
103+
protoc {
104+
artifact = "com.google.protobuf:protoc:${Versions.protobuf}"
105+
}
106+
plugins {
107+
id("java") {
108+
artifact = "io.grpc:protoc-gen-grpc-java:${Versions.grpc}"
109+
}
110+
id("grpc") {
111+
artifact = "io.grpc:protoc-gen-grpc-java:${Versions.grpc}"
112+
}
113+
id("grpckt") {
114+
artifact = "io.grpc:protoc-gen-grpc-kotlin:${Versions.grpcKotlin}:jdk8@jar"
115+
}
116+
}
117+
generateProtoTasks {
118+
all().forEach {
119+
it.builtins {
120+
remove("java")
121+
}
122+
it.plugins {
123+
id("java") {
124+
option("lite")
125+
}
126+
id("grpc") {
127+
option("lite")
128+
}
129+
id("grpckt") {
130+
option("lite")
131+
}
132+
}
133+
}
134+
}
135+
}

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

+4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import com.malinskiy.marathon.execution.TestParser
2121
import com.malinskiy.marathon.execution.TestShard
2222
import com.malinskiy.marathon.execution.bundle.TestBundleIdentifier
2323
import com.malinskiy.marathon.execution.command.parse.MarathonTestParseCommand
24+
import com.malinskiy.marathon.report.ProgressReporter
2425
import com.malinskiy.marathon.execution.withRetry
2526
import com.malinskiy.marathon.extension.toFlakinessStrategy
2627
import com.malinskiy.marathon.extension.toShardingStrategy
@@ -54,6 +55,7 @@ class Marathon(
5455
private val tracker: TrackerInternal,
5556
private val analytics: Analytics,
5657
private val track: Track,
58+
private val progressReporter: ProgressReporter,
5759
private val timer: Timer,
5860
private val marathonTestParseCommand: MarathonTestParseCommand,
5961
private val usageTracker: UsageTracker,
@@ -155,6 +157,7 @@ class Marathon(
155157

156158
val shard = prepareTestShard(parsedFilteredTests, analytics)
157159

160+
progressReporter.begin(parsedFilteredTests)
158161
usageTracker.trackEvent(Event.TestsTotal(parsedAllTests.size))
159162
usageTracker.trackEvent(Event.TestsRun(parsedFilteredTests.size))
160163

@@ -167,6 +170,7 @@ class Marathon(
167170
configuration,
168171
shard,
169172
track,
173+
progressReporter,
170174
timer,
171175
testBundleIdentifier,
172176
currentCoroutineContext

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

+3-32
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.malinskiy.marathon.analytics
22

3-
import com.google.gson.Gson
43
import com.malinskiy.marathon.analytics.external.graphite.BasicGraphiteClient
54
import com.malinskiy.marathon.analytics.external.graphite.GraphiteTracker
65
import com.malinskiy.marathon.analytics.external.influx.InfluxDbProvider
@@ -15,29 +14,13 @@ import com.malinskiy.marathon.config.AnalyticsConfiguration.GraphiteConfiguratio
1514
import com.malinskiy.marathon.config.AnalyticsConfiguration.InfluxDb2Configuration
1615
import com.malinskiy.marathon.config.AnalyticsConfiguration.InfluxDbConfiguration
1716
import com.malinskiy.marathon.config.Configuration
18-
import com.malinskiy.marathon.io.FileManager
17+
import com.malinskiy.marathon.report.ProgressReporter
1918
import com.malinskiy.marathon.log.MarathonLogging
20-
import com.malinskiy.marathon.report.allure.AllureReporter
21-
import com.malinskiy.marathon.report.bill.BillingReporter
22-
import com.malinskiy.marathon.report.device.DeviceInfoJsonReporter
23-
import com.malinskiy.marathon.report.html.HtmlSummaryReporter
24-
import com.malinskiy.marathon.report.junit.JUnitReporter
25-
import com.malinskiy.marathon.report.raw.RawJsonReporter
26-
import com.malinskiy.marathon.report.stdout.StdoutReporter
27-
import com.malinskiy.marathon.report.test.TestJsonReporter
28-
import com.malinskiy.marathon.report.timeline.TimelineReporter
29-
import com.malinskiy.marathon.report.timeline.TimelineSummaryProvider
30-
import com.malinskiy.marathon.time.Timer
31-
import com.malinskiy.marathon.usageanalytics.tracker.UsageTracker
32-
import java.io.File
3319

3420
internal class TrackerFactory(
3521
private val configuration: Configuration,
36-
private val fileManager: FileManager,
37-
private val gson: Gson,
38-
private val timer: Timer,
3922
private val track: Track,
40-
private val usageTracker: UsageTracker,
23+
private val progressReporter: ProgressReporter,
4124
) {
4225

4326
val log = MarathonLogging.logger("TrackerFactory")
@@ -88,18 +71,6 @@ internal class TrackerFactory(
8871
}
8972

9073
private fun createExecutionReportGenerator(): ExecutionReportGenerator {
91-
return ExecutionReportGenerator(
92-
listOf(
93-
DeviceInfoJsonReporter(fileManager, gson),
94-
BillingReporter(fileManager, gson, usageTracker),
95-
JUnitReporter(configuration.outputDir),
96-
TimelineReporter(TimelineSummaryProvider(), gson, configuration.outputDir),
97-
RawJsonReporter(fileManager, gson),
98-
TestJsonReporter(fileManager, gson),
99-
AllureReporter(configuration, File(configuration.outputDir, "allure-results")),
100-
HtmlSummaryReporter(gson, fileManager, configuration.outputDir, configuration),
101-
StdoutReporter(timer)
102-
)
103-
)
74+
return ExecutionReportGenerator(progressReporter)
10475
}
10576
}

0 commit comments

Comments
 (0)