Distinguish failed member-link snapshots from confirmed disconnection
This commit is contained in:
1 parent
a4c7899ffb
commit
05ea602a3a
2 files changed
+22
-4
No files matched your search
@@ -474,9 +474,15 @@ class ChatRepository(private val reportFailure: (String) -> Unit = { LogManager.
|
||||
|
||||
fun deleteChannel(channelId: String) = NativeLib.deleteChannel(channelId)
|
||||
|
||||
fun getMemberLinks(nodeId: Long): MemberLinks {
|
||||
fun getMemberLinks(nodeId: Long): MemberLinks? {
|
||||
return try { parseMemberLinks(NativeLib.getMemberLinks(nodeId)) }
|
||||
catch (e: Exception) { reportFailure("Member links unavailable node=$nodeId: $e"); null }
|
||||
}
|
||||
|
||||
/** null — ошибка снимка, {cn:false} либо {} — подтверждённое отсутствие соединения. */
|
||||
internal fun parseMemberLinks(json: String): MemberLinks? {
|
||||
try {
|
||||
val obj = JSONObject(NativeLib.getMemberLinks(nodeId))
|
||||
val obj = JSONObject(json)
|
||||
if (!obj.optBoolean("cn", false)) return MemberLinks()
|
||||
val links = mutableListOf<LinkStatus>()
|
||||
val arr = obj.optJSONArray("lk")
|
||||
@@ -505,8 +511,8 @@ class ChatRepository(private val reportFailure: (String) -> Unit = { LogManager.
|
||||
linksUp = obj.optInt("lu", 0),
|
||||
links = links
|
||||
)
|
||||
} catch (e: Exception) { reportFailure("Member links failed node=$nodeId: $e") }
|
||||
return MemberLinks()
|
||||
} catch (e: Exception) { reportFailure("Member links snapshot failed: $e") }
|
||||
return null
|
||||
}
|
||||
|
||||
fun parseLocalSockets(json: String): List<LocalSocketState>? {
|
||||
|
||||
+12
@@ -33,4 +33,16 @@ class ChatRepositorySnapshotTest {
|
||||
assertEquals(emptyList<LocalSocketState>(), repo.parseLocalSockets("[]"))
|
||||
assertEquals(before, repo.parseLocalSockets("[$row]"))
|
||||
}
|
||||
|
||||
@Test fun brokenLinkSnapshotDoesNotTurnAConnectedPeerIntoDisconnected() {
|
||||
val row = """{"cn":true,"in":true,"lu":1,"lk":[{"id":9,"st":3,"sn":"Wi-Fi 😀"}]}"""
|
||||
val connected = repo.parseMemberLinks(row)!!
|
||||
assertTrue(connected.connected)
|
||||
assertEquals("Wi-Fi 😀", connected.links.single().socketName)
|
||||
assertNull(repo.parseMemberLinks("""{"cn":true,"lk":[{},null]}"""))
|
||||
assertTrue(errors.single().contains("Member links snapshot failed"))
|
||||
assertEquals(MemberLinks(), repo.parseMemberLinks("{}"))
|
||||
assertEquals(MemberLinks(), repo.parseMemberLinks("""{"cn":false}"""))
|
||||
assertEquals(connected, repo.parseMemberLinks(row))
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user