From 92e5cc87efcbbbdb613f69fcf76b1ed8a7f77c9d Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Thu, 26 Jul 2018 09:38:21 +0100 Subject: [PATCH] more unit tests --- .../connection/ConnectionAcceptorTest.groovy | 235 ++++++++++++++++++ 1 file changed, 235 insertions(+) diff --git a/core/src/test/groovy/com/muwire/core/connection/ConnectionAcceptorTest.groovy b/core/src/test/groovy/com/muwire/core/connection/ConnectionAcceptorTest.groovy index 7abb0000..9cb231c3 100644 --- a/core/src/test/groovy/com/muwire/core/connection/ConnectionAcceptorTest.groovy +++ b/core/src/test/groovy/com/muwire/core/connection/ConnectionAcceptorTest.groovy @@ -1,5 +1,7 @@ package com.muwire.core.connection +import static org.junit.Assert.fail + import java.util.concurrent.CopyOnWriteArrayList import org.junit.After @@ -13,6 +15,7 @@ import com.muwire.core.hostcache.HostCache import com.muwire.core.trust.TrustLevel import com.muwire.core.trust.TrustService +import groovy.json.JsonSlurper import groovy.mock.interceptor.MockFor class ConnectionAcceptorTest { @@ -111,4 +114,236 @@ class ConnectionAcceptorTest { assert event.endpoint.destination == destinations.dest1 assert event.status == ConnectionAttemptStatus.SUCCESSFUL } + + @Test + void testSuccessfulPeer() { + settings = new MuWireSettings() { + boolean isLeaf() { + false + } + } + i2pAcceptorMock.demand.accept { + def is = new PipedInputStream() + outputStream = new PipedOutputStream(is) + def os = new PipedOutputStream() + inputStream = new PipedInputStream(os) + new Endpoint(destinations.dest1, is, os) + } + i2pAcceptorMock.demand.accept { Thread.sleep(Integer.MAX_VALUE) } + connectionManagerMock.demand.hasPeerSlots() { true } + trustServiceMock.demand.getLevel { dest -> + assert dest == destinations.dest1 + TrustLevel.TRUSTED + } + + initMocks() + + outputStream.write("MuWire peer".bytes) + byte [] OK = new byte[2] + def dis = new DataInputStream(inputStream) + dis.readFully(OK) + assert OK == "OK".bytes + + Thread.sleep(50) + assert connectionEvents.size() == 1 + def event = connectionEvents[0] + assert event.endpoint.destination == destinations.dest1 + assert event.status == ConnectionAttemptStatus.SUCCESSFUL + } + + @Test + void testLeafRejectsLeaf() { + settings = new MuWireSettings() { + boolean isLeaf() { + true + } + } + i2pAcceptorMock.demand.accept { + def is = new PipedInputStream() + outputStream = new PipedOutputStream(is) + def os = new PipedOutputStream() + inputStream = new PipedInputStream(os) + new Endpoint(destinations.dest1, is, os) + } + i2pAcceptorMock.demand.accept { Thread.sleep(Integer.MAX_VALUE) } + trustServiceMock.demand.getLevel { dest -> + assert dest == destinations.dest1 + TrustLevel.TRUSTED + } + + initMocks() + + outputStream.write("MuWire leaf".bytes) + outputStream.flush() + Thread.sleep(50) + assert inputStream.read() == -1 + + Thread.sleep(50) + assert connectionEvents.size() == 1 + def event = connectionEvents[0] + assert event.endpoint.destination == destinations.dest1 + assert event.status == ConnectionAttemptStatus.FAILED + } + + @Test + void testLeafRejectsPeer() { + settings = new MuWireSettings() { + boolean isLeaf() { + true + } + } + i2pAcceptorMock.demand.accept { + def is = new PipedInputStream() + outputStream = new PipedOutputStream(is) + def os = new PipedOutputStream() + inputStream = new PipedInputStream(os) + new Endpoint(destinations.dest1, is, os) + } + i2pAcceptorMock.demand.accept { Thread.sleep(Integer.MAX_VALUE) } + trustServiceMock.demand.getLevel { dest -> + assert dest == destinations.dest1 + TrustLevel.TRUSTED + } + + initMocks() + + outputStream.write("MuWire peer".bytes) + outputStream.flush() + Thread.sleep(50) + assert inputStream.read() == -1 + + Thread.sleep(50) + assert connectionEvents.size() == 1 + def event = connectionEvents[0] + assert event.endpoint.destination == destinations.dest1 + assert event.status == ConnectionAttemptStatus.FAILED + } + + @Test + void testPeerRejectsPeer() { + settings = new MuWireSettings() { + boolean isLeaf() { + false + } + } + i2pAcceptorMock.demand.accept { + def is = new PipedInputStream() + outputStream = new PipedOutputStream(is) + def os = new PipedOutputStream() + inputStream = new PipedInputStream(os) + new Endpoint(destinations.dest1, is, os) + } + i2pAcceptorMock.demand.accept { Thread.sleep(Integer.MAX_VALUE) } + connectionManagerMock.demand.hasPeerSlots() { false } + trustServiceMock.demand.getLevel { dest -> + assert dest == destinations.dest1 + TrustLevel.TRUSTED + } + hostCacheMock.ignore.getHosts { n -> [] } + + initMocks() + + outputStream.write("MuWire peer".bytes) + byte [] OK = new byte[6] + def dis = new DataInputStream(inputStream) + dis.readFully(OK) + assert OK == "REJECT".bytes + + Thread.sleep(50) + assert dis.read() == -1 + + Thread.sleep(50) + assert connectionEvents.size() == 1 + def event = connectionEvents[0] + assert event.endpoint.destination == destinations.dest1 + assert event.status == ConnectionAttemptStatus.REJECTED + } + + @Test + void testPeerRejectsLeaf() { + settings = new MuWireSettings() { + boolean isLeaf() { + false + } + } + i2pAcceptorMock.demand.accept { + def is = new PipedInputStream() + outputStream = new PipedOutputStream(is) + def os = new PipedOutputStream() + inputStream = new PipedInputStream(os) + new Endpoint(destinations.dest1, is, os) + } + i2pAcceptorMock.demand.accept { Thread.sleep(Integer.MAX_VALUE) } + connectionManagerMock.demand.hasLeafSlots() { false } + trustServiceMock.demand.getLevel { dest -> + assert dest == destinations.dest1 + TrustLevel.TRUSTED + } + hostCacheMock.ignore.getHosts { n -> [] } + + initMocks() + + outputStream.write("MuWire leaf".bytes) + byte [] OK = new byte[6] + def dis = new DataInputStream(inputStream) + dis.readFully(OK) + assert OK == "REJECT".bytes + + Thread.sleep(50) + assert dis.read() == -1 + + Thread.sleep(50) + assert connectionEvents.size() == 1 + def event = connectionEvents[0] + assert event.endpoint.destination == destinations.dest1 + assert event.status == ConnectionAttemptStatus.REJECTED + } + + @Test + void testPeerRejectsPeerSuggests() { + settings = new MuWireSettings() { + boolean isLeaf() { + false + } + } + i2pAcceptorMock.demand.accept { + def is = new PipedInputStream() + outputStream = new PipedOutputStream(is) + def os = new PipedOutputStream() + inputStream = new PipedInputStream(os) + new Endpoint(destinations.dest1, is, os) + } + i2pAcceptorMock.demand.accept { Thread.sleep(Integer.MAX_VALUE) } + connectionManagerMock.demand.hasPeerSlots() { false } + trustServiceMock.demand.getLevel { dest -> + assert dest == destinations.dest1 + TrustLevel.TRUSTED + } + hostCacheMock.ignore.getHosts { n -> [destinations.dest2] } + + initMocks() + + outputStream.write("MuWire peer".bytes) + byte [] OK = new byte[6] + def dis = new DataInputStream(inputStream) + dis.readFully(OK) + assert OK == "REJECT".bytes + + short payloadSize = dis.readUnsignedShort() + byte[] payload = new byte[payloadSize] + dis.readFully(payload) + assert dis.read() == -1 + + def json = new JsonSlurper() + json = json.parse(payload) + assert json.tryHosts != null + assert json.tryHosts.size() == 1 + assert json.tryHosts.contains(destinations.dest2.toBase64()) + + Thread.sleep(50) + assert connectionEvents.size() == 1 + def event = connectionEvents[0] + assert event.endpoint.destination == destinations.dest1 + assert event.status == ConnectionAttemptStatus.REJECTED + } }