mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-23 04:28:35 +00:00
Convert FeatureFlags to kotlin.
This commit is contained in:
committed by
Alex Hart
parent
e62b8de1bc
commit
0b66a8701e
@@ -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
1083
app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.kt
Normal file
1083
app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.kt
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user