From 6135f9152fd4008d8094c306cf9a4e16fdb659af Mon Sep 17 00:00:00 2001 From: Nico Alt Date: Wed, 8 Apr 2020 12:00:00 +0000 Subject: [PATCH 1/2] Include last private chat activity in list of contacts Fixes #1722. --- briar-headless/README.md | 3 ++- .../briar/headless/contact/ContactControllerImpl.kt | 4 +++- .../briar/headless/contact/OutputContact.kt | 9 +++++++-- .../org/briarproject/briar/headless/ControllerTest.kt | 2 ++ .../briar/headless/contact/ContactControllerTest.kt | 11 +++++++---- .../headless/messaging/MessagingControllerImplTest.kt | 1 - 6 files changed, 21 insertions(+), 9 deletions(-) diff --git a/briar-headless/README.md b/briar-headless/README.md index 793e11036..8dd09ac35 100644 --- a/briar-headless/README.md +++ b/briar-headless/README.md @@ -67,7 +67,8 @@ Returns a JSON array of contacts: "contactId": 1, "alias" : "A local nickname", "handshakePublicKey": "XnYRd7a7E4CTqgAvh4hCxh/YZ0EPscxknB9ZcEOpSzY=", - "verified": true + "verified": true, + "lastChatActivity": 1557838312175 } ``` diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/contact/ContactControllerImpl.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/contact/ContactControllerImpl.kt index ee4d21e98..d925ed34a 100644 --- a/briar-headless/src/main/java/org/briarproject/briar/headless/contact/ContactControllerImpl.kt +++ b/briar-headless/src/main/java/org/briarproject/briar/headless/contact/ContactControllerImpl.kt @@ -17,6 +17,7 @@ import org.briarproject.bramble.api.event.Event import org.briarproject.bramble.api.event.EventListener import org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH import org.briarproject.bramble.util.StringUtils.toUtf8 +import org.briarproject.briar.api.conversation.ConversationManager import org.briarproject.briar.headless.event.WebSocketController import org.briarproject.briar.headless.getContactIdFromPathParam import org.briarproject.briar.headless.getFromJson @@ -38,6 +39,7 @@ internal class ContactControllerImpl @Inject constructor( private val contactManager: ContactManager, + private val conversationManager: ConversationManager, private val objectMapper: ObjectMapper, private val webSocket: WebSocketController ) : ContactController, EventListener { @@ -61,7 +63,7 @@ constructor( override fun list(ctx: Context): Context { val contacts = contactManager.contacts.map { contact -> - contact.output() + contact.output(conversationManager) } return ctx.json(contacts) } diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/contact/OutputContact.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/contact/OutputContact.kt index 444950fe9..7b09aa3b1 100644 --- a/briar-headless/src/main/java/org/briarproject/briar/headless/contact/OutputContact.kt +++ b/briar-headless/src/main/java/org/briarproject/briar/headless/contact/OutputContact.kt @@ -3,17 +3,22 @@ package org.briarproject.briar.headless.contact import org.briarproject.bramble.api.contact.Contact import org.briarproject.bramble.api.contact.event.ContactAddedEvent import org.briarproject.bramble.identity.output +import org.briarproject.briar.api.conversation.ConversationManager import org.briarproject.briar.headless.json.JsonDict -internal fun Contact.output() = JsonDict( +internal fun Contact.output(conversationManager: ConversationManager) = JsonDict( "contactId" to id.int, "author" to author.output(), - "verified" to isVerified + "verified" to isVerified, + "lastChatActivity" to this.getLastChatActivity(conversationManager) ).apply { alias?.let { put("alias", it) } handshakePublicKey?.let { put("handshakePublicKey", it.encoded) } } +internal fun Contact.getLastChatActivity(conversationManager: ConversationManager) = + conversationManager.getGroupCount(this.id).latestMsgTime + internal fun ContactAddedEvent.output() = JsonDict( "contactId" to contactId.int, "verified" to isVerified diff --git a/briar-headless/src/test/java/org/briarproject/briar/headless/ControllerTest.kt b/briar-headless/src/test/java/org/briarproject/briar/headless/ControllerTest.kt index a512d228e..c73f45272 100644 --- a/briar-headless/src/test/java/org/briarproject/briar/headless/ControllerTest.kt +++ b/briar-headless/src/test/java/org/briarproject/briar/headless/ControllerTest.kt @@ -14,6 +14,7 @@ import org.briarproject.bramble.api.sync.Message import org.briarproject.bramble.api.system.Clock import org.briarproject.bramble.test.TestUtils.* import org.briarproject.bramble.util.StringUtils.getRandomString +import org.briarproject.briar.api.conversation.ConversationManager import org.briarproject.briar.headless.event.WebSocketController import org.skyscreamer.jsonassert.JSONAssert.assertEquals import org.skyscreamer.jsonassert.JSONCompareMode.STRICT @@ -23,6 +24,7 @@ import javax.servlet.http.HttpServletResponse abstract class ControllerTest { protected val contactManager = mockk() + protected val conversationManager = mockk() protected val identityManager = mockk() protected val clock = mockk() protected val ctx = mockk() diff --git a/briar-headless/src/test/java/org/briarproject/briar/headless/contact/ContactControllerTest.kt b/briar-headless/src/test/java/org/briarproject/briar/headless/contact/ContactControllerTest.kt index 4ca48ad44..d28d9078c 100644 --- a/briar-headless/src/test/java/org/briarproject/briar/headless/contact/ContactControllerTest.kt +++ b/briar-headless/src/test/java/org/briarproject/briar/headless/contact/ContactControllerTest.kt @@ -35,7 +35,7 @@ internal class ContactControllerTest : ControllerTest() { private val pendingContact = getPendingContact() private val controller = - ContactControllerImpl(contactManager, objectMapper, webSocketController) + ContactControllerImpl(contactManager, conversationManager, objectMapper, webSocketController) @Test fun testEmptyContactList() { @@ -47,7 +47,8 @@ internal class ContactControllerTest : ControllerTest() { @Test fun testList() { every { contactManager.contacts } returns listOf(contact) - every { ctx.json(listOf(contact.output())) } returns ctx + every { conversationManager.getGroupCount(contact.id).latestMsgTime } returns timestamp + every { ctx.json(listOf(contact.output(conversationManager))) } returns ctx controller.list(ctx) } @@ -264,6 +265,7 @@ internal class ContactControllerTest : ControllerTest() { @Test fun testOutputContact() { + every { conversationManager.getGroupCount(contact.id).latestMsgTime } returns timestamp assertNotNull(contact.handshakePublicKey) val json = """ { @@ -271,10 +273,11 @@ internal class ContactControllerTest : ControllerTest() { "author": ${toJson(author.output())}, "alias" : "${contact.alias}", "handshakePublicKey": ${toJson(contact.handshakePublicKey!!.encoded)}, - "verified": ${contact.isVerified} + "verified": ${contact.isVerified}, + "lastChatActivity": ${timestamp} } """ - assertJsonEquals(json, contact.output()) + assertJsonEquals(json, contact.output(conversationManager)) } @Test diff --git a/briar-headless/src/test/java/org/briarproject/briar/headless/messaging/MessagingControllerImplTest.kt b/briar-headless/src/test/java/org/briarproject/briar/headless/messaging/MessagingControllerImplTest.kt index 1f1edced6..4968f9849 100644 --- a/briar-headless/src/test/java/org/briarproject/briar/headless/messaging/MessagingControllerImplTest.kt +++ b/briar-headless/src/test/java/org/briarproject/briar/headless/messaging/MessagingControllerImplTest.kt @@ -32,7 +32,6 @@ import org.junit.jupiter.api.Test internal class MessagingControllerImplTest : ControllerTest() { private val messagingManager = mockk() - private val conversationManager = mockk() private val privateMessageFactory = mockk() private val dbExecutor = ImmediateExecutor() From f61e2b399e42f476cabc3c55ee924e1a377ba053 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 20 Apr 2020 09:15:56 -0300 Subject: [PATCH 2/2] [headless] Fix unit tests by passing only timestamp into OutputContact --- .../headless/contact/ContactControllerImpl.kt | 3 ++- .../briar/headless/contact/OutputContact.kt | 7 ++----- .../headless/contact/ContactControllerTest.kt | 15 +++++++++------ 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/contact/ContactControllerImpl.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/contact/ContactControllerImpl.kt index d925ed34a..70f7f6cb6 100644 --- a/briar-headless/src/main/java/org/briarproject/briar/headless/contact/ContactControllerImpl.kt +++ b/briar-headless/src/main/java/org/briarproject/briar/headless/contact/ContactControllerImpl.kt @@ -63,7 +63,8 @@ constructor( override fun list(ctx: Context): Context { val contacts = contactManager.contacts.map { contact -> - contact.output(conversationManager) + val latestMsgTime = conversationManager.getGroupCount(contact.id).latestMsgTime + contact.output(latestMsgTime) } return ctx.json(contacts) } diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/contact/OutputContact.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/contact/OutputContact.kt index 7b09aa3b1..9954edfda 100644 --- a/briar-headless/src/main/java/org/briarproject/briar/headless/contact/OutputContact.kt +++ b/briar-headless/src/main/java/org/briarproject/briar/headless/contact/OutputContact.kt @@ -6,19 +6,16 @@ import org.briarproject.bramble.identity.output import org.briarproject.briar.api.conversation.ConversationManager import org.briarproject.briar.headless.json.JsonDict -internal fun Contact.output(conversationManager: ConversationManager) = JsonDict( +internal fun Contact.output(latestMsgTime: Long) = JsonDict( "contactId" to id.int, "author" to author.output(), "verified" to isVerified, - "lastChatActivity" to this.getLastChatActivity(conversationManager) + "lastChatActivity" to latestMsgTime ).apply { alias?.let { put("alias", it) } handshakePublicKey?.let { put("handshakePublicKey", it.encoded) } } -internal fun Contact.getLastChatActivity(conversationManager: ConversationManager) = - conversationManager.getGroupCount(this.id).latestMsgTime - internal fun ContactAddedEvent.output() = JsonDict( "contactId" to contactId.int, "verified" to isVerified diff --git a/briar-headless/src/test/java/org/briarproject/briar/headless/contact/ContactControllerTest.kt b/briar-headless/src/test/java/org/briarproject/briar/headless/contact/ContactControllerTest.kt index d28d9078c..3f3220d18 100644 --- a/briar-headless/src/test/java/org/briarproject/briar/headless/contact/ContactControllerTest.kt +++ b/briar-headless/src/test/java/org/briarproject/briar/headless/contact/ContactControllerTest.kt @@ -34,8 +34,12 @@ internal class ContactControllerTest : ControllerTest() { private val pendingContact = getPendingContact() - private val controller = - ContactControllerImpl(contactManager, conversationManager, objectMapper, webSocketController) + private val controller = ContactControllerImpl( + contactManager, + conversationManager, + objectMapper, + webSocketController + ) @Test fun testEmptyContactList() { @@ -48,7 +52,7 @@ internal class ContactControllerTest : ControllerTest() { fun testList() { every { contactManager.contacts } returns listOf(contact) every { conversationManager.getGroupCount(contact.id).latestMsgTime } returns timestamp - every { ctx.json(listOf(contact.output(conversationManager))) } returns ctx + every { ctx.json(listOf(contact.output(timestamp))) } returns ctx controller.list(ctx) } @@ -265,7 +269,6 @@ internal class ContactControllerTest : ControllerTest() { @Test fun testOutputContact() { - every { conversationManager.getGroupCount(contact.id).latestMsgTime } returns timestamp assertNotNull(contact.handshakePublicKey) val json = """ { @@ -274,10 +277,10 @@ internal class ContactControllerTest : ControllerTest() { "alias" : "${contact.alias}", "handshakePublicKey": ${toJson(contact.handshakePublicKey!!.encoded)}, "verified": ${contact.isVerified}, - "lastChatActivity": ${timestamp} + "lastChatActivity": $timestamp } """ - assertJsonEquals(json, contact.output(conversationManager)) + assertJsonEquals(json, contact.output(timestamp)) } @Test