diff --git a/currencyii/src/main/java/nl/tudelft/trustchain/currencyii/CoinCommunity.kt b/currencyii/src/main/java/nl/tudelft/trustchain/currencyii/CoinCommunity.kt index 7e6a43b73..de52e5917 100644 --- a/currencyii/src/main/java/nl/tudelft/trustchain/currencyii/CoinCommunity.kt +++ b/currencyii/src/main/java/nl/tudelft/trustchain/currencyii/CoinCommunity.kt @@ -11,6 +11,7 @@ import nl.tudelft.ipv8.android.IPv8Android import nl.tudelft.ipv8.attestation.trustchain.TrustChainBlock import nl.tudelft.ipv8.attestation.trustchain.TrustChainCommunity import nl.tudelft.ipv8.attestation.trustchain.TrustChainTransaction +import nl.tudelft.ipv8.keyvault.PublicKey import nl.tudelft.ipv8.messaging.Packet import nl.tudelft.ipv8.util.hexToBytes import nl.tudelft.ipv8.util.toHex @@ -38,8 +39,7 @@ import nl.tudelft.trustchain.currencyii.util.DAOTransferFundsHelper open class CoinCommunity constructor( private val context: Context, serviceId: String = "02313685c1912a141279f8248fc8db5899c5df5b", - ) : Community() { - +) : Community() { class Factory( private val context: Context, ) : Overlay.Factory(CoinCommunity::class.java) { @@ -56,9 +56,7 @@ open class CoinCommunity constructor( messageHandlers[MessageId.ELECTION_REQUEST] = ::onElectionRequestPacket messageHandlers[MessageId.ELECTED_RESPONSE] = ::onElectedResponsePacket messageHandlers[MessageId.ALIVE_RESPONSE] = ::onAliveResponsePacket - messageHandlers[MessageId.SIGNATURE_ASK] = ::onSignPayloadResponsePacket messageHandlers[MessageId.JOIN_DAO_DATA] = ::onDaoJoinDataPacket - } private fun getTrustChainCommunity(): TrustChainCommunity { @@ -282,7 +280,7 @@ open class CoinCommunity constructor( signatures: List ): ByteArray { val payload = SignPayload(dAOid, recentSWBlock, proposeBlockData, signatures) - return serializePacket(MessageId.SIGNATURE_ASK, payload) + return serializePacket(MessageId.JOIN_DAO_DATA, payload) } fun onAliveResponsePacket(packet: Packet) { @@ -293,14 +291,6 @@ open class CoinCommunity constructor( this.onAliveResponse(peer, payload) } - fun onSignPayloadResponsePacket(packet: Packet) { - val (peer, payload) = - packet.getAuthPayload( - SignPayload.Deserializer - ) - this.onSignPayloadResponse(peer, payload) - } - private fun onDaoJoinDataPacket(packet: Packet) { Log.d("LEADER", "Received data from Peer wanting to join") @@ -328,7 +318,7 @@ open class CoinCommunity constructor( peer: Peer, payload: SignPayload ) { - //TODO: Implement adding to the wallet without a Context + // TODO: Implement adding to the wallet without a Context try { joinBitcoinWallet( payload.mostRecentSWBlock.transaction, @@ -344,8 +334,6 @@ open class CoinCommunity constructor( } } - - fun onAliveResponse( peer: Peer, payload: AlivePayload @@ -463,9 +451,12 @@ open class CoinCommunity constructor( Log.d("LEADER", "Leader doesn't exists.") Log.d("LEADER", "Requesting election...") val peers = this.getPeers() + val peerPK = getPeersPKInDao(publicKeyBlock) for (peer in peers) { - sendPayload(peer, this.createElectionRequest(publicKeyBlock)) - Log.d("LEADER", "Sending to peer at " + peer.address + " in " + serviceId + "...") + if (peerPK.contains(peer.publicKey.keyToBin().decodeToString())) { + sendPayload(peer, this.createElectionRequest(publicKeyBlock)) + Log.d("LEADER", "Sending to peer at " + peer.address + " in " + serviceId + "...") + } } Log.d("LEADER", "Waiting for leader...") while (!this.checkLeaderExists(publicKeyBlock)) { @@ -473,33 +464,27 @@ open class CoinCommunity constructor( } Log.d("LEADER", "Leader found.") - - val currentLeader = getCurrentLeader()[publicKeyBlock.decodeToString()]!! Log.d("LEADER", "sending dao join transaction data to leader ${currentLeader.publicKey}") - val payload = SignPayload( - getServiceIdNew().toByteArray(), - mostRecentSWBlock, - proposeBlockData, - signatures); + val payload = + SignPayload( + getServiceIdNew().toByteArray(), + mostRecentSWBlock, + proposeBlockData, + signatures + ) val packet = serializePacket(MessageId.JOIN_DAO_DATA, payload) - send(currentLeader, packet) + sendPayload(currentLeader, packet) + toastLeaderSignProposal(currentLeader.publicKey) + } + + fun toastLeaderSignProposal(publicKey: PublicKey) { Toast.makeText( context, - "Sending DAO join data to ${currentLeader.publicKey}", + "Sending DAO join data to $publicKey", Toast.LENGTH_SHORT ).show() - - sendPayload( - getCurrentLeader()[publicKeyBlock.decodeToString()]!!, - SignPayload( - getServiceIdNew().toByteArray(), - mostRecentSWBlock, - proposeBlockData, - signatures - ).serialize() - ) } fun checkLeaderExists(dAOid: ByteArray): Boolean { @@ -696,9 +681,7 @@ open class CoinCommunity constructor( const val ELECTION_REQUEST = 1 const val ELECTED_RESPONSE = 2 const val ALIVE_RESPONSE = 3 - const val SIGNATURE_ASK = 4 - const val JOIN_DAO_DATA = 5 - + const val JOIN_DAO_DATA = 4 } companion object { diff --git a/currencyii/src/main/java/nl/tudelft/trustchain/currencyii/payload/SignPayload.kt b/currencyii/src/main/java/nl/tudelft/trustchain/currencyii/payload/SignPayload.kt index 889aa5c30..efa3b7f59 100644 --- a/currencyii/src/main/java/nl/tudelft/trustchain/currencyii/payload/SignPayload.kt +++ b/currencyii/src/main/java/nl/tudelft/trustchain/currencyii/payload/SignPayload.kt @@ -20,7 +20,7 @@ class SignPayload( val signatures: List ) : Serializable { override fun serialize(): ByteArray { - val gson = GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").create(); + val gson = GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").create() val daoIdSizeBytes = serializeUShort(DAOid.size) @@ -45,8 +45,6 @@ class SignPayload( val timeStampBytes = gson.toJson(mostRecentSWBlock.timestamp).toByteArray() val timeStampSizeBytes = serializeUShort(timeStampBytes.size) - - val proposeBlockDataJson = gson.toJson(proposeBlockData) val proposeBlockDataBytes = proposeBlockDataJson.toByteArray() val proposeBlockDataSizeBytes = serializeUShort(proposeBlockDataBytes.size) @@ -70,7 +68,7 @@ class SignPayload( } companion object Deserializer : Deserializable { - val gson = GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").create(); + val gson = GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").create() override fun deserialize( buffer: ByteArray, @@ -132,9 +130,18 @@ class SignPayload( localOffset += timestampSize val date = gson.fromJson(timestamp.decodeToString(), Date::class.java) - val mostRecentSWBlock = TrustChainBlock(type.decodeToString(), rawTransaction, publicKey, deserializeUInt(sequenceNumber), - linkPublicKey, deserializeUInt(linkSequenceNumber), previousHash, signature, date) - + val mostRecentSWBlock = + TrustChainBlock( + type.decodeToString(), + rawTransaction, + publicKey, + deserializeUInt(sequenceNumber), + linkPublicKey, + deserializeUInt(linkSequenceNumber), + previousHash, + signature, + date + ) val proposeBlockDataSize = deserializeUShort(buffer, offset + localOffset) localOffset += SERIALIZED_USHORT_SIZE diff --git a/currencyii/src/test/java/nl/tudelft/trustchain/currencyii/leaderElection/LeaderElectionTest.kt b/currencyii/src/test/java/nl/tudelft/trustchain/currencyii/leaderElection/LeaderElectionTest.kt index 16f132c48..ec88574ce 100644 --- a/currencyii/src/test/java/nl/tudelft/trustchain/currencyii/leaderElection/LeaderElectionTest.kt +++ b/currencyii/src/test/java/nl/tudelft/trustchain/currencyii/leaderElection/LeaderElectionTest.kt @@ -25,13 +25,11 @@ import nl.tudelft.trustchain.currencyii.payload.SignPayload import nl.tudelft.trustchain.currencyii.sharedWallet.SWResponseSignatureBlockTD import nl.tudelft.trustchain.currencyii.sharedWallet.SWSignatureAskBlockTD import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeAll +import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import java.util.Calendar class PayloadTest { - - @Test fun alivePayloadTest() { val context = mockk() @@ -86,7 +84,6 @@ class PayloadTest { @Test fun electionPayloadSerializeTest() { - val context = mockk() val coinCommunity = CoinCommunity(context) val dAOid = "Dao_id" @@ -108,26 +105,72 @@ class PayloadTest { val daoIdBytes = dAOid.toByteArray() val signatures = listOf(sig1, sig2, sig3) - val trustChainBlock = TrustChainBlock("type", "rawTransaction".toByteArray(), "publicKey".toByteArray(), 42U, "linkPublicKey".toByteArray(), - 12U, "previousHash".toByteArray(), "signature".toByteArray(), Calendar.getInstance().time) - val proposeBlockData = SWSignatureAskBlockTD("SW_UNIQUE_ID", "SW_UNIQUE_PROPOSAL_ID", - "SW_TRANSACTION_SERIALIZED", "SW_PREVIOUS_BLOCK_HASH", 5, "SW_RECEIVER_PK") + val trustChainBlock = + TrustChainBlock( + "type", + "rawTransaction".toByteArray(), + "publicKey".toByteArray(), + 42U, + "linkPublicKey".toByteArray(), + 12U, + "previousHash".toByteArray(), + "signature".toByteArray(), + Calendar.getInstance().time + ) + val proposeBlockData = + SWSignatureAskBlockTD( + "SW_UNIQUE_ID", + "SW_UNIQUE_PROPOSAL_ID", + "SW_TRANSACTION_SERIALIZED", + "SW_PREVIOUS_BLOCK_HASH", + 5, + "SW_RECEIVER_PK" + ) val payload = SignPayload(daoIdBytes, trustChainBlock, proposeBlockData, signatures) val serialized = payload.serialize() val deserialized = SignPayload.deserialize(serialized) - - assertEquals(payload.DAOid.decodeToString(), deserialized.first.DAOid.decodeToString()) - assertEquals(payload.mostRecentSWBlock.type, deserialized.first.mostRecentSWBlock.type) - assertEquals(payload.mostRecentSWBlock.rawTransaction.decodeToString(), deserialized.first.mostRecentSWBlock.rawTransaction.decodeToString()) - assertEquals(payload.mostRecentSWBlock.publicKey.decodeToString(), deserialized.first.mostRecentSWBlock.publicKey.decodeToString()) - assertEquals(payload.mostRecentSWBlock.sequenceNumber, deserialized.first.mostRecentSWBlock.sequenceNumber) - assertEquals(payload.mostRecentSWBlock.linkPublicKey.decodeToString(), deserialized.first.mostRecentSWBlock.linkPublicKey.decodeToString()) - assertEquals(payload.mostRecentSWBlock.linkSequenceNumber, deserialized.first.mostRecentSWBlock.linkSequenceNumber) - assertEquals(payload.mostRecentSWBlock.previousHash.decodeToString(), deserialized.first.mostRecentSWBlock.previousHash.decodeToString()) - assertEquals(payload.mostRecentSWBlock.signature.decodeToString(), deserialized.first.mostRecentSWBlock.signature.decodeToString()) - assertEquals(payload.mostRecentSWBlock.timestamp.time, deserialized.first.mostRecentSWBlock.timestamp.time) + assertEquals( + payload.DAOid.decodeToString(), + deserialized.first.DAOid.decodeToString() + ) + assertEquals( + payload.mostRecentSWBlock.type, + deserialized.first.mostRecentSWBlock.type + ) + assertEquals( + payload.mostRecentSWBlock.rawTransaction.decodeToString(), + deserialized.first.mostRecentSWBlock.rawTransaction.decodeToString() + ) + assertEquals( + payload.mostRecentSWBlock.publicKey.decodeToString(), + deserialized.first.mostRecentSWBlock.publicKey.decodeToString() + ) + assertEquals( + payload.mostRecentSWBlock.sequenceNumber, + deserialized.first.mostRecentSWBlock.sequenceNumber + ) + assertEquals( + payload.mostRecentSWBlock.linkPublicKey.decodeToString(), + deserialized.first.mostRecentSWBlock.linkPublicKey.decodeToString() + ) + assertEquals( + payload.mostRecentSWBlock.linkSequenceNumber, + deserialized.first.mostRecentSWBlock.linkSequenceNumber + ) + assertEquals( + payload.mostRecentSWBlock.previousHash.decodeToString(), + deserialized.first.mostRecentSWBlock.previousHash.decodeToString() + ) + assertEquals( + payload.mostRecentSWBlock.signature.decodeToString(), + deserialized.first.mostRecentSWBlock.signature.decodeToString() + ) + assertEquals( + payload.mostRecentSWBlock.timestamp.time, + deserialized.first.mostRecentSWBlock.timestamp.time + ) assertEquals(payload.signatures.first().SW_UNIQUE_ID, deserialized.first.signatures.first().SW_UNIQUE_ID) assertEquals(payload.signatures.first().SW_BITCOIN_PK, deserialized.first.signatures.first().SW_BITCOIN_PK) @@ -141,8 +184,6 @@ class PayloadTest { assertEquals(payload.proposeBlockData.SW_PREVIOUS_BLOCK_HASH, deserialized.first.proposeBlockData.SW_PREVIOUS_BLOCK_HASH) assertEquals(payload.proposeBlockData.SW_UNIQUE_ID, deserialized.first.proposeBlockData.SW_UNIQUE_ID) assertEquals(payload.proposeBlockData.SW_RECEIVER_PK, deserialized.first.proposeBlockData.SW_RECEIVER_PK) - - } } @@ -169,7 +210,7 @@ class LeaderElectionTest { val myPeer = Peer(key) val context = mockk() - val coinCommunity = CoinCommunity(context) + community = CoinCommunity(context) val network = Network() val endpoint = spyk(EndpointAggregator(mockk(relaxed = true), null)) val handler = mockk<(Packet) -> Unit>(relaxed = true) @@ -253,90 +294,87 @@ class LeaderElectionTest { } class OnElectionpayloadTest() { - companion object { - lateinit var community: CoinCommunity - lateinit var candidates: HashMap> - lateinit var currentLeader: HashMap - - lateinit var ipv4P1: IPv4Address - lateinit var ipv4P2: IPv4Address - lateinit var ipv4P3: IPv4Address - lateinit var ipv4P4: IPv4Address - - lateinit var key1: PublicKey - lateinit var key2: PublicKey - lateinit var key3: PublicKey - lateinit var key4: PublicKey - - lateinit var peer1: Peer - lateinit var peer2: Peer - lateinit var peer3: Peer - lateinit var peer4: Peer - val daoID: ByteArray = "x".repeat(64).toByteArray() - - @BeforeAll - @JvmStatic - fun setup() { - community = mockk(relaxed = true) - candidates = HashMap() - currentLeader = HashMap() - every { community.getCandidates() } returns candidates - every { community.getCurrentLeader() } returns currentLeader - - ipv4P1 = mockk() - ipv4P2 = mockk() - ipv4P3 = mockk() - ipv4P4 = mockk() - - peer1 = mockk() - peer2 = mockk() - peer3 = mockk() - peer4 = mockk() - - key1 = mockk() - key2 = mockk() - key3 = mockk() - key4 = mockk() - - every { ipv4P1.hashCode() } returns 1 - every { ipv4P2.hashCode() } returns 2 - every { ipv4P3.hashCode() } returns 3 - every { ipv4P4.hashCode() } returns 4 - - every { peer1.address } returns ipv4P1 - every { peer2.address } returns ipv4P2 - every { peer3.address } returns ipv4P3 - every { peer4.address } returns ipv4P4 - - every { peer1.publicKey } returns key1 - every { peer2.publicKey } returns key2 - every { peer3.publicKey } returns key3 - every { peer4.publicKey } returns key4 - - every { key1.keyToBin() } returns "1".toByteArray() - every { key2.keyToBin() } returns "2".toByteArray() - every { key3.keyToBin() } returns "3".toByteArray() - every { key4.keyToBin() } returns "4".toByteArray() - - val retPK: ArrayList = ArrayList() - retPK.add("1") - retPK.add("2") - retPK.add("3") - retPK.add("4") - - every { community.getPeersPKInDao(any()) } returns retPK - - every { - community.onElectionRequest( - any(), - any() - ) - } answers { callOriginal() } - - every { community.createAliveResponse(any()) } answers { callOriginal() } - every { community.createElectedResponse(any()) } answers { callOriginal() } - every { community.sendPayload(any(), any()) } just runs - } + lateinit var community: CoinCommunity + lateinit var candidates: HashMap> + lateinit var currentLeader: HashMap + + lateinit var ipv4P1: IPv4Address + lateinit var ipv4P2: IPv4Address + lateinit var ipv4P3: IPv4Address + lateinit var ipv4P4: IPv4Address + + lateinit var key1: PublicKey + lateinit var key2: PublicKey + lateinit var key3: PublicKey + lateinit var key4: PublicKey + + lateinit var peer1: Peer + lateinit var peer2: Peer + lateinit var peer3: Peer + lateinit var peer4: Peer + val daoID: ByteArray = "x".repeat(64).toByteArray() + + @BeforeEach + fun setup() { + community = mockk(relaxed = true) + candidates = HashMap() + currentLeader = HashMap() + every { community.getCandidates() } returns candidates + every { community.getCurrentLeader() } returns currentLeader + + ipv4P1 = mockk() + ipv4P2 = mockk() + ipv4P3 = mockk() + ipv4P4 = mockk() + + peer1 = mockk() + peer2 = mockk() + peer3 = mockk() + peer4 = mockk() + + key1 = mockk() + key2 = mockk() + key3 = mockk() + key4 = mockk() + + every { ipv4P1.hashCode() } returns 1 + every { ipv4P2.hashCode() } returns 2 + every { ipv4P3.hashCode() } returns 3 + every { ipv4P4.hashCode() } returns 4 + + every { peer1.address } returns ipv4P1 + every { peer2.address } returns ipv4P2 + every { peer3.address } returns ipv4P3 + every { peer4.address } returns ipv4P4 + + every { peer1.publicKey } returns key1 + every { peer2.publicKey } returns key2 + every { peer3.publicKey } returns key3 + every { peer4.publicKey } returns key4 + + every { key1.keyToBin() } returns "1".toByteArray() + every { key2.keyToBin() } returns "2".toByteArray() + every { key3.keyToBin() } returns "3".toByteArray() + every { key4.keyToBin() } returns "4".toByteArray() + + val retPK: ArrayList = ArrayList() + retPK.add("1") + retPK.add("2") + retPK.add("3") + retPK.add("4") + + every { community.getPeersPKInDao(any()) } returns retPK + + every { + community.onElectionRequest( + any(), + any() + ) + } answers { callOriginal() } + + every { community.createAliveResponse(any()) } answers { callOriginal() } + every { community.createElectedResponse(any()) } answers { callOriginal() } + every { community.sendPayload(any(), any()) } just runs } @Test @@ -426,107 +464,146 @@ class OnElectionpayloadTest() { } class LeaderSignProposalTests() { - companion object { - lateinit var currentLeader: HashMap - lateinit var community: CoinCommunity + lateinit var currentLeader: HashMap + lateinit var community: CoinCommunity - lateinit var mostRecentSWBlock: TrustChainBlock - lateinit var proposeBlockData: SWSignatureAskBlockTD - lateinit var signatures: List - lateinit var context: Context + lateinit var mostRecentSWBlock: TrustChainBlock + lateinit var proposeBlockData: SWSignatureAskBlockTD + lateinit var signatures: List + lateinit var context: Context - lateinit var peer1: Peer - lateinit var peer2: Peer - lateinit var peer3: Peer - lateinit var peer4: Peer + lateinit var peer1: Peer + lateinit var peer2: Peer + lateinit var peer3: Peer + lateinit var peer4: Peer - lateinit var ipv4P1: IPv4Address - lateinit var ipv4P2: IPv4Address - lateinit var ipv4P3: IPv4Address - lateinit var ipv4P4: IPv4Address + lateinit var ipv4P1: IPv4Address + lateinit var ipv4P2: IPv4Address + lateinit var ipv4P3: IPv4Address + lateinit var ipv4P4: IPv4Address - val daoID: ByteArray = "x".repeat(64).toByteArray() + lateinit var key1: PublicKey + lateinit var key2: PublicKey + lateinit var key3: PublicKey + lateinit var key4: PublicKey - val mostRecentSWBlockArray: String = "y".repeat(64) - val proposeBlockDataArray: String = "p".repeat(64) - val contextArray: String = "c".repeat(64) + lateinit var retPK: ArrayList - val electionPacket: ByteArray = "e".repeat(64).toByteArray() + val daoID: ByteArray = "x".repeat(64).toByteArray() - @BeforeAll - @JvmStatic - fun setup() { - community = mockk(relaxed = true) + val serializedPayload: ByteArray = "y".repeat(64).toByteArray() - peer1 = mockk() - peer2 = mockk() - peer3 = mockk() - peer4 = mockk() + val electionPacket: ByteArray = "e".repeat(64).toByteArray() - ipv4P1 = mockk() - ipv4P2 = mockk() - ipv4P3 = mockk() - ipv4P4 = mockk() + val signPayload: SignPayload = mockk() - every { peer1.address } returns ipv4P1 - every { peer2.address } returns ipv4P2 - every { peer3.address } returns ipv4P3 - every { peer4.address } returns ipv4P4 + @BeforeEach + fun setUp() { + community = mockk(relaxed = true) - every { ipv4P1.toString() } returns "1" - every { ipv4P2.toString() } returns "2" - every { ipv4P3.toString() } returns "3" - every { ipv4P4.toString() } returns "4" + retPK = ArrayList() - mostRecentSWBlock = mockk() - proposeBlockData = mockk() - signatures = emptyList() - context = mockk() + peer1 = mockk() + peer2 = mockk() + peer3 = mockk() + peer4 = mockk() - every { mostRecentSWBlock.toString() } returns mostRecentSWBlockArray - every { proposeBlockData.toString() } returns proposeBlockDataArray - every { context.toString() } returns contextArray + ipv4P1 = mockk() + ipv4P2 = mockk() + ipv4P3 = mockk() + ipv4P4 = mockk() - every { community.checkLeaderExists(any()) } returns true + key1 = mockk() + key2 = mockk() + key3 = mockk() + key4 = mockk() - every { community.sendPayload(any(), any()) } just runs + every { peer1.address } returns ipv4P1 + every { peer2.address } returns ipv4P2 + every { peer3.address } returns ipv4P3 + every { peer4.address } returns ipv4P4 - currentLeader = HashMap() - currentLeader[daoID.decodeToString()] = peer4 + every { peer1.publicKey } returns key1 + every { peer2.publicKey } returns key2 + every { peer3.publicKey } returns key3 + every { peer4.publicKey } returns key4 - every { community.getCurrentLeader() } returns currentLeader + every { key1.keyToBin() } returns "1".toByteArray() + every { key2.keyToBin() } returns "2".toByteArray() + every { key3.keyToBin() } returns "3".toByteArray() + every { key4.keyToBin() } returns "4".toByteArray() - every { - community.createElectionRequest( - any() - ) - } returns electionPacket + every { community.getPeersPKInDao(any()) } returns retPK - every { community.leaderSignProposal(any(), any(), any(), any()) } answers { callOriginal() } - } + mostRecentSWBlock = mockk() + proposeBlockData = mockk() + signatures = emptyList() + context = mockk() + + every { community.checkLeaderExists(any()) } returns true + + every { community.sendPayload(any(), any()) } just runs + + currentLeader = HashMap() + currentLeader[daoID.decodeToString()] = peer4 + + every { community.getCurrentLeader() } returns currentLeader + + every { + community.createElectionRequest( + any() + ) + } returns electionPacket + + every { community.serializePacket(any(), any()) } returns serializedPayload + + every { community.leaderSignProposal(any(), any(), any(), any()) } answers { callOriginal() } + + every { community.toastLeaderSignProposal(any()) } just runs } @Test fun leaderSingProposalTest() { - val payload = - SignPayload( - "02313685c1912a141279f8248fc8db5899c5df5b".toByteArray(), - mostRecentSWBlock, - proposeBlockData, - signatures - ).serialize() + retPK.add("1") + retPK.add("2") + retPK.add("3") + retPK.add("4") every { community.getPeers() } answers { listOf(peer1, peer3, peer4) } every { community.getServiceIdNew() } returns "02313685c1912a141279f8248fc8db5899c5df5b" community.leaderSignProposal(mostRecentSWBlock, proposeBlockData, signatures, daoID) - verify { community.sendPayload(peer1, electionPacket) } - verify { community.sendPayload(peer3, electionPacket) } - verify { community.sendPayload(peer4, electionPacket) } + verify(exactly = 1) { community.sendPayload(peer1, electionPacket) } + verify(exactly = 1) { community.sendPayload(peer3, electionPacket) } + verify(exactly = 1) { community.sendPayload(peer4, electionPacket) } - verify { community.sendPayload(peer4, payload) } + verify { community.sendPayload(peer4, serializedPayload) } verify { community.checkLeaderExists(daoID) } + + verify { community.toastLeaderSignProposal(key4) } + } + + @Test + fun leaderSingProposalTestNotAllInDao() { + retPK.add("1") + retPK.add("2") + retPK.add("4") + + every { community.getPeers() } answers { listOf(peer1, peer3, peer4) } + every { community.getServiceIdNew() } returns "02313685c1912a141279f8248fc8db5899c5df5b" + + community.leaderSignProposal(mostRecentSWBlock, proposeBlockData, signatures, daoID) + + verify(exactly = 1) { community.sendPayload(peer1, electionPacket) } + verify(exactly = 1) { community.sendPayload(peer4, electionPacket) } + verify(exactly = 0) { community.sendPayload(peer3, electionPacket) } + + verify { community.sendPayload(peer4, serializedPayload) } + + verify { community.checkLeaderExists(daoID) } + + verify { community.toastLeaderSignProposal(key4) } } }