docs(journal): Session-Log zu P2P-Guards, FilePicker-Fixes und Tests hinzugefügt
Signed-off-by: Stefan Mogeritsch <stefan.mo.co@gmail.com>
This commit is contained in:
@@ -0,0 +1,33 @@
|
|||||||
|
---
|
||||||
|
type: Journal
|
||||||
|
status: COMPLETED
|
||||||
|
owner: Curator
|
||||||
|
last_update: 2026-05-08
|
||||||
|
---
|
||||||
|
|
||||||
|
# 2026-05-08 — Session Log (P2P Guards, FilePicker & Test Verification)
|
||||||
|
|
||||||
|
## Kontext
|
||||||
|
- Fokus: Stabilisierung des P2P-Sync-Servers (Guard gegen Mehrfachstart) und finale Optimierung des JVM File-Pickers für KDE/Fedora.
|
||||||
|
- Basierend auf den ToDos vom Vortag.
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
- **P2P Sync Guard:** `JvmP2pSyncService` wurde um einen port-basierten Guard erweitert. Mehrfache Start-Aufrufe auf demselben Port werden nun prozessweit abgefangen (idempotent), was Ressourcen schont und Fehler beim Bind verhindert.
|
||||||
|
- **Test-Verifikation:** Neuer Integration-Test `JvmP2pSyncServiceTest` erstellt, der das Guard-Verhalten und die Freigabe des Ports nach Stop verifiziert.
|
||||||
|
- **MsFilePicker (JVM):** Finale Anpassungen für KDE (Fedora 44). Umstellung auf `isAcceptAllFileFilterUsed = false` und explizites `approveButtonText = "Auswählen"`. Der Directory-Picker nutzt nun konsequent `OPEN_DIALOG` im `DIRECTORIES_ONLY` Modus.
|
||||||
|
- **Build-Fix:** Ein Tippfehler (`acceptAllFileFilterUsed` -> `isAcceptAllFileFilterUsed`) wurde korrigiert.
|
||||||
|
|
||||||
|
## Changes
|
||||||
|
- `at.mocode.frontend.core.network.sync.JvmP2pSyncService`: Port-Guard integriert.
|
||||||
|
- `at.mocode.frontend.core.network.sync.JvmP2pSyncServiceTest`: Neuer JVM-Test (verifiziert ✅).
|
||||||
|
- `at.mocode.frontend.core.designsystem.components.MsFilePicker.jvm.kt`: UI-Anpassungen für Swing JFileChooser.
|
||||||
|
- `frontend/core/network/build.gradle.kts`: Test-Abhängigkeiten hinzugefügt.
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
- **Unit/Integration Tests:** `JvmP2pSyncServiceTest` erfolgreich durchgelaufen ✓.
|
||||||
|
- **Build (Gradle):** Gesamter Build inkl. Packaging-Hüllen erfolgreich ✓.
|
||||||
|
- **Laufzeit (Netzwerk):** P2P-Guard loggt korrekt: "[P2P Server] Bereits gestartet...". Discovery-Sichtbarkeit LAN/WLAN weiterhin abhängig von Firewalld-Status (siehe ToDo-Firewall).
|
||||||
|
|
||||||
|
## Nächste Schritte
|
||||||
|
1. Conveyor-Build auf einem x86_64 Runner (oder lokal) verifizieren, um Windows-Installer zu erzeugen.
|
||||||
|
2. Erste physische Turnier-Hierarchie (MEILENSTEIN 1) angehen.
|
||||||
+4
-1
@@ -78,6 +78,9 @@ actual fun MsFilePicker(
|
|||||||
SwingUtilities.invokeLater {
|
SwingUtilities.invokeLater {
|
||||||
val chooser = JFileChooser().apply {
|
val chooser = JFileChooser().apply {
|
||||||
isMultiSelectionEnabled = false
|
isMultiSelectionEnabled = false
|
||||||
|
isAcceptAllFileFilterUsed = false
|
||||||
|
approveButtonText = "Auswählen"
|
||||||
|
|
||||||
// Initiales Verzeichnis/Pfad
|
// Initiales Verzeichnis/Pfad
|
||||||
run {
|
run {
|
||||||
val home = File(System.getProperty("user.home") ?: ".")
|
val home = File(System.getProperty("user.home") ?: ".")
|
||||||
@@ -108,7 +111,7 @@ actual fun MsFilePicker(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val result = chooser.showDialog(null, "Auswählen")
|
val result = chooser.showOpenDialog(null)
|
||||||
if (result == JFileChooser.APPROVE_OPTION) {
|
if (result == JFileChooser.APPROVE_OPTION) {
|
||||||
val chosen = chooser.selectedFile
|
val chosen = chooser.selectedFile
|
||||||
if (directoryOnly) {
|
if (directoryOnly) {
|
||||||
|
|||||||
@@ -51,5 +51,10 @@ kotlin {
|
|||||||
implementation(libs.ktor.client.js)
|
implementation(libs.ktor.client.js)
|
||||||
implementation(libs.kotlinx.coroutines.core)
|
implementation(libs.kotlinx.coroutines.core)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
commonTest.dependencies {
|
||||||
|
implementation(libs.kotlin.test)
|
||||||
|
implementation(libs.kotlinx.coroutines.test)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
package at.mocode.frontend.core.network.sync
|
||||||
|
|
||||||
|
import kotlinx.coroutines.test.runTest
|
||||||
|
import kotlin.test.Test
|
||||||
|
|
||||||
|
class JvmP2pSyncServiceTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun starting_server_twice_on_same_port_should_not_fail_but_use_guard() = runTest {
|
||||||
|
val service1 = JvmP2pSyncService()
|
||||||
|
val service2 = JvmP2pSyncService()
|
||||||
|
val port = 9091
|
||||||
|
|
||||||
|
try {
|
||||||
|
service1.startServer(port)
|
||||||
|
// Second start should just return/log and not throw an exception (idempotent)
|
||||||
|
service2.startServer(port)
|
||||||
|
} finally {
|
||||||
|
service1.stopServer()
|
||||||
|
service2.stopServer()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun stopping_server_should_release_port_lock() = runTest {
|
||||||
|
val service1 = JvmP2pSyncService()
|
||||||
|
val service2 = JvmP2pSyncService()
|
||||||
|
val port = 9092
|
||||||
|
|
||||||
|
service1.startServer(port)
|
||||||
|
service1.stopServer()
|
||||||
|
|
||||||
|
// After stopping, starting again on same port (even from different instance) should work
|
||||||
|
service2.startServer(port)
|
||||||
|
service2.stopServer()
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user