From 1c0f36600ab46d6fa943c4348c44d58bea109bc3 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 16 Feb 2021 17:56:00 +0100 Subject: [PATCH 1/6] Fixed dumpShards npe and added integration tests --- .../kotlin/integration/AllTestFilteredIT.kt | 2 + .../test/kotlin/integration/DumpShardsIT.kt | 51 +++++++++++++++++++ .../resources/cases/dump_shards_android.yml | 3 ++ .../test/resources/cases/dump_shards_ios.yml | 4 ++ .../compare/DumpShardsIT-android-compare | 1 + .../compare/DumpShardsIT-ios-compare | 1 + .../test/android/AndroidRunCommand.kt | 12 +++-- .../cli/firebase/test/ios/IosRunCommand.kt | 6 ++- .../ios/xctest/common/FindTestsForTarget.kt | 3 +- .../src/main/kotlin/ftl/run/DumpShards.kt | 5 +- 10 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 integration_tests/src/test/kotlin/integration/DumpShardsIT.kt create mode 100644 integration_tests/src/test/resources/cases/dump_shards_android.yml create mode 100644 integration_tests/src/test/resources/cases/dump_shards_ios.yml create mode 100644 integration_tests/src/test/resources/compare/DumpShardsIT-android-compare create mode 100644 integration_tests/src/test/resources/compare/DumpShardsIT-ios-compare diff --git a/integration_tests/src/test/kotlin/integration/AllTestFilteredIT.kt b/integration_tests/src/test/kotlin/integration/AllTestFilteredIT.kt index c977bbf9ab..6a2a197224 100644 --- a/integration_tests/src/test/kotlin/integration/AllTestFilteredIT.kt +++ b/integration_tests/src/test/kotlin/integration/AllTestFilteredIT.kt @@ -6,6 +6,7 @@ import flank.common.isWindows import org.junit.Assume.assumeFalse import org.junit.Test import run +import java.io.File class AllTestFilteredIT { private val name = this::class.java.simpleName @@ -45,6 +46,7 @@ class AllTestFilteredIT { assertExitCode(result, 1) val resOutput = result.output.removeUnicode() + File("test.log").writeText(resOutput) assertThat(resOutput).containsMatch(findInCompare(name)) assertNoOutcomeSummary(resOutput) } diff --git a/integration_tests/src/test/kotlin/integration/DumpShardsIT.kt b/integration_tests/src/test/kotlin/integration/DumpShardsIT.kt new file mode 100644 index 0000000000..524c075ea3 --- /dev/null +++ b/integration_tests/src/test/kotlin/integration/DumpShardsIT.kt @@ -0,0 +1,51 @@ +package integration + +import FlankCommand +import com.google.common.truth.Truth +import flank.common.isWindows +import org.junit.Assume +import org.junit.Test +import run + +class DumpShardsIT { + private val name = this::class.java.simpleName + + @Test + fun `dump shards - android`() { + val name = "$name-android" + val result = FlankCommand( + flankPath = FLANK_JAR_PATH, + ymlPath = "$CONFIGS_PATH/dump_shards_android.yml", + params = androidRunCommands + "--dump-shards" + ).run( + workingDirectory = "./", + testSuite = name + ) + + assertExitCode(result, 0) + + val resOutput = result.output.removeUnicode() + Truth.assertThat(resOutput).containsMatch(findInCompare(name)) + assertNoOutcomeSummary(resOutput) + } + + @Test + fun `dump shards - ios`() { + Assume.assumeFalse(isWindows) + val name = "$name-ios" + val result = FlankCommand( + flankPath = FLANK_JAR_PATH, + ymlPath = "$CONFIGS_PATH/dump_shards_ios.yml", + params = iosRunCommands + "--dump-shards" + ).run( + workingDirectory = "./", + testSuite = name + ) + + assertExitCode(result, 0) + + val resOutput = result.output.removeUnicode() + Truth.assertThat(resOutput).containsMatch(findInCompare(name)) + assertNoOutcomeSummary(resOutput) + } +} diff --git a/integration_tests/src/test/resources/cases/dump_shards_android.yml b/integration_tests/src/test/resources/cases/dump_shards_android.yml new file mode 100644 index 0000000000..5566fafb3f --- /dev/null +++ b/integration_tests/src/test/resources/cases/dump_shards_android.yml @@ -0,0 +1,3 @@ +gcloud: + app: ../test_runner/src/test/kotlin/ftl/fixtures/tmp/apk/app-debug.apk + test: ../test_runner/src/test/kotlin/ftl/fixtures/tmp/apk/app-single-success-debug-androidTest.apk diff --git a/integration_tests/src/test/resources/cases/dump_shards_ios.yml b/integration_tests/src/test/resources/cases/dump_shards_ios.yml new file mode 100644 index 0000000000..1fae4e9312 --- /dev/null +++ b/integration_tests/src/test/resources/cases/dump_shards_ios.yml @@ -0,0 +1,4 @@ +gcloud: + test: ../test_runner/src/test/kotlin/ftl/fixtures/tmp/ios/EarlGreyExample/EarlGreyExample.zip + xctestrun-file: ../test_runner/src/test/kotlin/ftl/fixtures/tmp/ios/EarlGreyExample/EarlGreyExampleSwiftTests.xctestrun + diff --git a/integration_tests/src/test/resources/compare/DumpShardsIT-android-compare b/integration_tests/src/test/resources/compare/DumpShardsIT-android-compare new file mode 100644 index 0000000000..5c59261a77 --- /dev/null +++ b/integration_tests/src/test/resources/compare/DumpShardsIT-android-compare @@ -0,0 +1 @@ + Saved 1 shards to android_shards.json diff --git a/integration_tests/src/test/resources/compare/DumpShardsIT-ios-compare b/integration_tests/src/test/resources/compare/DumpShardsIT-ios-compare new file mode 100644 index 0000000000..1cf4584f8d --- /dev/null +++ b/integration_tests/src/test/resources/compare/DumpShardsIT-ios-compare @@ -0,0 +1 @@ + Saved 1 shards to ios_shards.json diff --git a/test_runner/src/main/kotlin/ftl/cli/firebase/test/android/AndroidRunCommand.kt b/test_runner/src/main/kotlin/ftl/cli/firebase/test/android/AndroidRunCommand.kt index a50402ee70..08965edd8b 100644 --- a/test_runner/src/main/kotlin/ftl/cli/firebase/test/android/AndroidRunCommand.kt +++ b/test_runner/src/main/kotlin/ftl/cli/firebase/test/android/AndroidRunCommand.kt @@ -68,7 +68,7 @@ class AndroidRunCommand : CommonRunCommand(), Runnable { AndroidArgs.load(Paths.get(configPath), cli = this).apply { setupLogLevel() - logLn(this) + outputReport.configure(toOutputReportConfiguration()) outputReport.log(this) setCrashReportTag( @@ -76,10 +76,14 @@ class AndroidRunCommand : CommonRunCommand(), Runnable { TEST_TYPE to type?.name.orEmpty() ) sendConfiguration() - }.validate().run { + }.validate().also { args -> runBlocking { - if (dumpShards) dumpShards() - else newTestRun() + if (dumpShards) + args.dumpShards() + else { + logLn(args) + args.newTestRun() + } } } } diff --git a/test_runner/src/main/kotlin/ftl/cli/firebase/test/ios/IosRunCommand.kt b/test_runner/src/main/kotlin/ftl/cli/firebase/test/ios/IosRunCommand.kt index a223c0eba9..f4115a715b 100644 --- a/test_runner/src/main/kotlin/ftl/cli/firebase/test/ios/IosRunCommand.kt +++ b/test_runner/src/main/kotlin/ftl/cli/firebase/test/ios/IosRunCommand.kt @@ -68,7 +68,6 @@ class IosRunCommand : CommonRunCommand(), Runnable { IosArgs.load(Paths.get(configPath), cli = this).apply { setupLogLevel() - logLn(this) outputReport.configure(toOutputReportConfiguration()) outputReport.log(this) setCrashReportTag( @@ -76,9 +75,12 @@ class IosRunCommand : CommonRunCommand(), Runnable { TEST_TYPE to type?.name.orEmpty() ) sendConfiguration() + if (dumpShards.not()) logLn(this) }.validate().run { if (dumpShards) dumpShards() - else runBlocking { newTestRun() } + else runBlocking { + newTestRun() + } } } diff --git a/test_runner/src/main/kotlin/ftl/ios/xctest/common/FindTestsForTarget.kt b/test_runner/src/main/kotlin/ftl/ios/xctest/common/FindTestsForTarget.kt index cdd0cbcdf6..4d3fa6eb2d 100644 --- a/test_runner/src/main/kotlin/ftl/ios/xctest/common/FindTestsForTarget.kt +++ b/test_runner/src/main/kotlin/ftl/ios/xctest/common/FindTestsForTarget.kt @@ -5,6 +5,7 @@ import com.dd.plist.NSDictionary import com.dd.plist.NSObject import com.dd.plist.NSString import com.google.common.annotations.VisibleForTesting +import flank.common.OutputLogLevel import flank.common.logLn import ftl.run.exception.FlankGeneralError import java.io.File @@ -29,7 +30,7 @@ private fun NSDictionary.findXcTestTargets( private fun NSObject.findBinaryTests(testRoot: String): List { val binaryRoot = toString().replace("__TESTROOT__/", testRoot) - logLn("Found xctest: $binaryRoot") + logLn("Found xctest: $binaryRoot", OutputLogLevel.DETAILED) val binaryName = File(binaryRoot).nameWithoutExtension val binaryPath = Paths.get(binaryRoot, binaryName).toString() diff --git a/test_runner/src/main/kotlin/ftl/run/DumpShards.kt b/test_runner/src/main/kotlin/ftl/run/DumpShards.kt index b1813140cf..bd3aad6e35 100644 --- a/test_runner/src/main/kotlin/ftl/run/DumpShards.kt +++ b/test_runner/src/main/kotlin/ftl/run/DumpShards.kt @@ -71,7 +71,10 @@ fun saveShardChunks( ) logLn("${FtlConstants.indent}Saved $size shards to $shardFilePath", OutputLogLevel.DETAILED) } -private fun String.createDirectories() = File(this).parent.toFile().mkdirs() + +private fun String.createDirectories() = takeIf { it !in listOf(ANDROID_SHARD_FILE, IOS_SHARD_FILE) }?.let { + File(this).parent.toFile().mkdirs() +} private fun getGson(obfuscatedOutput: Boolean) = if (obfuscatedOutput) obfuscatePrettyPrinter else prettyPrint From ad8e122d39d2ba84926defa2155a776bd51ae367 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 16 Feb 2021 18:18:55 +0100 Subject: [PATCH 2/6] Update AllTestFilteredIT.kt --- .../src/test/kotlin/integration/AllTestFilteredIT.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/integration_tests/src/test/kotlin/integration/AllTestFilteredIT.kt b/integration_tests/src/test/kotlin/integration/AllTestFilteredIT.kt index 6a2a197224..c977bbf9ab 100644 --- a/integration_tests/src/test/kotlin/integration/AllTestFilteredIT.kt +++ b/integration_tests/src/test/kotlin/integration/AllTestFilteredIT.kt @@ -6,7 +6,6 @@ import flank.common.isWindows import org.junit.Assume.assumeFalse import org.junit.Test import run -import java.io.File class AllTestFilteredIT { private val name = this::class.java.simpleName @@ -46,7 +45,6 @@ class AllTestFilteredIT { assertExitCode(result, 1) val resOutput = result.output.removeUnicode() - File("test.log").writeText(resOutput) assertThat(resOutput).containsMatch(findInCompare(name)) assertNoOutcomeSummary(resOutput) } From 4c567bc240d80bd672083465dafccf6ad6d6342a Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 16 Feb 2021 18:20:14 +0100 Subject: [PATCH 3/6] Update FindTestsForTarget.kt --- .../main/kotlin/ftl/ios/xctest/common/FindTestsForTarget.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test_runner/src/main/kotlin/ftl/ios/xctest/common/FindTestsForTarget.kt b/test_runner/src/main/kotlin/ftl/ios/xctest/common/FindTestsForTarget.kt index 4d3fa6eb2d..cdd0cbcdf6 100644 --- a/test_runner/src/main/kotlin/ftl/ios/xctest/common/FindTestsForTarget.kt +++ b/test_runner/src/main/kotlin/ftl/ios/xctest/common/FindTestsForTarget.kt @@ -5,7 +5,6 @@ import com.dd.plist.NSDictionary import com.dd.plist.NSObject import com.dd.plist.NSString import com.google.common.annotations.VisibleForTesting -import flank.common.OutputLogLevel import flank.common.logLn import ftl.run.exception.FlankGeneralError import java.io.File @@ -30,7 +29,7 @@ private fun NSDictionary.findXcTestTargets( private fun NSObject.findBinaryTests(testRoot: String): List { val binaryRoot = toString().replace("__TESTROOT__/", testRoot) - logLn("Found xctest: $binaryRoot", OutputLogLevel.DETAILED) + logLn("Found xctest: $binaryRoot") val binaryName = File(binaryRoot).nameWithoutExtension val binaryPath = Paths.get(binaryRoot, binaryName).toString() From 634267bc57cae3435c9117fc204f779ac73210ee Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 16 Feb 2021 18:21:10 +0100 Subject: [PATCH 4/6] Update IosRunCommand.kt --- .../main/kotlin/ftl/cli/firebase/test/ios/IosRunCommand.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test_runner/src/main/kotlin/ftl/cli/firebase/test/ios/IosRunCommand.kt b/test_runner/src/main/kotlin/ftl/cli/firebase/test/ios/IosRunCommand.kt index f4115a715b..85c7c70f93 100644 --- a/test_runner/src/main/kotlin/ftl/cli/firebase/test/ios/IosRunCommand.kt +++ b/test_runner/src/main/kotlin/ftl/cli/firebase/test/ios/IosRunCommand.kt @@ -78,9 +78,7 @@ class IosRunCommand : CommonRunCommand(), Runnable { if (dumpShards.not()) logLn(this) }.validate().run { if (dumpShards) dumpShards() - else runBlocking { - newTestRun() - } + else runBlocking { newTestRun() } } } From 4c83585054cc672e2b20de8f8047c74520c94de2 Mon Sep 17 00:00:00 2001 From: adamfilipow92 <64852261+adamfilipow92@users.noreply.github.com> Date: Wed, 17 Feb 2021 10:13:24 +0100 Subject: [PATCH 5/6] Update test_runner/src/main/kotlin/ftl/run/DumpShards.kt Co-authored-by: pawelpasterz <32893017+pawelpasterz@users.noreply.github.com> --- test_runner/src/main/kotlin/ftl/run/DumpShards.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test_runner/src/main/kotlin/ftl/run/DumpShards.kt b/test_runner/src/main/kotlin/ftl/run/DumpShards.kt index bd3aad6e35..098751a34d 100644 --- a/test_runner/src/main/kotlin/ftl/run/DumpShards.kt +++ b/test_runner/src/main/kotlin/ftl/run/DumpShards.kt @@ -72,8 +72,9 @@ fun saveShardChunks( logLn("${FtlConstants.indent}Saved $size shards to $shardFilePath", OutputLogLevel.DETAILED) } -private fun String.createDirectories() = takeIf { it !in listOf(ANDROID_SHARD_FILE, IOS_SHARD_FILE) }?.let { - File(this).parent.toFile().mkdirs() +private fun String.createDirectories() { + if (this !in listOf(ANDROID_SHARD_FILE, IOS_SHARD_FILE)) + File(this).parent.toFile().mkdirs() } private fun getGson(obfuscatedOutput: Boolean) = From 0d65a7082212f5ad2b77bc9cc90bb68c8db2ab16 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 18 Feb 2021 00:30:01 +0100 Subject: [PATCH 6/6] Added IT for *_dump.json --- .../test/kotlin/integration/DumpShardsIT.kt | 36 +++++++++++++++++++ .../src/test/kotlin/utils/LoadTestSuites.kt | 10 ++++++ .../src/test/kotlin/utils/MatrixTestShards.kt | 15 ++++++++ .../src/test/kotlin/utils/OutputHelper.kt | 5 +++ .../resources/cases/dump_shards_android.yml | 8 ++++- .../test/resources/cases/dump_shards_ios.yml | 4 +++ .../compare/DumpShardsIT-android-compare | 2 +- .../compare/DumpShardsIT-ios-compare | 2 +- 8 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 integration_tests/src/test/kotlin/utils/MatrixTestShards.kt diff --git a/integration_tests/src/test/kotlin/integration/DumpShardsIT.kt b/integration_tests/src/test/kotlin/integration/DumpShardsIT.kt index 524c075ea3..ede954c018 100644 --- a/integration_tests/src/test/kotlin/integration/DumpShardsIT.kt +++ b/integration_tests/src/test/kotlin/integration/DumpShardsIT.kt @@ -6,6 +6,10 @@ import flank.common.isWindows import org.junit.Assume import org.junit.Test import run +import utils.containsAll +import utils.loadAndroidDumpShards +import utils.loadIosDumpShards +import java.io.File class DumpShardsIT { private val name = this::class.java.simpleName @@ -27,6 +31,28 @@ class DumpShardsIT { val resOutput = result.output.removeUnicode() Truth.assertThat(resOutput).containsMatch(findInCompare(name)) assertNoOutcomeSummary(resOutput) + + val matrix = File("android_shards.json").loadAndroidDumpShards() + + Truth.assertThat(matrix.shards.count()).isEqualTo(2) + + Truth.assertThat(matrix.shards.values.flatten()).containsAll( + "class com.example.test_app.parametrized.EspressoParametrizedClassParameterizedNamed", + "class com.example.test_app.parametrized.EspressoParametrizedClassTestParameterized", + "class com.example.test_app.ParameterizedTest", + "class com.example.test_app.parametrized.EspressoParametrizedMethodTestJUnitParamsRunner", + ) + + Truth.assertThat(matrix.junitIgnored.count()).isEqualTo(4) + Truth.assertThat(matrix.junitIgnored).containsNoDuplicates() + + Truth.assertThat(matrix.junitIgnored) + .containsExactly( + "class com.example.test_app.InstrumentedTest#ignoredTestWitSuppress", + "class com.example.test_app.InstrumentedTest#ignoredTestWithIgnore", + "class com.example.test_app.bar.BarInstrumentedTest#ignoredTestBar", + "class com.example.test_app.foo.FooInstrumentedTest#ignoredTestFoo" + ) } @Test @@ -47,5 +73,15 @@ class DumpShardsIT { val resOutput = result.output.removeUnicode() Truth.assertThat(resOutput).containsMatch(findInCompare(name)) assertNoOutcomeSummary(resOutput) + + val shards = File("ios_shards.json").loadIosDumpShards() + + Truth.assertThat(shards.count()).isEqualTo(2) + + shards.first().let { firstShard -> + Truth.assertThat(firstShard.count()).isEqualTo(8) + Truth.assertThat(firstShard) + .contains("EarlGreyExampleSwiftTests/testWithCustomFailureHandler") + } } } diff --git a/integration_tests/src/test/kotlin/utils/LoadTestSuites.kt b/integration_tests/src/test/kotlin/utils/LoadTestSuites.kt index 04bdca365f..067a83f5c7 100644 --- a/integration_tests/src/test/kotlin/utils/LoadTestSuites.kt +++ b/integration_tests/src/test/kotlin/utils/LoadTestSuites.kt @@ -1,9 +1,19 @@ package utils +import com.fasterxml.jackson.databind.json.JsonMapper import com.fasterxml.jackson.dataformat.xml.XmlMapper import com.fasterxml.jackson.module.kotlin.KotlinModule +import com.fasterxml.jackson.module.kotlin.readValue import utils.testResults.TestSuites import java.io.File fun File.loadAsTestSuite(): TestSuites = XmlMapper().registerModule(KotlinModule()).readValue(this, TestSuites::class.java) + +fun File.loadAndroidDumpShards() = jsonMapper + .readValue(this).entries.first().value + +fun File.loadIosDumpShards() = jsonMapper + .readValue(this) + +private val jsonMapper by lazy { JsonMapper().registerModule(KotlinModule()) } diff --git a/integration_tests/src/test/kotlin/utils/MatrixTestShards.kt b/integration_tests/src/test/kotlin/utils/MatrixTestShards.kt new file mode 100644 index 0000000000..fafd443ce1 --- /dev/null +++ b/integration_tests/src/test/kotlin/utils/MatrixTestShards.kt @@ -0,0 +1,15 @@ +package utils + +import com.fasterxml.jackson.annotation.JsonProperty + +typealias AndroidMatrixTestShards = Map + +data class AndroidTestShards( + val app: String, + val test: String, + val shards: Map> = emptyMap(), + @JsonProperty("junit-ignored") + val junitIgnored: List = emptyList() +) + +typealias IosMatrixTestShards = List> diff --git a/integration_tests/src/test/kotlin/utils/OutputHelper.kt b/integration_tests/src/test/kotlin/utils/OutputHelper.kt index fdbe5864aa..cb8b6e9f80 100644 --- a/integration_tests/src/test/kotlin/utils/OutputHelper.kt +++ b/integration_tests/src/test/kotlin/utils/OutputHelper.kt @@ -1,5 +1,6 @@ package utils +import com.google.common.truth.IterableSubject import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import utils.testResults.TestSuites @@ -31,3 +32,7 @@ fun TestSuites.assertTestFail(tests: List) = assertEquals( tests.count(), testSuites.flatMap { it.testCases }.filter { it.name in tests && it.failure != null }.distinctBy { it.name }.count() ) + +fun IterableSubject.containsAll(vararg args: Any) = args.forEach { arg -> + contains(arg) +} diff --git a/integration_tests/src/test/resources/cases/dump_shards_android.yml b/integration_tests/src/test/resources/cases/dump_shards_android.yml index 5566fafb3f..5a208c36a3 100644 --- a/integration_tests/src/test/resources/cases/dump_shards_android.yml +++ b/integration_tests/src/test/resources/cases/dump_shards_android.yml @@ -1,3 +1,9 @@ gcloud: app: ../test_runner/src/test/kotlin/ftl/fixtures/tmp/apk/app-debug.apk - test: ../test_runner/src/test/kotlin/ftl/fixtures/tmp/apk/app-single-success-debug-androidTest.apk + test: ../test_runner/src/test/kotlin/ftl/fixtures/tmp/apk/app-multiple-success-debug-androidTest.apk + use-orchestrator: false + +flank: + disable-sharding: false + max-test-shards: 2 + output-style: single diff --git a/integration_tests/src/test/resources/cases/dump_shards_ios.yml b/integration_tests/src/test/resources/cases/dump_shards_ios.yml index 1fae4e9312..ccb4fca21e 100644 --- a/integration_tests/src/test/resources/cases/dump_shards_ios.yml +++ b/integration_tests/src/test/resources/cases/dump_shards_ios.yml @@ -2,3 +2,7 @@ gcloud: test: ../test_runner/src/test/kotlin/ftl/fixtures/tmp/ios/EarlGreyExample/EarlGreyExample.zip xctestrun-file: ../test_runner/src/test/kotlin/ftl/fixtures/tmp/ios/EarlGreyExample/EarlGreyExampleSwiftTests.xctestrun +flank: + disable-sharding: false + max-test-shards: 2 + output-style: single diff --git a/integration_tests/src/test/resources/compare/DumpShardsIT-android-compare b/integration_tests/src/test/resources/compare/DumpShardsIT-android-compare index 5c59261a77..082cb34427 100644 --- a/integration_tests/src/test/resources/compare/DumpShardsIT-android-compare +++ b/integration_tests/src/test/resources/compare/DumpShardsIT-android-compare @@ -1 +1 @@ - Saved 1 shards to android_shards.json + Saved 2 shards to android_shards.json diff --git a/integration_tests/src/test/resources/compare/DumpShardsIT-ios-compare b/integration_tests/src/test/resources/compare/DumpShardsIT-ios-compare index 1cf4584f8d..60e9fb67f0 100644 --- a/integration_tests/src/test/resources/compare/DumpShardsIT-ios-compare +++ b/integration_tests/src/test/resources/compare/DumpShardsIT-ios-compare @@ -1 +1 @@ - Saved 1 shards to ios_shards.json + Saved 2 shards to ios_shards.json