From 7ceec7e823b6a2403a56be341eadc778294e61be Mon Sep 17 00:00:00 2001 From: "v.lantratov" Date: Fri, 27 May 2022 17:53:16 +0300 Subject: [PATCH] fix check superclasses for flag class --- .../datasource/DebugDataSource.kt | 16 +++++++++- .../datasource/DebugDataSourceTest.kt | 10 +++++++ .../test/flag/BooleanFeatureFlag.kt | 2 +- .../test/flag/ComplexBooleanFeatureFlag.kt | 29 +++++++++++++++++++ .../test/registry/TestFlagRegistry.kt | 1 + 5 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 test/src/main/java/com/qiwi/featuretoggle/test/flag/ComplexBooleanFeatureFlag.kt diff --git a/datasource-debug/src/main/java/com/qiwi/featuretoggle/datasource/DebugDataSource.kt b/datasource-debug/src/main/java/com/qiwi/featuretoggle/datasource/DebugDataSource.kt index 1b54eb3..fc00f5b 100644 --- a/datasource-debug/src/main/java/com/qiwi/featuretoggle/datasource/DebugDataSource.kt +++ b/datasource-debug/src/main/java/com/qiwi/featuretoggle/datasource/DebugDataSource.kt @@ -90,7 +90,10 @@ class DebugDataSource(private val isEnabled: Boolean = true, registry: FeatureFlagRegistry ): Map { val flagClass = registry.getFeatureFlagsMap()[key] - return if (flagClass != null && flagClass.superclass == SimpleFeatureFlag::class.java) { + val hasSimpleFeatureFlagAsSuperclass = flagClass?.superclasses + ?.any { it == SimpleFeatureFlag::class.java } + ?: false + return if (flagClass != null && hasSimpleFeatureFlagAsSuperclass) { val featureFlag = flagClass.constructors.first().newInstance() as SimpleFeatureFlag featureFlag.isEnabled = isEnabled mapOf(key to featureFlag) @@ -159,4 +162,15 @@ class DebugDataSource(private val isEnabled: Boolean = true, data class UpdateSimpleFlag(val key: String, val isEnabled: Boolean): FeatureFlagsUpdateEvent() data class UpdateFromJsonString(val content: String): FeatureFlagsUpdateEvent() } + + private val Class<*>.superclasses: List> + get() { + val classesList = mutableListOf>() + var currentSuperclass = superclass + while (currentSuperclass != null) { + classesList.add(currentSuperclass) + currentSuperclass = currentSuperclass.superclass + } + return classesList + } } \ No newline at end of file diff --git a/datasource-debug/src/test/java/com/qiwi/featuretoggle/datasource/DebugDataSourceTest.kt b/datasource-debug/src/test/java/com/qiwi/featuretoggle/datasource/DebugDataSourceTest.kt index d100dda..69a59a8 100644 --- a/datasource-debug/src/test/java/com/qiwi/featuretoggle/datasource/DebugDataSourceTest.kt +++ b/datasource-debug/src/test/java/com/qiwi/featuretoggle/datasource/DebugDataSourceTest.kt @@ -25,6 +25,8 @@ import app.cash.turbine.test import com.qiwi.featuretoggle.converter.JacksonFeatureFlagConverter import com.qiwi.featuretoggle.test.flag.BOOLEAN_FEATURE_KEY import com.qiwi.featuretoggle.test.flag.BooleanFeatureFlag +import com.qiwi.featuretoggle.test.flag.COMPLEX_BOOLEAN_FEATURE_KEY +import com.qiwi.featuretoggle.test.flag.ComplexBooleanFeatureFlag import com.qiwi.featuretoggle.test.logger.TestLogger import com.qiwi.featuretoggle.test.registry.TestFlagRegistry import com.qiwi.featuretoggle.test.util.TestResources @@ -59,6 +61,14 @@ class DebugDataSourceTest { assertEquals(mapOf(BOOLEAN_FEATURE_KEY to BooleanFeatureFlag().apply { isEnabled = true }), awaitItem()) + dataSource.updateSimpleFeatureFlag(COMPLEX_BOOLEAN_FEATURE_KEY, false) + assertEquals(mapOf(COMPLEX_BOOLEAN_FEATURE_KEY to ComplexBooleanFeatureFlag().apply { + isEnabled = false + }), awaitItem()) + dataSource.updateSimpleFeatureFlag(COMPLEX_BOOLEAN_FEATURE_KEY, true) + assertEquals(mapOf(COMPLEX_BOOLEAN_FEATURE_KEY to ComplexBooleanFeatureFlag().apply { + isEnabled = true + }), awaitItem()) } } diff --git a/test/src/main/java/com/qiwi/featuretoggle/test/flag/BooleanFeatureFlag.kt b/test/src/main/java/com/qiwi/featuretoggle/test/flag/BooleanFeatureFlag.kt index cceee5f..628448c 100644 --- a/test/src/main/java/com/qiwi/featuretoggle/test/flag/BooleanFeatureFlag.kt +++ b/test/src/main/java/com/qiwi/featuretoggle/test/flag/BooleanFeatureFlag.kt @@ -25,6 +25,6 @@ import com.qiwi.featuretoggle.annotation.FeatureFlag import com.qiwi.featuretoggle.flag.SimpleFeatureFlag @FeatureFlag(BOOLEAN_FEATURE_KEY) -class BooleanFeatureFlag: SimpleFeatureFlag() +open class BooleanFeatureFlag: SimpleFeatureFlag() const val BOOLEAN_FEATURE_KEY = "boolean_feature" \ No newline at end of file diff --git a/test/src/main/java/com/qiwi/featuretoggle/test/flag/ComplexBooleanFeatureFlag.kt b/test/src/main/java/com/qiwi/featuretoggle/test/flag/ComplexBooleanFeatureFlag.kt new file mode 100644 index 0000000..f74ffbe --- /dev/null +++ b/test/src/main/java/com/qiwi/featuretoggle/test/flag/ComplexBooleanFeatureFlag.kt @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2021 QIWI + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.qiwi.featuretoggle.test.flag + +import com.qiwi.featuretoggle.annotation.FeatureFlag + +@FeatureFlag(COMPLEX_BOOLEAN_FEATURE_KEY) +class ComplexBooleanFeatureFlag: BooleanFeatureFlag() + +const val COMPLEX_BOOLEAN_FEATURE_KEY = "boolean_feature_complex" \ No newline at end of file diff --git a/test/src/main/java/com/qiwi/featuretoggle/test/registry/TestFlagRegistry.kt b/test/src/main/java/com/qiwi/featuretoggle/test/registry/TestFlagRegistry.kt index 798fc5b..25be6f1 100644 --- a/test/src/main/java/com/qiwi/featuretoggle/test/registry/TestFlagRegistry.kt +++ b/test/src/main/java/com/qiwi/featuretoggle/test/registry/TestFlagRegistry.kt @@ -27,6 +27,7 @@ import com.qiwi.featuretoggle.test.flag.* class TestFlagRegistry( var flagsMap: Map> = mapOf( BOOLEAN_FEATURE_KEY to BooleanFeatureFlag::class.java, + COMPLEX_BOOLEAN_FEATURE_KEY to ComplexBooleanFeatureFlag::class.java, STRING_FEATURE_KEY to StringFeatureFlag::class.java, DOUBLE_FEATURE_KEY to DoubleFeatureFlag::class.java, COMPLEX_FEATURE_KEY to ComplexFeatureFlag::class.java