From f8a36d310fcaebb231c996b7ea213268a7f23c8e Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Thu, 26 Jul 2018 00:53:21 +0100 Subject: [PATCH] more tests and fixes --- .../connection/ConnectionEstablisher.groovy | 8 +- .../ConnectionEstablisherTest.groovy | 192 ++++++++++++++++++ 2 files changed, 196 insertions(+), 4 deletions(-) diff --git a/core/src/main/groovy/com/muwire/core/connection/ConnectionEstablisher.groovy b/core/src/main/groovy/com/muwire/core/connection/ConnectionEstablisher.groovy index d5b020fb..e5edd97c 100644 --- a/core/src/main/groovy/com/muwire/core/connection/ConnectionEstablisher.groovy +++ b/core/src/main/groovy/com/muwire/core/connection/ConnectionEstablisher.groovy @@ -101,8 +101,8 @@ class ConnectionEstablisher { return } switch(read) { - case 'O': readK(endpoint); break - case 'R': readEJECT(endpoint); break + case (byte)'O': readK(endpoint); break + case (byte)'R': readEJECT(endpoint); break default : log.warning("unknown response $read") fail endpoint @@ -156,7 +156,7 @@ class ConnectionEstablisher { byte[] payload = new byte[payloadSize] dais.readFully(payload) - JsonSlurper json = new JsonSlurper() + def json = new JsonSlurper() json = json.parse(payload) if (json.tryHosts == null) { @@ -172,7 +172,7 @@ class ConnectionEstablisher { log.log(Level.WARNING,"Problem parsing post-rejection payload",ignore) } finally { // the end - e.closeQuietly() + e.close() } } } diff --git a/core/src/test/groovy/com/muwire/core/connection/ConnectionEstablisherTest.groovy b/core/src/test/groovy/com/muwire/core/connection/ConnectionEstablisherTest.groovy index d22b5041..9403ac40 100644 --- a/core/src/test/groovy/com/muwire/core/connection/ConnectionEstablisherTest.groovy +++ b/core/src/test/groovy/com/muwire/core/connection/ConnectionEstablisherTest.groovy @@ -10,7 +10,9 @@ import com.muwire.core.Destinations import com.muwire.core.EventBus import com.muwire.core.MuWireSettings import com.muwire.core.hostcache.HostCache +import com.muwire.core.hostcache.HostDiscoveredEvent +import groovy.json.JsonOutput import groovy.mock.interceptor.MockFor class ConnectionEstablisherTest { @@ -18,6 +20,9 @@ class ConnectionEstablisherTest { EventBus eventBus final Destinations destinations = new Destinations() List connectionEvents + List discoveredEvents + DataInputStream inputStream + DataOutputStream outputStream def i2pConnectorMock I2PConnector i2pConnector @@ -36,13 +41,18 @@ class ConnectionEstablisherTest { @Before void before() { connectionEvents = new CopyOnWriteArrayList() + discoveredEvents = new CopyOnWriteArrayList() def listener = new Object() { void onConnectionEvent(ConnectionEvent e) { connectionEvents.add(e) } + void onHostDiscoveredEvent(HostDiscoveredEvent e) { + discoveredEvents.add e + } } eventBus = new EventBus() eventBus.register(ConnectionEvent.class, listener) + eventBus.register(HostDiscoveredEvent.class, listener) i2pConnectorMock = new MockFor(I2PConnector.class) connectionManagerMock = new MockFor(ConnectionManager.class) hostCacheMock = new MockFor(HostCache.class) @@ -54,6 +64,7 @@ class ConnectionEstablisherTest { i2pConnectorMock.verify i2pConnector connectionManagerMock.verify connectionManager hostCacheMock.verify hostCache + Thread.sleep(100) } private void initMocks() { @@ -68,6 +79,7 @@ class ConnectionEstablisherTest { @Test void testConnectFails() { + settings = new MuWireSettings() connectionManagerMock.ignore.needsConnections { true } @@ -92,4 +104,184 @@ class ConnectionEstablisherTest { assert event.incoming == false assert event.status == ConnectionAttemptStatus.FAILED } + + @Test + void testConnectionSucceedsPeer() { + settings = new MuWireSettings() { + boolean isLeaf() {false} + } + connectionManagerMock.ignore.needsConnections { + true + } + hostCacheMock.ignore.getHosts { num -> + assert num == 1 + [destinations.dest1] + } + connectionManagerMock.ignore.isConnected { dest -> + assert dest == destinations.dest1 + false + } + i2pConnectorMock.demand.connect { dest -> + PipedOutputStream os = new PipedOutputStream() + inputStream = new DataInputStream(new PipedInputStream(os)) + PipedInputStream is = new PipedInputStream() + outputStream = new DataOutputStream(new PipedOutputStream(is)) + new Endpoint(dest, is, os) + } + + initMocks() + + byte [] header = new byte[11] + inputStream.readFully(header) + assert header == "MuWire peer".bytes + + outputStream.write("OK".bytes) + outputStream.flush() + + Thread.sleep(100) + + assert connectionEvents.size() == 1 + def event = connectionEvents[0] + assert event.endpoint.destination == destinations.dest1 + assert event.incoming == false + assert event.status == ConnectionAttemptStatus.SUCCESSFUL + + } + + @Test + void testConnectionSucceedsLeaf() { + settings = new MuWireSettings() { + boolean isLeaf() {true} + } + connectionManagerMock.ignore.needsConnections { + true + } + hostCacheMock.ignore.getHosts { num -> + assert num == 1 + [destinations.dest1] + } + connectionManagerMock.ignore.isConnected { dest -> + assert dest == destinations.dest1 + false + } + i2pConnectorMock.demand.connect { dest -> + PipedOutputStream os = new PipedOutputStream() + inputStream = new DataInputStream(new PipedInputStream(os)) + PipedInputStream is = new PipedInputStream() + outputStream = new DataOutputStream(new PipedOutputStream(is)) + new Endpoint(dest, is, os) + } + + initMocks() + + byte [] header = new byte[11] + inputStream.readFully(header) + assert header == "MuWire leaf".bytes + + outputStream.write("OK".bytes) + outputStream.flush() + + Thread.sleep(100) + + assert connectionEvents.size() == 1 + def event = connectionEvents[0] + assert event.endpoint.destination == destinations.dest1 + assert event.incoming == false + assert event.status == ConnectionAttemptStatus.SUCCESSFUL + } + + @Test + void testConnectionRejected() { + settings = new MuWireSettings() { + boolean isLeaf() {false} + } + connectionManagerMock.ignore.needsConnections { + true + } + hostCacheMock.ignore.getHosts { num -> + assert num == 1 + [destinations.dest1] + } + connectionManagerMock.ignore.isConnected { dest -> + assert dest == destinations.dest1 + false + } + i2pConnectorMock.demand.connect { dest -> + PipedOutputStream os = new PipedOutputStream() + inputStream = new DataInputStream(new PipedInputStream(os)) + PipedInputStream is = new PipedInputStream() + outputStream = new DataOutputStream(new PipedOutputStream(is)) + new Endpoint(dest, is, os) + } + + initMocks() + + byte [] header = new byte[11] + inputStream.readFully(header) + assert header == "MuWire peer".bytes + + outputStream.write("REJECT".bytes) + outputStream.flush() + + Thread.sleep(100) + + assert connectionEvents.size() == 1 + def event = connectionEvents[0] + assert event.endpoint.destination == destinations.dest1 + assert event.incoming == false + assert event.status == ConnectionAttemptStatus.REJECTED + assert discoveredEvents.isEmpty() + } + + @Test + void testConnectionRejectedSuggestions() { + settings = new MuWireSettings() { + boolean isLeaf() {false} + } + connectionManagerMock.ignore.needsConnections { + true + } + hostCacheMock.ignore.getHosts { num -> + assert num == 1 + [destinations.dest1] + } + connectionManagerMock.ignore.isConnected { dest -> + assert dest == destinations.dest1 + false + } + i2pConnectorMock.demand.connect { dest -> + PipedOutputStream os = new PipedOutputStream() + inputStream = new DataInputStream(new PipedInputStream(os)) + PipedInputStream is = new PipedInputStream() + outputStream = new DataOutputStream(new PipedOutputStream(is)) + new Endpoint(dest, is, os) + } + + initMocks() + + byte [] header = new byte[11] + inputStream.readFully(header) + assert header == "MuWire peer".bytes + + outputStream.write("REJECT".bytes) + outputStream.flush() + + def json = [:] + json.tryHosts = [destinations.dest2.toBase64()] + json = JsonOutput.toJson(json) + outputStream.writeShort(json.bytes.length) + outputStream.write(json.bytes) + outputStream.flush() + Thread.sleep(100) + + assert connectionEvents.size() == 1 + def event = connectionEvents[0] + assert event.endpoint.destination == destinations.dest1 + assert event.incoming == false + assert event.status == ConnectionAttemptStatus.REJECTED + + assert discoveredEvents.size() == 1 + event = discoveredEvents[0] + assert event.destination == destinations.dest2 + } }