diff --git a/native/utils/src/org/jetbrains/kotlin/konan/target/KonanTarget.kt b/native/utils/src/org/jetbrains/kotlin/konan/target/KonanTarget.kt index f643d98fc54..a1803e98b42 100644 --- a/native/utils/src/org/jetbrains/kotlin/konan/target/KonanTarget.kt +++ b/native/utils/src/org/jetbrains/kotlin/konan/target/KonanTarget.kt @@ -69,4 +69,19 @@ sealed class KonanTarget(override val name: String, val family: Family, val arch val deprecatedTargets = setOf(WATCHOS_X86, IOS_ARM32, LINUX_ARM32_HFP, MINGW_X86, LINUX_MIPS32, LINUX_MIPSEL32, WASM32) val toleratedDeprecatedTargets = setOf(LINUX_ARM32_HFP) } + + override fun equals(other: Any?): Boolean { + return when { + this === other -> true + other !is KonanTarget -> false + else -> this.name == other.name && this.family == other.family && this.architecture == other.architecture + } + } + + override fun hashCode(): Int { + var result = name.hashCode() + result = 31 * result + family.hashCode() + result = 31 * result + architecture.hashCode() + return result + } } diff --git a/native/utils/tests/org/jetbrains/kotlin/konan/target/KonanTargetTest.kt b/native/utils/tests/org/jetbrains/kotlin/konan/target/KonanTargetTest.kt index 8526755de88..5e636522063 100644 --- a/native/utils/tests/org/jetbrains/kotlin/konan/target/KonanTargetTest.kt +++ b/native/utils/tests/org/jetbrains/kotlin/konan/target/KonanTargetTest.kt @@ -5,16 +5,41 @@ package org.jetbrains.kotlin.konan.target -import org.junit.Assert.assertEquals -import org.junit.Test +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.io.TempDir +import java.io.FileInputStream +import java.io.FileOutputStream +import java.io.ObjectInputStream +import java.io.ObjectOutputStream +import java.nio.file.Path + class KonanTargetTest { @Test fun allPredefinedTargetsRegistered() { assertEquals( - "Some of predefined KonanTarget instances are not listed in 'KonanTarget.predefinedTargets'", KonanTarget::class.sealedSubclasses.mapNotNull { it.objectInstance }.toSet(), - KonanTarget.predefinedTargets.values.toSet() + KonanTarget.predefinedTargets.values.toSet(), + "Some of predefined KonanTarget instances are not listed in 'KonanTarget.predefinedTargets'", ) } + + @DisplayName("Test checks that all KonanTarget objects can be successfully serialized and deserialized") + @Test + fun checkKonanTargetsSerializationAndDeserialization(@TempDir serializedTargetsDir: Path) { + val konanTargetsBeforeSerialization = KonanTarget::class.sealedSubclasses.mapNotNull { it.objectInstance }.toSet() + + val serializedTargetsFile = serializedTargetsDir.resolve("serializedTargets.txt") + + ObjectOutputStream(FileOutputStream(serializedTargetsFile.toFile())).use { + it.writeObject(konanTargetsBeforeSerialization) + } + val konanTargetsAfterDeserialization = ObjectInputStream(FileInputStream(serializedTargetsFile.toFile())).use { + it.readObject() + } + + assertEquals(konanTargetsBeforeSerialization, konanTargetsAfterDeserialization) + } }