diff --git a/test_runner/docs/ascii/flank.jar_-android-run.adoc b/test_runner/docs/ascii/flank.jar_-android-run.adoc index 68a45db70c..2c132ce02b 100644 --- a/test_runner/docs/ascii/flank.jar_-android-run.adoc +++ b/test_runner/docs/ascii/flank.jar_-android-run.adoc @@ -13,12 +13,13 @@ flank.jar *flank.jar android run* [*-h*] [*--async*] [*--auto-google-login*] - [*--disable-sharding*] [*--dry*] [*--dump-shards*] - [*--full-junit-result*] [*--ignore-failed-tests*] - [*--keep-file-path*] [*--legacy-junit-result*] - [*--no-auto-google-login*] [*--no-performance-metrics*] - [*--no-record-video*] [*--no-use-orchestrator*] - [*--obfuscate*] [*--performance-metrics*] [*--record-video*] + [*--disable-results-upload*] [*--disable-sharding*] [*--dry*] + [*--dump-shards*] [*--full-junit-result*] + [*--ignore-failed-tests*] [*--keep-file-path*] + [*--legacy-junit-result*] [*--no-auto-google-login*] + [*--no-performance-metrics*] [*--no-record-video*] + [*--no-use-orchestrator*] [*--obfuscate*] + [*--performance-metrics*] [*--record-video*] [*--smart-flank-disable-upload*] [*--use-orchestrator*] [*--app*=__] [*-c*=__] [*--local-result-dir*=__] @@ -159,12 +160,12 @@ Configuration is read from flank.yml *--output-style*=__:: Output style of execution status. May be one of [verbose, multi, single]. For runs with only one test execution the default value is 'verbose', in other cases 'multi' is used as the default. The output style 'multi' is not displayed correctly on consoles which don't support ansi codes, to avoid corrupted output use `single` or `verbose`. -*--app*=__:: - The path to the application binary file. The path may be in the local filesystem or in Google Cloud Storage using gs:// notation. - *--disable-results-upload*:: Disables flank results upload on gcloud storage. +*--app*=__:: + The path to the application binary file. The path may be in the local filesystem or in Google Cloud Storage using gs:// notation. + *--test*=__:: The path to the binary file containing instrumentation tests. The given path may be in the local filesystem or in Google Cloud Storage using a URL beginning with gs://. @@ -177,9 +178,6 @@ Configuration is read from flank.yml *--no-auto-google-login*:: Google account not logged in (default behavior). Use --auto-google-login to enable -*--app*=__:: - The path to the application binary file. The path may be in the local filesystem or in Google Cloud Storage using gs:// notation. - *--use-orchestrator*:: Whether each test runs in its own Instrumentation instance with the Android Test Orchestrator (default: Orchestrator is used. To disable, use --no-use-orchestrator). Orchestrator is only compatible with AndroidJUnitRunner v1.0 or higher. See https://developer.android.com/training/testing/junit-runner.html#using-android-test-orchestrator for more information about Android Test Orchestrator. diff --git a/test_runner/docs/ascii/flank.jar_-firebase-test-android-run.adoc b/test_runner/docs/ascii/flank.jar_-firebase-test-android-run.adoc index 0ed0bf9913..b14b54c548 100644 --- a/test_runner/docs/ascii/flank.jar_-firebase-test-android-run.adoc +++ b/test_runner/docs/ascii/flank.jar_-firebase-test-android-run.adoc @@ -172,6 +172,9 @@ Configuration is read from flank.yml *--output-style*=__:: Output style of execution status. May be one of [verbose, multi, single]. For runs with only one test execution the default value is 'verbose', in other cases 'multi' is used as the default. The output style 'multi' is not displayed correctly on consoles which don't support ansi codes, to avoid corrupted output use `single` or `verbose`. +*--disable-results-upload*:: + Disables flank results upload on gcloud storage. + *--app*=__:: The path to the application binary file. The path may be in the local filesystem or in Google Cloud Storage using gs:// notation. @@ -187,9 +190,6 @@ Configuration is read from flank.yml *--no-auto-google-login*:: Google account not logged in (default behavior). Use --auto-google-login to enable -*--app*=__:: - The path to the application binary file. The path may be in the local filesystem or in Google Cloud Storage using gs:// notation. - *--use-orchestrator*:: Whether each test runs in its own Instrumentation instance with the Android Test Orchestrator (default: Orchestrator is used. To disable, use --no-use-orchestrator). Orchestrator is only compatible with AndroidJUnitRunner v1.0 or higher. See https://developer.android.com/training/testing/junit-runner.html#using-android-test-orchestrator for more information about Android Test Orchestrator. diff --git a/test_runner/docs/ascii/flank.jar_-firebase-test-ios-run.adoc b/test_runner/docs/ascii/flank.jar_-firebase-test-ios-run.adoc index 1d81707c47..1994bc0bca 100644 --- a/test_runner/docs/ascii/flank.jar_-firebase-test-ios-run.adoc +++ b/test_runner/docs/ascii/flank.jar_-firebase-test-ios-run.adoc @@ -12,11 +12,11 @@ flank.jar == Synopsis *flank.jar - firebase test ios run* [*-h*] [*--async*] [*--disable-sharding*] [*--dry*] - [*--dump-shards*] [*--full-junit-result*] - [*--ignore-failed-tests*] [*--keep-file-path*] - [*--no-record-video*] [*--obfuscate*] - [*--record-video*] + firebase test ios run* [*-h*] [*--async*] [*--disable-results-upload*] + [*--disable-sharding*] [*--dry*] [*--dump-shards*] + [*--full-junit-result*] [*--ignore-failed-tests*] + [*--keep-file-path*] [*--no-record-video*] + [*--obfuscate*] [*--record-video*] [*--smart-flank-disable-upload*] [*-c*=__] [*--local-result-dir*=__] @@ -151,6 +151,9 @@ Configuration is read from flank.yml *--output-style*=__:: Output style of execution status. May be one of [verbose, multi, single]. For runs with only one test execution the default value is 'verbose', in other cases 'multi' is used as the default. The output style 'multi' is not displayed correctly on consoles which don't support ansi codes, to avoid corrupted output use `single` or `verbose`. +*--disable-results-upload*:: + Disables flank results upload on gcloud storage. + *--test*=__:: The path to the test package (a zip file containing the iOS app and XCTest files). The given path may be in the local filesystem or in Google Cloud Storage using a URL beginning with gs://. Note: any .xctestrun file in this zip file will be ignored if --xctestrun-file is specified. diff --git a/test_runner/docs/ascii/flank.jar_-ios-run.adoc b/test_runner/docs/ascii/flank.jar_-ios-run.adoc index 675025df34..3ed26efc1e 100644 --- a/test_runner/docs/ascii/flank.jar_-ios-run.adoc +++ b/test_runner/docs/ascii/flank.jar_-ios-run.adoc @@ -12,7 +12,8 @@ flank.jar == Synopsis *flank.jar - ios run* [*-h*] [*--async*] [*--disable-sharding*] [*--dry*] [*--dump-shards*] + ios run* [*-h*] [*--async*] [*--disable-results-upload*] + [*--disable-sharding*] [*--dry*] [*--dump-shards*] [*--full-junit-result*] [*--ignore-failed-tests*] [*--keep-file-path*] [*--no-record-video*] [*--obfuscate*] [*--record-video*] [*--smart-flank-disable-upload*] @@ -142,6 +143,9 @@ Configuration is read from flank.yml *--output-style*=__:: Output style of execution status. May be one of [verbose, multi, single]. For runs with only one test execution the default value is 'verbose', in other cases 'multi' is used as the default. The output style 'multi' is not displayed correctly on consoles which don't support ansi codes, to avoid corrupted output use `single` or `verbose`. +*--disable-results-upload*:: + Disables flank results upload on gcloud storage. + *--test*=__:: The path to the test package (a zip file containing the iOS app and XCTest files). The given path may be in the local filesystem or in Google Cloud Storage using a URL beginning with gs://. Note: any .xctestrun file in this zip file will be ignored if --xctestrun-file is specified. diff --git a/test_runner/src/main/kotlin/ftl/json/SavedMatrix.kt b/test_runner/src/main/kotlin/ftl/json/SavedMatrix.kt index e86b1b089c..13ff97b747 100644 --- a/test_runner/src/main/kotlin/ftl/json/SavedMatrix.kt +++ b/test_runner/src/main/kotlin/ftl/json/SavedMatrix.kt @@ -5,7 +5,6 @@ import com.google.api.services.testing.model.TestMatrix import com.google.api.services.toolresults.model.Outcome import ftl.android.AndroidCatalog import ftl.gc.GcToolResults -import ftl.util.Billing import ftl.util.MatrixState.FINISHED import ftl.util.StepOutcome.failure import ftl.util.StepOutcome.flaky @@ -13,11 +12,12 @@ import ftl.util.StepOutcome.inconclusive import ftl.util.StepOutcome.skipped import ftl.util.StepOutcome.success import ftl.util.StepOutcome.unset +import ftl.util.billableMinutes import ftl.util.timeoutToSeconds import ftl.util.webLink // execution gcs paths aren't API accessible. -class SavedMatrix(matrix: TestMatrix, testTimeout: String = "0s") { +class SavedMatrix(matrix: TestMatrix, testTimeout: String) { private val testTimeoutSeconds = timeoutToSeconds(testTimeout) val matrixId: String = matrix.testMatrixId var state: String = matrix.state @@ -92,7 +92,7 @@ class SavedMatrix(matrix: TestMatrix, testTimeout: String = "0s") { val stepResult = GcToolResults.getStepResult(it.toolResultsStep) val testTimeSeconds = stepResult.testExecutionStep?.testTiming?.testProcessDuration?.seconds ?: return - val billableMinutes = Billing.billableMinutes(testTimeSeconds, testTimeoutSeconds) + val billableMinutes = billableMinutes(testTimeSeconds, testTimeoutSeconds) if (AndroidCatalog.isVirtualDevice(it.environment?.androidDevice, matrix.projectId ?: "")) { billableVirtualMinutes += billableMinutes diff --git a/test_runner/src/main/kotlin/ftl/reports/CostReport.kt b/test_runner/src/main/kotlin/ftl/reports/CostReport.kt index 3e2b5e8d43..c4540bb58a 100644 --- a/test_runner/src/main/kotlin/ftl/reports/CostReport.kt +++ b/test_runner/src/main/kotlin/ftl/reports/CostReport.kt @@ -6,7 +6,7 @@ import ftl.gc.GcStorage import ftl.json.MatrixMap import ftl.reports.util.IReport import ftl.reports.xml.model.JUnitTestResult -import ftl.util.Billing +import ftl.util.estimateCosts import ftl.util.println import java.io.StringWriter @@ -24,7 +24,7 @@ object CostReport : IReport { totalBillablePhysicalMinutes += it.billablePhysicalSecondsMinutes } - return Billing.estimateCosts(totalBillableVirtualMinutes, totalBillablePhysicalMinutes) + return estimateCosts(totalBillableVirtualMinutes, totalBillablePhysicalMinutes) } private fun generate(matrices: MatrixMap): String { diff --git a/test_runner/src/main/kotlin/ftl/util/Billing.kt b/test_runner/src/main/kotlin/ftl/util/Billing.kt index eb06c1f976..af5bdebf20 100644 --- a/test_runner/src/main/kotlin/ftl/util/Billing.kt +++ b/test_runner/src/main/kotlin/ftl/util/Billing.kt @@ -3,91 +3,79 @@ package ftl.util import java.math.BigDecimal import java.math.RoundingMode import java.util.concurrent.TimeUnit +import kotlin.math.min -object Billing { +private val physicalCostPerMinute = divBy60(5) // $5/hr +private val virtualCostPerMinute = divBy60(1) // $1/hr - private fun divBy60(value: Long): BigDecimal { - return BigDecimal(value).divide(BigDecimal(60), 10, RoundingMode.HALF_UP) - } - - private fun divBy60(value: BigDecimal): BigDecimal { - return value.divide(BigDecimal(60), 10, RoundingMode.HALF_UP) - } - - private var PHYSICAL_COST_PER_MINUTE = divBy60(5) // $5/hr - private var VIRTUAL_COST_PER_MINUTE = divBy60(1) // $1/hr +private fun divBy60(value: Long) = BigDecimal(value).divide(BigDecimal(60), 10, RoundingMode.HALF_UP) - fun billableMinutes(testDurationSeconds: Long, testTimeoutSeconds: Long): Long = - if (testTimeoutSeconds in 1 until testDurationSeconds) billableMinutes(BigDecimal(testTimeoutSeconds)) - else billableMinutes(BigDecimal(testDurationSeconds)) +private fun divBy60(value: BigDecimal) = value.divide(BigDecimal(60), 10, RoundingMode.HALF_UP) - private fun billableMinutes(testDurationSeconds: BigDecimal): Long { - val billableMinutes = divBy60(checkForZero(testDurationSeconds)) - // round decimals up. 0.01 minutes is billable at 1 minute. - return billableMinutes.setScale(0, RoundingMode.UP).longValueExact() - } +fun billableMinutes(testDurationSeconds: Long, testTimeoutSeconds: Long): Long = + billableMinutes(min(testDurationSeconds, testTimeoutSeconds)) - private fun checkForZero(testDurationSeconds: BigDecimal): BigDecimal { - // 0s duration => 1s - if (testDurationSeconds.compareTo(BigDecimal(0)) == 0) { - return BigDecimal(1) - } +// round decimals up. 0.01 minutes is billable at 1 minute. +private fun billableMinutes(testDurationSeconds: Long) = divBy60(checkForZero(BigDecimal(testDurationSeconds))) + .setScale(0, RoundingMode.UP) + .longValueExact() - return testDurationSeconds - } +// 0s duration => 1s +private fun checkForZero(testDurationSeconds: BigDecimal) = + if (testDurationSeconds == BigDecimal.ZERO) BigDecimal.ONE + else testDurationSeconds - fun estimateCosts(billableVirtualMinutes: Long, billablePhysicalMinutes: Long): String { - return estimateCosts(BigDecimal(billableVirtualMinutes), BigDecimal(billablePhysicalMinutes)) - } +fun estimateCosts(billableVirtualMinutes: Long, billablePhysicalMinutes: Long): String { + return estimateCosts(BigDecimal(billableVirtualMinutes), BigDecimal(billablePhysicalMinutes)) +} - private fun estimateCosts(billableVirtualMinutes: BigDecimal, billablePhysicalMinutes: BigDecimal): String { - val virtualCost = billableVirtualMinutes.multiply(VIRTUAL_COST_PER_MINUTE).setScale(2, RoundingMode.HALF_UP) - val physicalCost = billablePhysicalMinutes.multiply(PHYSICAL_COST_PER_MINUTE).setScale(2, RoundingMode.HALF_UP) - val totalCost = (virtualCost + physicalCost).setScale(2, RoundingMode.HALF_UP) +private fun estimateCosts(billableVirtualMinutes: BigDecimal, billablePhysicalMinutes: BigDecimal): String { + val virtualCost = billableVirtualMinutes.multiply(virtualCostPerMinute).setScale(2, RoundingMode.HALF_UP) + val physicalCost = billablePhysicalMinutes.multiply(physicalCostPerMinute).setScale(2, RoundingMode.HALF_UP) + val totalCost = (virtualCost + physicalCost).setScale(2, RoundingMode.HALF_UP) - val billableVirtualTime = prettyTime(billableVirtualMinutes) - val billablePhysicalTime = prettyTime(billablePhysicalMinutes) - val totalTime = prettyTime(billableVirtualMinutes + billablePhysicalMinutes) + val billableVirtualTime = prettyTime(billableVirtualMinutes) + val billablePhysicalTime = prettyTime(billablePhysicalMinutes) + val totalTime = prettyTime(billableVirtualMinutes + billablePhysicalMinutes) - val displayPhysical = billablePhysicalMinutes.signum() == 1 - val displayVirtual = billableVirtualMinutes.signum() == 1 // 1 = positive number > 0 - val displayTotal = displayPhysical && displayVirtual - var result = "" + val displayPhysical = billablePhysicalMinutes.signum() == 1 + val displayVirtual = billableVirtualMinutes.signum() == 1 // 1 = positive number > 0 + val displayTotal = displayPhysical && displayVirtual + var result = "" - if (!displayPhysical && !displayVirtual) { - result = "No cost. 0m" - } + if (!displayPhysical && !displayVirtual) { + result = "No cost. 0m" + } - if (displayPhysical) { - result += """ + if (displayPhysical) { + result += """ Physical devices $$physicalCost for $billablePhysicalTime """ - } + } - if (displayVirtual) { - result += """ + if (displayVirtual) { + result += """ Virtual devices $$virtualCost for $billableVirtualTime """ - } + } - if (displayTotal) { - result += """ + if (displayTotal) { + result += """ Total $$totalCost for $totalTime """ - } - - return result.trim() } - private fun prettyTime(billableMinutes: BigDecimal): String { - val remainder = billableMinutes.toLong() - val hours = TimeUnit.MINUTES.toHours(remainder) - val minutes = remainder % 60 + return result.trim() +} - return if (hours > 0) "${hours}h ${minutes}m" - else "${minutes}m" - } +private fun prettyTime(billableMinutes: BigDecimal): String { + val remainder = billableMinutes.toLong() + val hours = TimeUnit.MINUTES.toHours(remainder) + val minutes = remainder % 60 + + return if (hours > 0) "${hours}h ${minutes}m" + else "${minutes}m" } diff --git a/test_runner/src/test/kotlin/ftl/json/MatrixMapTest.kt b/test_runner/src/test/kotlin/ftl/json/MatrixMapTest.kt index b41833d5e8..8cbd6046c1 100644 --- a/test_runner/src/test/kotlin/ftl/json/MatrixMapTest.kt +++ b/test_runner/src/test/kotlin/ftl/json/MatrixMapTest.kt @@ -5,6 +5,7 @@ import com.google.common.truth.Truth.assertThat import ftl.json.SavedMatrixTest.Companion.createResultsStorage import ftl.json.SavedMatrixTest.Companion.createStepExecution import ftl.test.util.FlankTestRunner +import ftl.test.util.defaultTestTimeout import ftl.util.MatrixState import org.junit.Test import org.junit.runner.RunWith @@ -25,7 +26,7 @@ class MatrixMapTest { private fun matrixForExecution(executionId: Int): SavedMatrix { return SavedMatrix( - TestMatrix() + matrix = TestMatrix() .setResultStorage(createResultsStorage()) .setState(MatrixState.FINISHED) .setTestMatrixId("123") @@ -33,7 +34,8 @@ class MatrixMapTest { listOf( createStepExecution(executionId, "") ) - ) + ), + testTimeout = defaultTestTimeout ) } diff --git a/test_runner/src/test/kotlin/ftl/json/SavedMatrixTest.kt b/test_runner/src/test/kotlin/ftl/json/SavedMatrixTest.kt index 408adacce8..a15f392eb8 100644 --- a/test_runner/src/test/kotlin/ftl/json/SavedMatrixTest.kt +++ b/test_runner/src/test/kotlin/ftl/json/SavedMatrixTest.kt @@ -10,6 +10,7 @@ import com.google.common.truth.Truth.assertThat import ftl.config.Device import ftl.gc.GcAndroidDevice import ftl.test.util.FlankTestRunner +import ftl.test.util.defaultTestTimeout import ftl.util.MatrixState.FINISHED import ftl.util.MatrixState.PENDING import ftl.util.webLink @@ -68,7 +69,7 @@ class SavedMatrixTest { testMatrix.resultStorage = createResultsStorage() testMatrix.testExecutions = testExecutions - val savedMatrix = SavedMatrix(testMatrix) + val savedMatrix = SavedMatrix(testMatrix, defaultTestTimeout) assertThat(savedMatrix.outcome).isEqualTo("failure") // assert other properties @@ -100,7 +101,7 @@ class SavedMatrixTest { testMatrix.resultStorage = createResultsStorage() testMatrix.testExecutions = testExecutions - val savedMatrix = SavedMatrix(testMatrix) + val savedMatrix = SavedMatrix(testMatrix, defaultTestTimeout) assertThat(savedMatrix.outcome).isEqualTo("skipped") // assert other properties @@ -130,7 +131,7 @@ class SavedMatrixTest { testMatrix.resultStorage = createResultsStorage() testMatrix.testExecutions = testExecutions - val savedMatrix = SavedMatrix(testMatrix) + val savedMatrix = SavedMatrix(testMatrix, defaultTestTimeout) savedMatrix.update(testMatrix) testMatrix.state = FINISHED testMatrix.webLink() diff --git a/test_runner/src/test/kotlin/ftl/test/util/Constants.kt b/test_runner/src/test/kotlin/ftl/test/util/Constants.kt index 8364627d5f..0ba88ff666 100644 --- a/test_runner/src/test/kotlin/ftl/test/util/Constants.kt +++ b/test_runner/src/test/kotlin/ftl/test/util/Constants.kt @@ -1,6 +1,8 @@ package ftl.test.util +import ftl.args.AndroidArgs import ftl.test.util.TestHelper.getPath -val mixedConfigYaml = getPath("src/test/kotlin/ftl/fixtures/test_app_cases/flank-multiple-mixed.yml") -val ios2ConfigYaml = getPath("src/test/kotlin/ftl/fixtures/flank2.ios.yml") +internal val mixedConfigYaml = getPath("src/test/kotlin/ftl/fixtures/test_app_cases/flank-multiple-mixed.yml") +internal val ios2ConfigYaml = getPath("src/test/kotlin/ftl/fixtures/flank2.ios.yml") +internal val defaultTestTimeout = AndroidArgs.default().testTimeout diff --git a/test_runner/src/test/kotlin/ftl/util/BillingTest.kt b/test_runner/src/test/kotlin/ftl/util/BillingTest.kt index 010a772ea8..b58356d929 100644 --- a/test_runner/src/test/kotlin/ftl/util/BillingTest.kt +++ b/test_runner/src/test/kotlin/ftl/util/BillingTest.kt @@ -1,30 +1,33 @@ package ftl.util import com.google.common.truth.Truth.assertThat +import ftl.test.util.defaultTestTimeout import org.junit.Test +private val timeoutSeconds = timeoutToSeconds(defaultTestTimeout) + class BillingTest { @Test fun billableMinutes() { - assertThat(Billing.billableMinutes(0L, 0)).isEqualTo(1L) - assertThat(Billing.billableMinutes(60L, 0)).isEqualTo(1L) - assertThat(Billing.billableMinutes(61L, 0)).isEqualTo(2L) - assertThat(Billing.billableMinutes(3_555L, 0)).isEqualTo(60L) + assertThat(billableMinutes(0L, timeoutSeconds)).isEqualTo(1L) + assertThat(billableMinutes(60L, timeoutSeconds)).isEqualTo(1L) + assertThat(billableMinutes(61L, timeoutSeconds)).isEqualTo(2L) + assertThat(billableMinutes(3_555L, timeoutSeconds)).isEqualTo(15L) } @Test - fun `when timeout lower then duration billable minutes should fit to timeout minute`() { - assertThat(Billing.billableMinutes(120L, 40)).isEqualTo(1L) - assertThat(Billing.billableMinutes(60L, 30)).isEqualTo(1L) - assertThat(Billing.billableMinutes(61L, 20)).isEqualTo(1L) - assertThat(Billing.billableMinutes(3_555L, 120)).isEqualTo(2L) + fun `when timeout lower then test execution time, billable minutes should fit to timeout minute`() { + assertThat(billableMinutes(120L, 40)).isEqualTo(1L) + assertThat(billableMinutes(60L, 30)).isEqualTo(1L) + assertThat(billableMinutes(61L, 20)).isEqualTo(1L) + assertThat(billableMinutes(3_555L, 120)).isEqualTo(2L) } @Test - fun `when timeout higher then duration billable minutes should fit to duration minute`() { - assertThat(Billing.billableMinutes(60L, 120L)).isEqualTo(1L) - assertThat(Billing.billableMinutes(360, 1000L)).isEqualTo(6L) + fun `when timeout higher then test execution time, billable minutes should fit to duration minute`() { + assertThat(billableMinutes(60L, 120L)).isEqualTo(1L) + assertThat(billableMinutes(360, 1000L)).isEqualTo(6L) } @Test @@ -38,7 +41,7 @@ Virtual devices Total $17.85 for 9h 39m""".trim() - val actualReport = Billing.estimateCosts(456L, 123L) + val actualReport = estimateCosts(456L, 123L) assertThat(actualReport).isEqualTo(expectedReport) } @@ -48,7 +51,7 @@ Total Physical devices $10.25 for 2h 3m """.trim() - val actualReport = Billing.estimateCosts(0, 123L) + val actualReport = estimateCosts(0, 123L) assertThat(actualReport).isEqualTo(expectedReport) } @@ -58,7 +61,7 @@ Physical devices Virtual devices $7.60 for 7h 36m """.trim() - val actualReport = Billing.estimateCosts(456L, 0) + val actualReport = estimateCosts(456L, 0) assertThat(actualReport).isEqualTo(expectedReport) } @@ -68,7 +71,7 @@ Virtual devices Virtual devices $0.02 for 1m """.trim() - val actualReport = Billing.estimateCosts(1, 0) + val actualReport = estimateCosts(1, 0) assertThat(actualReport).isEqualTo(expectedReport) } @@ -77,7 +80,7 @@ Virtual devices val expectedReport = """ No cost. 0m """.trim() - val actualReport = Billing.estimateCosts(0, 0) + val actualReport = estimateCosts(0, 0) assertThat(actualReport).isEqualTo(expectedReport) } } diff --git a/test_runner/src/test/kotlin/ftl/util/UtilsTest.kt b/test_runner/src/test/kotlin/ftl/util/UtilsTest.kt index 5e2e359766..a955b6d10d 100644 --- a/test_runner/src/test/kotlin/ftl/util/UtilsTest.kt +++ b/test_runner/src/test/kotlin/ftl/util/UtilsTest.kt @@ -9,6 +9,7 @@ import ftl.json.SavedMatrixTest.Companion.createResultsStorage import ftl.json.SavedMatrixTest.Companion.createStepExecution import ftl.run.cancelMatrices import ftl.test.util.FlankTestRunner +import ftl.test.util.defaultTestTimeout import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every @@ -88,7 +89,7 @@ class UtilsTest { testMatrix.state = MatrixState.FINISHED testMatrix.resultStorage = createResultsStorage() testMatrix.testExecutions = testExecutions - val finishedMatrix = SavedMatrix(testMatrix) + val finishedMatrix = SavedMatrix(testMatrix, defaultTestTimeout) MatrixMap(mutableMapOf("finishedMatrix" to finishedMatrix), "MockPath").validateMatrices() } @@ -102,7 +103,7 @@ class UtilsTest { testMatrix.state = MatrixState.FINISHED testMatrix.resultStorage = createResultsStorage() testMatrix.testExecutions = testExecutions - val finishedMatrix = SavedMatrix(testMatrix) + val finishedMatrix = SavedMatrix(testMatrix, defaultTestTimeout) MatrixMap(mutableMapOf("" to finishedMatrix), "MockPath").validateMatrices() } @@ -116,7 +117,7 @@ class UtilsTest { testMatrix.state = MatrixState.FINISHED testMatrix.resultStorage = createResultsStorage() testMatrix.testExecutions = testExecutions - val finishedMatrix = SavedMatrix(testMatrix) + val finishedMatrix = SavedMatrix(testMatrix, defaultTestTimeout) MatrixMap(mutableMapOf("" to finishedMatrix), "MockPath").validateMatrices() } @@ -131,7 +132,7 @@ class UtilsTest { testMatrix.state = MatrixState.ERROR testMatrix.resultStorage = createResultsStorage() testMatrix.testExecutions = testExecutions - val errorMatrix = SavedMatrix(testMatrix) + val errorMatrix = SavedMatrix(testMatrix, defaultTestTimeout) MatrixMap(mutableMapOf("errorMatrix" to errorMatrix), "MockPath").validateMatrices() } @@ -147,7 +148,7 @@ class UtilsTest { testMatrix.state = MatrixState.FINISHED testMatrix.resultStorage = createResultsStorage() testMatrix.testExecutions = testExecutions - val finishedMatrix = SavedMatrix(testMatrix) + val finishedMatrix = SavedMatrix(testMatrix, defaultTestTimeout) try { MatrixMap(mutableMapOf("" to finishedMatrix), "MockPath").validateMatrices(shouldIgnore) } catch (t: FailedMatrix) {