messenger-android

Android graphical user interfaces for GNUnet Messenger
Log | Files | Refs | README | LICENSE

commit 46981c59798075c3153e969e103271a81d638b30
parent dc3eaaac936a65dc385b0c1471a13b455dbe4134
Author: t3sserakt <t3sserakt@posteo.de>
Date:   Fri, 28 Nov 2025 11:45:37 +0100

Added integration test

Diffstat:
M.gitignore | 2++
DGNUnetMessenger/.idea/deploymentTargetSelector.xml | 19-------------------
DGNUnetMessenger/.idea/kotlinc.xml | 7-------
MGNUnetMessenger/app/build.gradle.kts | 2++
AGNUnetMessenger/app/src/androidTest/java/org/gnunet/gnunetmessenger/ipc/GnunetChatRemoteTest.kt | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MGNUnetMessenger/gradle/libs.versions.toml | 2+-
6 files changed, 85 insertions(+), 27 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -1,3 +1,5 @@ *~ .DS_Store GNUnetMessenger/app/release/ + +GNUnetMessenger/.idea/*.xml diff --git a/GNUnetMessenger/.idea/deploymentTargetSelector.xml b/GNUnetMessenger/.idea/deploymentTargetSelector.xml @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="deploymentTargetSelector"> - <selectionStates> - <SelectionState runConfigName="app"> - <option name="selectionMode" value="DROPDOWN" /> - <DropdownSelection timestamp="2025-06-11T08:01:17.994684Z"> - <Target type="DEFAULT_BOOT"> - <handle> - <DeviceId pluginId="PhysicalDevice" identifier="serial=26081JEGR13353" /> - </handle> - </Target> - </DropdownSelection> - <DialogSelection /> - </SelectionState> - </selectionStates> - </component> -</project> -\ No newline at end of file diff --git a/GNUnetMessenger/.idea/kotlinc.xml b/GNUnetMessenger/.idea/kotlinc.xml @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="KotlinJpsPluginSettings"> - <option name="version" value="2.0.21" /> - </component> -</project> -\ No newline at end of file diff --git a/GNUnetMessenger/app/build.gradle.kts b/GNUnetMessenger/app/build.gradle.kts @@ -65,4 +65,6 @@ dependencies { androidTestImplementation(libs.androidx.espresso.core) implementation("org.gnunet:gnunet-ipc-contract:1.0.0") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1") + androidTestImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.1") + testImplementation("junit:junit:4.13.2") } \ No newline at end of file diff --git a/GNUnetMessenger/app/src/androidTest/java/org/gnunet/gnunetmessenger/ipc/GnunetChatRemoteTest.kt b/GNUnetMessenger/app/src/androidTest/java/org/gnunet/gnunetmessenger/ipc/GnunetChatRemoteTest.kt @@ -0,0 +1,79 @@ +package org.gnunet.gnunetmessenger.ipc + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.core.app.ApplicationProvider +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.withTimeout +import org.gnunet.gnunetmessenger.model.ChatContext +import org.gnunet.gnunetmessenger.model.ChatMessage +import org.gnunet.gnunetmessenger.model.ChatHandle +import org.gnunet.gnunetmessenger.model.MessengerApp +import org.gnunet.gnunetmessenger.service.GnunetChat +import org.gnunet.gnunetmessenger.service.boundimpl.GnunetChatBoundService +import org.junit.After +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class GnunetChatRemoteTest { + + private val appContext = ApplicationProvider.getApplicationContext<android.content.Context>() + private val gnunetChat: GnunetChatBoundService = GnunetChatBoundService(appContext) + + @After + fun tearDown() { + // sauber vom Service abmelden + gnunetChat.unbind() + } + + @Test + fun startChat_and_getProfileName_works() = runTest { + // 1. Chat starten – callback ignorieren wir erstmal + val handle: ChatHandle = gnunetChat.startChat( + messengerApp = MessengerApp() + ) { _: ChatContext, _: ChatMessage -> + // hier könntest du später Messages sammeln / asserten + } + + // 2. Warten, bis der echte Handle vom Server da ist + withTimeout(5_000) { + gnunetChat.awaitReady(handle) + } + assertTrue("Handle.pointer sollte != 0 sein", handle.pointer != 0L) + + // 3. Remote-Call auf die Server-App: getProfileName() + val profileName = gnunetChat.getProfileName(handle) + + // Aktuell sollte der Default-Name aus deiner Session-Struktur kommen + assertEquals("GNUnet", profileName) + } + + @Test + fun createAccount_then_iterateAccounts_sees_it() = runTest { + val handle = gnunetChat.startChat(MessengerApp("Default")) { _, _ -> } + withTimeout(5_000) { gnunetChat.awaitReady(handle) } + + val name = "MyTestAccount" + + val result = gnunetChat.createAccount(handle, name) + assertEquals(GnunetReturnValue.OK, result) + + val accounts = mutableListOf<ChatAccount>() + + // iterateAccounts ist nicht suspend -> wir warten mit Timeout, + // bis mindestens ein Account mit passendem Namen im Callback war. + gnunetChat.iterateAccounts(handle) { acc -> + accounts += acc + } + + withTimeout(3_000) { + while (accounts.none { it.name == name }) { + kotlinx.coroutines.delay(50) + } + } + + assertTrue(accounts.any { it.name == name }) + } +} +\ No newline at end of file diff --git a/GNUnetMessenger/gradle/libs.versions.toml b/GNUnetMessenger/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.13.0" +agp = "8.9.1" cardview = "1.0.0" kotlin = "2.2.0" coreKtx = "1.10.1"