mirror of
https://github.com/oxen-io/session-android.git
synced 2024-11-28 20:45:17 +00:00
feat: adding dependencies to try and get android tests working, fixing bug with initial config not syncing properly
This commit is contained in:
parent
fdff11c535
commit
c445267ed9
@ -127,6 +127,10 @@ dependencies {
|
|||||||
testImplementation 'org.assertj:assertj-core:3.11.1'
|
testImplementation 'org.assertj:assertj-core:3.11.1'
|
||||||
testImplementation "org.mockito:mockito-inline:4.10.0"
|
testImplementation "org.mockito:mockito-inline:4.10.0"
|
||||||
testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
|
testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
|
||||||
|
|
||||||
|
androidTestImplementation "com.google.dagger:hilt-android-testing:$daggerVersion"
|
||||||
|
kaptAndroidTest "com.google.dagger:hilt-android-compiler:$daggerVersion"
|
||||||
|
|
||||||
androidTestImplementation "org.mockito:mockito-android:4.10.0"
|
androidTestImplementation "org.mockito:mockito-android:4.10.0"
|
||||||
androidTestImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
|
androidTestImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
|
||||||
testImplementation "androidx.test:core:$testCoreVersion"
|
testImplementation "androidx.test:core:$testCoreVersion"
|
||||||
@ -222,7 +226,7 @@ android {
|
|||||||
buildConfigField "int", "CANONICAL_VERSION_CODE", "$canonicalVersionCode"
|
buildConfigField "int", "CANONICAL_VERSION_CODE", "$canonicalVersionCode"
|
||||||
|
|
||||||
resConfigs autoResConfig()
|
resConfigs autoResConfig()
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "network.loki.messenger.util.HiltApplicationRunner"
|
||||||
// The following argument makes the Android Test Orchestrator run its
|
// The following argument makes the Android Test Orchestrator run its
|
||||||
// "pm clear" command after each test invocation. This command ensures
|
// "pm clear" command after each test invocation. This command ensures
|
||||||
// that the app's state is completely cleared between tests.
|
// that the app's state is completely cleared between tests.
|
||||||
|
@ -3,15 +3,21 @@ package network.loki.messenger
|
|||||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
import androidx.test.platform.app.InstrumentationRegistry
|
import androidx.test.platform.app.InstrumentationRegistry
|
||||||
|
import dagger.hilt.android.testing.CustomTestApplication
|
||||||
|
import dagger.hilt.android.testing.HiltAndroidRule
|
||||||
|
import dagger.hilt.android.testing.HiltAndroidTest
|
||||||
|
import network.loki.messenger.libsession_util.ConfigBase
|
||||||
import network.loki.messenger.libsession_util.Contacts
|
import network.loki.messenger.libsession_util.Contacts
|
||||||
import network.loki.messenger.libsession_util.util.Contact
|
import network.loki.messenger.libsession_util.util.Contact
|
||||||
import network.loki.messenger.libsession_util.util.ExpiryMode
|
import network.loki.messenger.libsession_util.util.ExpiryMode
|
||||||
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.kotlin.any
|
import org.mockito.kotlin.any
|
||||||
import org.mockito.kotlin.spy
|
import org.mockito.kotlin.spy
|
||||||
import org.mockito.kotlin.verify
|
import org.mockito.kotlin.verify
|
||||||
|
import org.mockito.kotlin.whenever
|
||||||
import org.session.libsession.messaging.MessagingModuleConfiguration
|
import org.session.libsession.messaging.MessagingModuleConfiguration
|
||||||
import org.session.libsession.utilities.TextSecurePreferences
|
import org.session.libsession.utilities.TextSecurePreferences
|
||||||
import org.session.libsignal.utilities.KeyHelper
|
import org.session.libsignal.utilities.KeyHelper
|
||||||
@ -20,14 +26,25 @@ import org.thoughtcrime.securesms.ApplicationContext
|
|||||||
import org.thoughtcrime.securesms.crypto.KeyPairUtilities
|
import org.thoughtcrime.securesms.crypto.KeyPairUtilities
|
||||||
import kotlin.random.Random
|
import kotlin.random.Random
|
||||||
|
|
||||||
|
@CustomTestApplication(ApplicationContext::class)
|
||||||
|
interface HiltApplicationContext
|
||||||
|
|
||||||
@RunWith(AndroidJUnit4::class)
|
@RunWith(AndroidJUnit4::class)
|
||||||
@SmallTest
|
@SmallTest
|
||||||
|
@HiltAndroidTest
|
||||||
class LibSessionTests {
|
class LibSessionTests {
|
||||||
|
|
||||||
|
@get:Rule
|
||||||
|
val hiltRule = HiltAndroidRule(this)
|
||||||
|
|
||||||
private fun randomSeedBytes() = (0 until 16).map { Random.nextInt(UByte.MAX_VALUE.toInt()).toByte() }
|
private fun randomSeedBytes() = (0 until 16).map { Random.nextInt(UByte.MAX_VALUE.toInt()).toByte() }
|
||||||
private fun randomKeyPair() = KeyPairUtilities.generate(randomSeedBytes().toByteArray())
|
private fun randomKeyPair() = KeyPairUtilities.generate(randomSeedBytes().toByteArray())
|
||||||
private fun randomSessionId() = randomKeyPair().x25519KeyPair.hexEncodedPublicKey
|
private fun randomSessionId() = randomKeyPair().x25519KeyPair.hexEncodedPublicKey
|
||||||
|
|
||||||
|
private var fakeHashI = 0
|
||||||
|
private val nextFakeHash: String
|
||||||
|
get() = "fakehash${fakeHashI++}"
|
||||||
|
|
||||||
private fun maybeGetUserInfo(): Pair<ByteArray, String>? {
|
private fun maybeGetUserInfo(): Pair<ByteArray, String>? {
|
||||||
val appContext = InstrumentationRegistry.getInstrumentation().targetContext.applicationContext as ApplicationContext
|
val appContext = InstrumentationRegistry.getInstrumentation().targetContext.applicationContext as ApplicationContext
|
||||||
val prefs = appContext.prefs
|
val prefs = appContext.prefs
|
||||||
@ -46,7 +63,12 @@ class LibSessionTests {
|
|||||||
contactList.forEach { contact ->
|
contactList.forEach { contact ->
|
||||||
contacts.set(contact)
|
contacts.set(contact)
|
||||||
}
|
}
|
||||||
return contacts.dump()
|
return contacts.push().config
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun fakePollNewConfig(configBase: ConfigBase, toMerge: ByteArray) {
|
||||||
|
configBase.merge(nextFakeHash to toMerge)
|
||||||
|
MessagingModuleConfiguration.shared.configFactory.persist(configBase)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@ -65,6 +87,7 @@ class LibSessionTests {
|
|||||||
@Test
|
@Test
|
||||||
fun migration_one_to_ones() {
|
fun migration_one_to_ones() {
|
||||||
val storageSpy = spy(MessagingModuleConfiguration.shared.storage)
|
val storageSpy = spy(MessagingModuleConfiguration.shared.storage)
|
||||||
|
whenever(MessagingModuleConfiguration.shared.storage).thenReturn(storageSpy)
|
||||||
|
|
||||||
val newContactId = randomSessionId()
|
val newContactId = randomSessionId()
|
||||||
val singleContact = Contact(
|
val singleContact = Contact(
|
||||||
@ -73,8 +96,8 @@ class LibSessionTests {
|
|||||||
expiryMode = ExpiryMode.NONE
|
expiryMode = ExpiryMode.NONE
|
||||||
)
|
)
|
||||||
val newContactMerge = buildContactMessage(listOf(singleContact))
|
val newContactMerge = buildContactMessage(listOf(singleContact))
|
||||||
MessagingModuleConfiguration.shared.configFactory.contacts!!.merge("abc123" to newContactMerge)
|
val contacts = MessagingModuleConfiguration.shared.configFactory.contacts!!
|
||||||
|
fakePollNewConfig(contacts, newContactMerge)
|
||||||
verify(storageSpy).addLibSessionContacts(any())
|
verify(storageSpy).addLibSessionContacts(any())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,17 @@
|
|||||||
|
package network.loki.messenger.util
|
||||||
|
|
||||||
|
import android.app.Application
|
||||||
|
import android.content.Context
|
||||||
|
import androidx.test.runner.AndroidJUnitRunner
|
||||||
|
import network.loki.messenger.HiltApplicationContext
|
||||||
|
|
||||||
|
class HiltApplicationRunner: AndroidJUnitRunner() {
|
||||||
|
|
||||||
|
override fun newApplication(
|
||||||
|
cl: ClassLoader?,
|
||||||
|
className: String?,
|
||||||
|
context: Context?
|
||||||
|
): Application {
|
||||||
|
return super.newApplication(cl, HiltApplicationContext::class.java.name, context)
|
||||||
|
}
|
||||||
|
}
|
@ -127,7 +127,7 @@ import network.loki.messenger.libsession_util.UserProfile;
|
|||||||
* @author Moxie Marlinspike
|
* @author Moxie Marlinspike
|
||||||
*/
|
*/
|
||||||
@HiltAndroidApp
|
@HiltAndroidApp
|
||||||
public class ApplicationContext extends Application implements DefaultLifecycleObserver, ConfigFactoryUpdateListener {
|
public class ApplicationContext extends BaseApplication implements DefaultLifecycleObserver, ConfigFactoryUpdateListener {
|
||||||
|
|
||||||
public static final String PREFERENCES_NAME = "SecureSMS-Preferences";
|
public static final String PREFERENCES_NAME = "SecureSMS-Preferences";
|
||||||
|
|
||||||
|
@ -0,0 +1,19 @@
|
|||||||
|
package org.thoughtcrime.securesms
|
||||||
|
|
||||||
|
import android.app.Application
|
||||||
|
import org.session.libsession.database.MessageDataProvider
|
||||||
|
import org.session.libsession.utilities.TextSecurePreferences
|
||||||
|
import org.thoughtcrime.securesms.database.JobDatabase
|
||||||
|
import org.thoughtcrime.securesms.database.LokiAPIDatabase
|
||||||
|
import org.thoughtcrime.securesms.database.Storage
|
||||||
|
import org.thoughtcrime.securesms.dependencies.ConfigFactory
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
abstract class BaseApplication: Application() {
|
||||||
|
lateinit var lokiAPIDatabase: LokiAPIDatabase
|
||||||
|
lateinit var storage: Storage
|
||||||
|
lateinit var messageDataProvider: MessageDataProvider
|
||||||
|
lateinit var jobDatabase: JobDatabase
|
||||||
|
lateinit var textSecurePreferences: TextSecurePreferences
|
||||||
|
lateinit var configFactory: ConfigFactory
|
||||||
|
}
|
@ -360,7 +360,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
|
|||||||
|
|
||||||
// TODO: remove this after enough updates that we can rely on ConfigBase.isNewConfigEnabled to always return true
|
// TODO: remove this after enough updates that we can rely on ConfigBase.isNewConfigEnabled to always return true
|
||||||
// This will only run if we aren't using new configs, as they are schedule to sync when there are changes applied
|
// This will only run if we aren't using new configs, as they are schedule to sync when there are changes applied
|
||||||
if (textSecurePreferences.getConfigurationMessageSynced() && !ConfigBase.isNewConfigEnabled) {
|
if (textSecurePreferences.getConfigurationMessageSynced()) {
|
||||||
lifecycleScope.launch(Dispatchers.IO) {
|
lifecycleScope.launch(Dispatchers.IO) {
|
||||||
ConfigurationMessageUtilities.syncConfigurationIfNeeded(this@HomeActivity)
|
ConfigurationMessageUtilities.syncConfigurationIfNeeded(this@HomeActivity)
|
||||||
}
|
}
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 057318136c69f582b7fd78a39ee26686d1d5a3ec
|
Subproject commit 2c18eced69f464ed96aa5bb6ec7c4c6f815e17fe
|
Loading…
Reference in New Issue
Block a user