From 0b8caaa810db979ec75cfedca1efff23150596c4 Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 28 Oct 2026 12:12:38 +0100 Subject: [PATCH] Model LAN invitation JNI calls and multicast lock failures --- .../main/kotlin/android/content/Context.kt | 5 +++ .../kotlin/android/net/wifi/WifiManager.kt | 35 +++++++++++++++++++ .../utun/chat/data/RouterHostEnvironment.kt | 8 +++++ 3 files changed, 48 insertions(+) create mode 100644 tools/chatgui-android/router-tests/src/main/kotlin/android/net/wifi/WifiManager.kt diff --git a/tools/chatgui-android/router-tests/src/main/kotlin/android/content/Context.kt b/tools/chatgui-android/router-tests/src/main/kotlin/android/content/Context.kt index 9e07769c..3f4238cc 100644 --- a/tools/chatgui-android/router-tests/src/main/kotlin/android/content/Context.kt +++ b/tools/chatgui-android/router-tests/src/main/kotlin/android/content/Context.kt @@ -5,6 +5,7 @@ import android.app.NotificationManager import android.os.PowerManager import android.os.Vibrator import android.net.ConnectivityManager +import android.net.wifi.WifiManager import android.hardware.SensorManager import android.telephony.SubscriptionManager import android.telephony.TelephonyManager @@ -16,6 +17,7 @@ class Context { companion object { const val AUDIO_SERVICE = "audio"; const val SENSOR_SERVICE = "sensor"; const val VIBRATOR_SERVICE = "vibrator" const val POWER_SERVICE = "power" + const val WIFI_SERVICE = "wifi" } val packageName = "com.utun.chat" var cacheDir = File(System.getProperty("java.io.tmpdir"), "utun-router-host-cache") @@ -25,6 +27,8 @@ class Context { var notificationManager: NotificationManager? = NotificationManager() var permissionGranted = true var connectivityManager: ConnectivityManager? = ConnectivityManager() + var wifiManager: WifiManager? = WifiManager() + var failWifiService = false var sensorManager: SensorManager? = SensorManager() var subscriptionManager: SubscriptionManager? = SubscriptionManager() var telephonyManager: TelephonyManager? = TelephonyManager() @@ -35,6 +39,7 @@ class Context { SENSOR_SERVICE -> sensorManager VIBRATOR_SERVICE -> vibrator POWER_SERVICE -> powerManager + WIFI_SERVICE -> { check(!failWifiService) { "Wi-Fi service unavailable" }; wifiManager } else -> error("Unknown service: $name") } fun getSystemService(type: Class): T? { diff --git a/tools/chatgui-android/router-tests/src/main/kotlin/android/net/wifi/WifiManager.kt b/tools/chatgui-android/router-tests/src/main/kotlin/android/net/wifi/WifiManager.kt new file mode 100644 index 00000000..13e25115 --- /dev/null +++ b/tools/chatgui-android/router-tests/src/main/kotlin/android/net/wifi/WifiManager.kt @@ -0,0 +1,35 @@ +package android.net.wifi + +/** Host-модель MulticastLock: отказы до/после побочного эффекта и проверка повторного использования владельца. */ +class WifiManager { + var failures = emptySet() + val locks = mutableListOf() + fun createMulticastLock(tag: String): MulticastLock { + check("create" !in failures) { "multicast create unavailable" } + return MulticastLock(tag, failures).also { locks.add(it) } + } + class MulticastLock(val tag: String, var failures: Set) { + var held = false + var counted = true + private set + var acquisitions = 0 + var releases = 0 + val isHeld: Boolean get() { check("query" !in failures) { "multicast query unavailable" }; return held } + fun setReferenceCounted(value: Boolean) { + check("configure" !in failures) { "multicast configure unavailable" } + counted = value + } + fun acquire() { + acquisitions++ + check("acquire_before" !in failures) { "multicast acquire before effect" } + held = true + check("acquire_after" !in failures) { "multicast acquire after effect" } + } + fun release() { + releases++ + check("release_before" !in failures) { "multicast release before effect" } + held = false + check("release_after" !in failures) { "multicast release after effect" } + } + } +} diff --git a/tools/chatgui-android/router-tests/src/main/kotlin/com/utun/chat/data/RouterHostEnvironment.kt b/tools/chatgui-android/router-tests/src/main/kotlin/com/utun/chat/data/RouterHostEnvironment.kt index f5420468..3f02242c 100644 --- a/tools/chatgui-android/router-tests/src/main/kotlin/com/utun/chat/data/RouterHostEnvironment.kt +++ b/tools/chatgui-android/router-tests/src/main/kotlin/com/utun/chat/data/RouterHostEnvironment.kt @@ -34,6 +34,14 @@ object LogManager { /** Только host-тест: считает уведомления standby, не загружает JNI и не запускает ядро. */ object NativeLib { + data class LocalInvite(val peer: Long, val request: Long, val link: String) + val localInvites = mutableListOf() + var sendLocal: (LocalInvite) -> Boolean = { true } + fun sendLocalInvite(peer: Long, request: Long, link: String): Boolean { + val call = LocalInvite(peer, request, link) + localInvites.add(call) + return sendLocal(call) + } data class FileTransfer(val id: Long, val group: Long, val server: Long, val owner: Long, val remote: String, val local: String, val upload: Boolean, val version: ByteArray) var fileRequest: (Long, Long, ByteArray) -> Boolean = { _, _, _ -> true }