Skip to content

Commit

Permalink
Add sample teamcity configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
Vacxe committed Apr 5, 2022
1 parent 3658eec commit b6ad034
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.malinskiy.marathon.config

import com.fasterxml.jackson.annotation.JsonSubTypes
import com.fasterxml.jackson.annotation.JsonTypeInfo

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type"
)
@JsonSubTypes(
JsonSubTypes.Type(value = BuildManagementConfiguration.TeamCityConfiguration::class, name = "teamcity"),
)
sealed class BuildManagementConfiguration {
object TeamCityConfiguration : BuildManagementConfiguration()
object NoBuildManagementConfiguration: BuildManagementConfiguration()
}

Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ data class Configuration private constructor(

val analyticsTracking: Boolean,
val deviceInitializationTimeoutMillis: Long,

val buildManagementConfiguration: BuildManagementConfiguration,
) {
fun toMap() =
mapOf<String, String>(
Expand All @@ -73,7 +75,8 @@ data class Configuration private constructor(
"debug" to debug.toString(),
"screenRecordingPolicy" to screenRecordingPolicy.toString(),
"vendorConfiguration" to vendorConfiguration.toString(),
"deviceInitializationTimeoutMillis" to deviceInitializationTimeoutMillis.toString()
"deviceInitializationTimeoutMillis" to deviceInitializationTimeoutMillis.toString(),
"buildManagementConfiguration" to buildManagementConfiguration.toString()
)

override fun equals(other: Any?): Boolean {
Expand Down Expand Up @@ -108,6 +111,7 @@ data class Configuration private constructor(
if (vendorConfiguration != other.vendorConfiguration) return false
if (analyticsTracking != other.analyticsTracking) return false
if (deviceInitializationTimeoutMillis != other.deviceInitializationTimeoutMillis) return false
if (buildManagementConfiguration != other.buildManagementConfiguration) return false

return true
}
Expand Down Expand Up @@ -138,6 +142,7 @@ data class Configuration private constructor(
result = 31 * result + vendorConfiguration.hashCode()
result = 31 * result + analyticsTracking.hashCode()
result = 31 * result + deviceInitializationTimeoutMillis.hashCode()
result = 31 * result + buildManagementConfiguration.hashCode()
return result
}

Expand All @@ -155,6 +160,7 @@ data class Configuration private constructor(
var flakinessStrategy: FlakinessStrategyConfiguration = FlakinessStrategyConfiguration.IgnoreFlakinessStrategyConfiguration
var retryStrategy: RetryStrategyConfiguration = RetryStrategyConfiguration.NoRetryStrategyConfiguration
var filteringConfiguration: FilteringConfiguration = FilteringConfiguration(emptyList(), emptyList())
var buildManagementConfiguration = BuildManagementConfiguration.NoBuildManagementConfiguration

var ignoreFailures: Boolean = false
var isCodeCoverageEnabled: Boolean = false
Expand Down Expand Up @@ -201,7 +207,8 @@ data class Configuration private constructor(
screenRecordingPolicy = screenRecordingPolicy,
vendorConfiguration = vendorConfiguration,
analyticsTracking = analyticsTracking,
deviceInitializationTimeoutMillis = deviceInitializationTimeoutMillis
deviceInitializationTimeoutMillis = deviceInitializationTimeoutMillis,
buildManagementConfiguration = buildManagementConfiguration
)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.malinskiy.marathon.execution.progress

import com.malinskiy.marathon.config.BuildManagementConfiguration
import com.malinskiy.marathon.config.Configuration
import com.malinskiy.marathon.device.DeviceInfo
import com.malinskiy.marathon.device.DevicePoolId
import com.malinskiy.marathon.execution.progress.tracker.PoolProgressTracker
import com.malinskiy.marathon.integration.buildmanagement.Teamcity
import com.malinskiy.marathon.test.Test
import com.malinskiy.marathon.test.toTestName
import java.util.concurrent.ConcurrentHashMap
Expand All @@ -13,6 +15,10 @@ const val HUNDRED_PERCENT_IN_FLOAT: Float = 100.0f

class ProgressReporter(private val configuration: Configuration) {
private val reporters = ConcurrentHashMap<DevicePoolId, PoolProgressTracker>()
private val buildManagement = when(configuration.buildManagementConfiguration) {
BuildManagementConfiguration.NoBuildManagementConfiguration -> Teamcity
BuildManagementConfiguration.TeamCityConfiguration -> null
}

private inline fun <T> execute(poolId: DevicePoolId, f: (PoolProgressTracker) -> T): T {
val reporter = reporters[poolId] ?: PoolProgressTracker(configuration)
Expand All @@ -29,22 +35,30 @@ class ProgressReporter(private val configuration: Configuration) {

fun testStarted(poolId: DevicePoolId, device: DeviceInfo, test: Test) {
execute(poolId) { it.testStarted(test) }
println("${toPercent(progress(poolId))} | [${poolId.name}]-[${device.serialNumber}] ${test.toTestName()} started")
val message = "${toPercent(progress(poolId))} | [${poolId.name}]-[${device.serialNumber}] ${test.toTestName()} started"
println(message)
buildManagement?.setBuildMessage(message)
}

fun testFailed(poolId: DevicePoolId, device: DeviceInfo, test: Test) {
execute(poolId) { it.testFailed(test) }
println("${toPercent(progress(poolId))} | [${poolId.name}]-[${device.serialNumber}] ${test.toTestName()} failed")
val message = "${toPercent(progress(poolId))} | [${poolId.name}]-[${device.serialNumber}] ${test.toTestName()} failed"
println(message)
buildManagement?.setBuildMessage(message)
}

fun testPassed(poolId: DevicePoolId, device: DeviceInfo, test: Test) {
execute(poolId) { it.testPassed(test) }
println("${toPercent(progress(poolId))} | [${poolId.name}]-[${device.serialNumber}] ${test.toTestName()} ended")
val message = "${toPercent(progress(poolId))} | [${poolId.name}]-[${device.serialNumber}] ${test.toTestName()} ended"
println(message)
buildManagement?.setBuildMessage(message)
}

fun testIgnored(poolId: DevicePoolId, device: DeviceInfo, test: Test) {
execute(poolId) { it.testIgnored(test) }
println("${toPercent(progress(poolId))} | [${poolId.name}]-[${device.serialNumber}] ${test.toTestName()} ignored")
val message = "${toPercent(progress(poolId))} | [${poolId.name}]-[${device.serialNumber}] ${test.toTestName()} ignored"
println(message)
buildManagement?.setBuildMessage(message)
}

fun aggregateResult(): Boolean {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.malinskiy.marathon.integration.buildmanagement

interface BuildManagement {
fun setBuildMessage(message: String)
fun setKeyValue(key: String, value: String)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.malinskiy.marathon.integration.buildmanagement

object Teamcity : BuildManagement {
override fun setBuildMessage(message: String) = println("##teamcity[buildStatus text='$message']")
override fun setKeyValue(key: String, value: String) = println("##teamcity[buildStatisticValue key='$key' value='$value']")
}

0 comments on commit b6ad034

Please sign in to comment.