From aad19ab8445a004a0652e00ee3d8c1bc3fa2f867 Mon Sep 17 00:00:00 2001 From: Dmitrii Krasnov Date: Mon, 6 Nov 2023 18:55:40 +0000 Subject: [PATCH] [Gradle, Native] Override equals and hashCode in KonanTarget "data objects" is only available since language version 1.9. But we should not use LV 1.9, because it is used in the Gradle build classpath and would be incompatible with Gradle Kotlin runtime. Then only manually override equals/toString/ works here. #KT-61657 Fixed Merge-request: KT-MR-12759 Merged-by: Dmitrii Krasnov --- .../kotlin/konan/target/KonanTarget.kt | 15 +++++++++ .../kotlin/konan/target/KonanTargetTest.kt | 33 ++++++++++++++++--- 2 files changed, 44 insertions(+), 4 deletions(-) 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) + } }