Convert FeatureFlags to kotlin.

This commit is contained in:
Greyson Parrelli
2024-06-07 22:57:14 -04:00
committed by Alex Hart
parent e62b8de1bc
commit 0b66a8701e
5 changed files with 1118 additions and 1133 deletions

View File

@@ -21,10 +21,10 @@ public class LogSectionFeatureFlags implements LogSection {
@Override @Override
public @NonNull CharSequence getContent(@NonNull Context context) { public @NonNull CharSequence getContent(@NonNull Context context) {
StringBuilder out = new StringBuilder(); StringBuilder out = new StringBuilder();
Map<String, Object> memory = FeatureFlags.getMemoryValues(); Map<String, Object> memory = FeatureFlags.getDebugMemoryValues();
Map<String, Object> disk = FeatureFlags.getDiskValues(); Map<String, Object> disk = FeatureFlags.getDebugDiskValues();
Map<String, Object> pending = FeatureFlags.getPendingDiskValues(); Map<String, Object> pending = FeatureFlags.getDebugPendingDiskValues();
Map<String, Object> forced = FeatureFlags.getForcedValues(); Map<String, Object> forced = FeatureFlags.getDebugForcedValues();
int remoteLength = Stream.of(memory.keySet()).map(String::length).max(Integer::compareTo).orElse(0); int remoteLength = Stream.of(memory.keySet()).map(String::length).max(Integer::compareTo).orElse(0);
int diskLength = Stream.of(disk.keySet()).map(String::length).max(Integer::compareTo).orElse(0); int diskLength = Stream.of(disk.keySet()).map(String::length).max(Integer::compareTo).orElse(0);
int pendingLength = Stream.of(pending.keySet()).map(String::length).max(Integer::compareTo).orElse(0); int pendingLength = Stream.of(pending.keySet()).map(String::length).max(Integer::compareTo).orElse(0);

File diff suppressed because it is too large Load Diff

View File

@@ -2,15 +2,11 @@ package org.thoughtcrime.securesms.crash
import android.app.Application import android.app.Application
import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider
import io.mockk.every
import io.mockk.mockkObject
import org.junit.Before import org.junit.Before
import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.MockedStatic
import org.mockito.Mockito.`when`
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoRule
import org.robolectric.RobolectricTestRunner import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config import org.robolectric.annotation.Config
import org.thoughtcrime.securesms.assertIs import org.thoughtcrime.securesms.assertIs
@@ -28,15 +24,10 @@ import java.util.UUID
@Config(manifest = Config.NONE, application = Application::class) @Config(manifest = Config.NONE, application = Application::class)
class CrashConfigTest { class CrashConfigTest {
@Rule
@JvmField
val mockitoRule: MockitoRule = MockitoJUnit.rule()
@Mock
private lateinit var featureFlags: MockedStatic<FeatureFlags>
@Before @Before
fun setup() { fun setup() {
mockkObject(FeatureFlags)
if (!AppDependencies.isInitialized) { if (!AppDependencies.isInitialized) {
AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider()) AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider())
} }
@@ -54,31 +45,31 @@ class CrashConfigTest {
@Test @Test
fun `simple name pattern`() { fun `simple name pattern`() {
`when`(FeatureFlags.crashPromptConfig()).thenReturn("""[ { "name": "test", "percent": 100 } ]""") every { FeatureFlags.crashPromptConfig() } returns """[ { "name": "test", "percent": 100 } ]"""
CrashConfig.computePatterns() assertIs listOf(CrashConfig.CrashPattern(namePattern = "test")) CrashConfig.computePatterns() assertIs listOf(CrashConfig.CrashPattern(namePattern = "test"))
} }
@Test @Test
fun `simple message pattern`() { fun `simple message pattern`() {
`when`(FeatureFlags.crashPromptConfig()).thenReturn("""[ { "message": "test", "percent": 100 } ]""") every { FeatureFlags.crashPromptConfig() } returns """[ { "message": "test", "percent": 100 } ]"""
CrashConfig.computePatterns() assertIs listOf(CrashConfig.CrashPattern(messagePattern = "test")) CrashConfig.computePatterns() assertIs listOf(CrashConfig.CrashPattern(messagePattern = "test"))
} }
@Test @Test
fun `simple stackTrace pattern`() { fun `simple stackTrace pattern`() {
`when`(FeatureFlags.crashPromptConfig()).thenReturn("""[ { "stackTrace": "test", "percent": 100 } ]""") every { FeatureFlags.crashPromptConfig() } returns """[ { "stackTrace": "test", "percent": 100 } ]"""
CrashConfig.computePatterns() assertIs listOf(CrashConfig.CrashPattern(stackTracePattern = "test")) CrashConfig.computePatterns() assertIs listOf(CrashConfig.CrashPattern(stackTracePattern = "test"))
} }
@Test @Test
fun `all fields set`() { fun `all fields set`() {
`when`(FeatureFlags.crashPromptConfig()).thenReturn("""[ { "name": "test1", "message": "test2", "stackTrace": "test3", "percent": 100 } ]""") every { FeatureFlags.crashPromptConfig() } returns """[ { "name": "test1", "message": "test2", "stackTrace": "test3", "percent": 100 } ]"""
CrashConfig.computePatterns() assertIs listOf(CrashConfig.CrashPattern(namePattern = "test1", messagePattern = "test2", stackTracePattern = "test3")) CrashConfig.computePatterns() assertIs listOf(CrashConfig.CrashPattern(namePattern = "test1", messagePattern = "test2", stackTracePattern = "test3"))
} }
@Test @Test
fun `multiple configs`() { fun `multiple configs`() {
`when`(FeatureFlags.crashPromptConfig()).thenReturn( every { FeatureFlags.crashPromptConfig() } returns
""" """
[ [
{ "name": "test1", "percent": 100 }, { "name": "test1", "percent": 100 },
@@ -86,7 +77,6 @@ class CrashConfigTest {
{ "stackTrace": "test3", "percent": 100 } { "stackTrace": "test3", "percent": 100 }
] ]
""" """
)
CrashConfig.computePatterns() assertIs listOf( CrashConfig.computePatterns() assertIs listOf(
CrashConfig.CrashPattern(namePattern = "test1"), CrashConfig.CrashPattern(namePattern = "test1"),
@@ -97,7 +87,7 @@ class CrashConfigTest {
@Test @Test
fun `empty fields are considered null`() { fun `empty fields are considered null`() {
`when`(FeatureFlags.crashPromptConfig()).thenReturn( every { FeatureFlags.crashPromptConfig() } returns
""" """
[ [
{ "name": "", "percent": 100 }, { "name": "", "percent": 100 },
@@ -105,7 +95,6 @@ class CrashConfigTest {
{ "message": "test2", "stackTrace": "", "percent": 100 } { "message": "test2", "stackTrace": "", "percent": 100 }
] ]
""" """
)
CrashConfig.computePatterns() assertIs listOf( CrashConfig.computePatterns() assertIs listOf(
CrashConfig.CrashPattern(namePattern = "test1"), CrashConfig.CrashPattern(namePattern = "test1"),
@@ -115,31 +104,31 @@ class CrashConfigTest {
@Test @Test
fun `ignore zero percent`() { fun `ignore zero percent`() {
`when`(FeatureFlags.crashPromptConfig()).thenReturn("""[ { "name": "test", "percent": 0 } ]""") every { FeatureFlags.crashPromptConfig() } returns """[ { "name": "test", "percent": 0 } ]"""
CrashConfig.computePatterns() assertIs emptyList() CrashConfig.computePatterns() assertIs emptyList()
} }
@Test @Test
fun `not setting percent is the same as zero percent`() { fun `not setting percent is the same as zero percent`() {
`when`(FeatureFlags.crashPromptConfig()).thenReturn("""[ { "name": "test" } ]""") every { FeatureFlags.crashPromptConfig() } returns """[ { "name": "test" } ]"""
CrashConfig.computePatterns() assertIs emptyList() CrashConfig.computePatterns() assertIs emptyList()
} }
@Test @Test
fun `ignore configs without a pattern`() { fun `ignore configs without a pattern`() {
`when`(FeatureFlags.crashPromptConfig()).thenReturn("""[ { "percent": 100 } ]""") every { FeatureFlags.crashPromptConfig() } returns """[ { "percent": 100 } ]"""
CrashConfig.computePatterns() assertIs emptyList() CrashConfig.computePatterns() assertIs emptyList()
} }
@Test @Test
fun `ignore invalid json`() { fun `ignore invalid json`() {
`when`(FeatureFlags.crashPromptConfig()).thenReturn("asdf") every { FeatureFlags.crashPromptConfig() } returns "asdf"
CrashConfig.computePatterns() assertIs emptyList() CrashConfig.computePatterns() assertIs emptyList()
} }
@Test @Test
fun `ignore empty json`() { fun `ignore empty json`() {
`when`(FeatureFlags.crashPromptConfig()).thenReturn("") every { FeatureFlags.crashPromptConfig() } returns ""
CrashConfig.computePatterns() assertIs emptyList() CrashConfig.computePatterns() assertIs emptyList()
} }
} }

View File

@@ -2,16 +2,12 @@ package org.thoughtcrime.securesms.keyvalue
import android.app.Application import android.app.Application
import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider
import io.mockk.every
import io.mockk.mockkObject
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Before import org.junit.Before
import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.MockedStatic
import org.mockito.Mockito.`when`
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoRule
import org.robolectric.RobolectricTestRunner import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config import org.robolectric.annotation.Config
import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.dependencies.AppDependencies
@@ -22,18 +18,13 @@ import org.thoughtcrime.securesms.util.FeatureFlags
@Config(manifest = Config.NONE, application = Application::class) @Config(manifest = Config.NONE, application = Application::class)
class PaymentsValuesTest { class PaymentsValuesTest {
@Rule
@JvmField
val mockitoRule: MockitoRule = MockitoJUnit.rule()
@Mock
private lateinit var featureFlags: MockedStatic<FeatureFlags>
@Before @Before
fun setup() { fun setup() {
if (!AppDependencies.isInitialized) { if (!AppDependencies.isInitialized) {
AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider()) AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider())
} }
mockkObject(FeatureFlags)
} }
@Test @Test
@@ -57,8 +48,8 @@ class PaymentsValuesTest {
} }
) )
`when`(FeatureFlags.payments()).thenReturn(false) every { FeatureFlags.payments() } returns false
`when`(FeatureFlags.paymentsCountryBlocklist()).thenReturn("") every { FeatureFlags.paymentsCountryBlocklist() } returns ""
assertEquals(PaymentsAvailability.DISABLED_REMOTELY, SignalStore.paymentsValues().paymentsAvailability) assertEquals(PaymentsAvailability.DISABLED_REMOTELY, SignalStore.paymentsValues().paymentsAvailability)
} }
@@ -73,8 +64,8 @@ class PaymentsValuesTest {
} }
) )
`when`(FeatureFlags.payments()).thenReturn(false) every { FeatureFlags.payments() } returns false
`when`(FeatureFlags.paymentsCountryBlocklist()).thenReturn("") every { FeatureFlags.paymentsCountryBlocklist() } returns ""
assertEquals(PaymentsAvailability.WITHDRAW_ONLY, SignalStore.paymentsValues().paymentsAvailability) assertEquals(PaymentsAvailability.WITHDRAW_ONLY, SignalStore.paymentsValues().paymentsAvailability)
} }
@@ -89,8 +80,8 @@ class PaymentsValuesTest {
} }
) )
`when`(FeatureFlags.payments()).thenReturn(true) every { FeatureFlags.payments() } returns true
`when`(FeatureFlags.paymentsCountryBlocklist()).thenReturn("") every { FeatureFlags.paymentsCountryBlocklist() } returns ""
assertEquals(PaymentsAvailability.REGISTRATION_AVAILABLE, SignalStore.paymentsValues().paymentsAvailability) assertEquals(PaymentsAvailability.REGISTRATION_AVAILABLE, SignalStore.paymentsValues().paymentsAvailability)
} }
@@ -105,8 +96,8 @@ class PaymentsValuesTest {
} }
) )
`when`(FeatureFlags.payments()).thenReturn(true) every { FeatureFlags.payments() } returns true
`when`(FeatureFlags.paymentsCountryBlocklist()).thenReturn("") every { FeatureFlags.paymentsCountryBlocklist() } returns ""
assertEquals(PaymentsAvailability.WITHDRAW_AND_SEND, SignalStore.paymentsValues().paymentsAvailability) assertEquals(PaymentsAvailability.WITHDRAW_AND_SEND, SignalStore.paymentsValues().paymentsAvailability)
} }
@@ -121,8 +112,8 @@ class PaymentsValuesTest {
} }
) )
`when`(FeatureFlags.payments()).thenReturn(true) every { FeatureFlags.payments() } returns true
`when`(FeatureFlags.paymentsCountryBlocklist()).thenReturn("1") every { FeatureFlags.paymentsCountryBlocklist() } returns "1"
assertEquals(PaymentsAvailability.NOT_IN_REGION, SignalStore.paymentsValues().paymentsAvailability) assertEquals(PaymentsAvailability.NOT_IN_REGION, SignalStore.paymentsValues().paymentsAvailability)
} }
@@ -137,8 +128,8 @@ class PaymentsValuesTest {
} }
) )
`when`(FeatureFlags.payments()).thenReturn(true) every { FeatureFlags.payments() } returns true
`when`(FeatureFlags.paymentsCountryBlocklist()).thenReturn("1") every { FeatureFlags.paymentsCountryBlocklist() } returns "1"
assertEquals(PaymentsAvailability.WITHDRAW_ONLY, SignalStore.paymentsValues().paymentsAvailability) assertEquals(PaymentsAvailability.WITHDRAW_ONLY, SignalStore.paymentsValues().paymentsAvailability)
} }