This is an automated email from the ASF dual-hosted git repository.
toulmean pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-tuweni.git
The following commit(s) were added to refs/heads/master by this push:
new 9c0e5bb Gossip coverage (#101)
9c0e5bb is described below
commit 9c0e5bb85bee66c879150078f90e9c20cf08eeca
Author: Antoine Toulme <[email protected]>
AuthorDate: Sat Jun 27 11:06:00 2020 -0700
Gossip coverage (#101)
---
gossip/build.gradle | 2 +
.../java/org/apache/tuweni/gossip/GossipApp.java | 46 ++++++------
.../tuweni/gossip/LoggingPeerRepository.java | 21 +++---
gossip/src/main/resources/logback.xml | 27 +++++++
.../tuweni/gossip/LoggingPeerRepositoryTest.java | 86 ++++++++++++++++++++++
5 files changed, 149 insertions(+), 33 deletions(-)
diff --git a/gossip/build.gradle b/gossip/build.gradle
index daae430..4253826 100644
--- a/gossip/build.gradle
+++ b/gossip/build.gradle
@@ -26,6 +26,8 @@ dependencies {
compile project(':config')
compile project(':plumtree')
+ runtime 'ch.qos.logback:logback-classic'
+
testCompile project(':bytes')
testCompile project(':junit')
testCompile 'org.junit.jupiter:junit-jupiter-api'
diff --git a/gossip/src/main/java/org/apache/tuweni/gossip/GossipApp.java
b/gossip/src/main/java/org/apache/tuweni/gossip/GossipApp.java
index 6c04142..4cfae4b 100644
--- a/gossip/src/main/java/org/apache/tuweni/gossip/GossipApp.java
+++ b/gossip/src/main/java/org/apache/tuweni/gossip/GossipApp.java
@@ -32,7 +32,6 @@ import java.util.Collections;
import java.util.concurrent.CompletionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@@ -43,6 +42,8 @@ import io.vertx.core.http.HttpMethod;
import io.vertx.core.http.HttpServer;
import io.vertx.core.http.HttpServerRequest;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import picocli.CommandLine;
/**
@@ -51,13 +52,15 @@ import picocli.CommandLine;
*/
public final class GossipApp {
+ private static final Logger logger =
LoggerFactory.getLogger(GossipApp.class.getName());
+
public static void main(String[] args) {
Security.addProvider(new BouncyCastleProvider());
GossipCommandLineOptions opts = CommandLine.populateCommand(new
GossipCommandLineOptions(), args);
try {
opts.validate();
} catch (IllegalArgumentException e) {
- System.err.println("Invalid configuration detected.\n\n" +
e.getMessage());
+ logger.error("Invalid configuration detected.\n\n{}", e.getMessage());
new CommandLine(opts).usage(System.out);
System.exit(1);
}
@@ -70,13 +73,10 @@ public final class GossipApp {
gossipApp.start();
}
- private final ExecutorService senderThreadPool =
Executors.newSingleThreadExecutor(new ThreadFactory() {
- @Override
- public Thread newThread(Runnable r) {
- Thread t = new Thread(r, "sender");
- t.setDaemon(false);
- return t;
- }
+ private final ExecutorService senderThreadPool =
Executors.newSingleThreadExecutor(r -> {
+ Thread t = new Thread(r, "sender");
+ t.setDaemon(false);
+ return t;
});
private final GossipCommandLineOptions opts;
private final Runnable terminateFunction;
@@ -92,8 +92,8 @@ public final class GossipApp {
PrintStream errStream,
PrintStream outStream,
Runnable terminateFunction) {
- LoggingPeerRepository repository = new LoggingPeerRepository(outStream);
- outStream.println("Setting up server on " + opts.networkInterface() + ":"
+ opts.listenPort());
+ LoggingPeerRepository repository = new LoggingPeerRepository();
+ logger.info("Setting up server on {}:{}", opts.networkInterface(),
opts.listenPort());
server = new VertxGossipServer(
vertx,
opts.networkInterface(),
@@ -113,15 +113,15 @@ public final class GossipApp {
}
void start() {
- outStream.println("Starting gossip");
+ logger.info("Starting gossip");
AsyncCompletion completion = server.start();
try {
completion.join();
} catch (CompletionException | InterruptedException e) {
- errStream.println("Server could not start: " + e.getMessage());
+ logger.error("Server could not start: {}", e.getMessage());
terminateFunction.run();
}
- outStream.println("TCP server started");
+ logger.info("TCP server started");
CompletableAsyncCompletion rpcCompletion = AsyncCompletion.incomplete();
rpcServer.requestHandler(this::handleRPCRequest).listen(opts.rpcPort(),
opts.networkInterface(), res -> {
@@ -134,10 +134,10 @@ public final class GossipApp {
try {
rpcCompletion.join();
} catch (CompletionException | InterruptedException e) {
- errStream.println("RPC server could not start: " + e.getMessage());
+ logger.error("RPC server could not start: " + e.getMessage());
terminateFunction.run();
}
- outStream.println("RPC server started");
+ logger.info("RPC server started");
try {
AsyncCompletion
@@ -146,10 +146,10 @@ public final class GossipApp {
} catch (TimeoutException | InterruptedException e) {
errStream.println("Server could not connect to other peers: " +
e.getMessage());
}
- outStream.println("Gossip started");
+ logger.info("Gossip started");
if (opts.sending()) {
- outStream.println("Start sending messages");
+ logger.info("Start sending messages");
senderThreadPool.submit(() -> {
for (int i = 0; i < opts.numberOfMessages(); i++) {
if (Thread.currentThread().isInterrupted()) {
@@ -185,13 +185,13 @@ public final class GossipApp {
}
void stop() {
- outStream.println("Stopping sending");
+ logger.info("Stopping sending");
senderThreadPool.shutdown();
- outStream.println("Stopping gossip");
+ logger.info("Stopping gossip");
try {
server.stop().join();
} catch (InterruptedException e) {
- errStream.println("Server could not stop: " + e.getMessage());
+ logger.error("Server could not stop: {}", e.getMessage());
terminateFunction.run();
}
@@ -206,8 +206,8 @@ public final class GossipApp {
try {
rpcCompletion.join();
} catch (CompletionException | InterruptedException e) {
- outStream.println("Stopped gossip");
- errStream.println("RPC server could not stop: " + e.getMessage());
+ logger.info("Stopped gossip");
+ logger.error("RPC server could not stop: {}", e.getMessage());
terminateFunction.run();
}
diff --git
a/gossip/src/main/java/org/apache/tuweni/gossip/LoggingPeerRepository.java
b/gossip/src/main/java/org/apache/tuweni/gossip/LoggingPeerRepository.java
index ad0a450..8e5f56e 100644
--- a/gossip/src/main/java/org/apache/tuweni/gossip/LoggingPeerRepository.java
+++ b/gossip/src/main/java/org/apache/tuweni/gossip/LoggingPeerRepository.java
@@ -15,22 +15,23 @@ package org.apache.tuweni.gossip;
import org.apache.tuweni.plumtree.Peer;
import org.apache.tuweni.plumtree.PeerRepository;
-import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import javax.annotation.ParametersAreNonnullByDefault;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@ParametersAreNonnullByDefault
final class LoggingPeerRepository implements PeerRepository {
+ private static final Logger logger =
LoggerFactory.getLogger(LoggingPeerRepository.class.getName());
+
private final Set<Peer> eagerPushPeers = ConcurrentHashMap.newKeySet();
private final Set<Peer> lazyPushPeers = ConcurrentHashMap.newKeySet();
- private final PrintStream logger;
-
- public LoggingPeerRepository(PrintStream logger) {
- this.logger = logger;
- }
@Override
public void addEager(Peer peer) {
@@ -56,14 +57,14 @@ final class LoggingPeerRepository implements PeerRepository
{
@Override
public void removePeer(Peer peer) {
- logger.println("Removing peer " + peer);
+ logger.info("Removing peer {}", peer);
lazyPushPeers.remove(peer);
eagerPushPeers.remove(peer);
}
@Override
public boolean moveToLazy(Peer peer) {
- logger.println("Move peer to lazy " + peer);
+ logger.info("Move peer to lazy {}", peer);
eagerPushPeers.remove(peer);
lazyPushPeers.add(peer);
return true;
@@ -71,7 +72,7 @@ final class LoggingPeerRepository implements PeerRepository {
@Override
public void moveToEager(Peer peer) {
- logger.println("Move peer to eager " + peer);
+ logger.info("Move peer to eager {}", peer);
lazyPushPeers.remove(peer);
eagerPushPeers.add(peer);
}
@@ -80,7 +81,7 @@ final class LoggingPeerRepository implements PeerRepository {
public void considerNewPeer(Peer peer) {
if (!lazyPushPeers.contains(peer)) {
if (eagerPushPeers.add(peer)) {
- logger.println("Added new peer " + peer);
+ logger.info("Added new peer {}", peer);
}
}
diff --git a/gossip/src/main/resources/logback.xml
b/gossip/src/main/resources/logback.xml
new file mode 100644
index 0000000..cb63fd5
--- /dev/null
+++ b/gossip/src/main/resources/logback.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE
+ file distributed with this work for additional information regarding
copyright ownership. The ASF licenses this file
+ to You under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the
+ License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
express or implied. See the License for the
+ specific language governing permissions and limitations under the License.
+-->
+<configuration>
+
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <!-- encoders are assigned the type
+ ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
+ <encoder>
+ <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -
%msg%n</pattern>
+ </encoder>
+ </appender>
+
+ <root level="info">
+ <appender-ref ref="STDOUT" />
+ </root>
+</configuration>
\ No newline at end of file
diff --git
a/gossip/src/test/java/org/apache/tuweni/gossip/LoggingPeerRepositoryTest.java
b/gossip/src/test/java/org/apache/tuweni/gossip/LoggingPeerRepositoryTest.java
new file mode 100644
index 0000000..3bbce1d
--- /dev/null
+++
b/gossip/src/test/java/org/apache/tuweni/gossip/LoggingPeerRepositoryTest.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE
+ * file distributed with this work for additional information regarding
copyright ownership. The ASF licenses this file
+ * to You under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package org.apache.tuweni.gossip;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.tuweni.plumtree.Peer;
+
+import org.junit.jupiter.api.Test;
+
+class LoggingPeerRepositoryTest {
+
+ private static final Peer FOO = new Peer() {};
+ private static final Peer BAR = new Peer() {};
+
+ @Test
+ void testAddEagerPeer() {
+ LoggingPeerRepository repo = new LoggingPeerRepository();
+ assertTrue(repo.eagerPushPeers().isEmpty());
+ repo.addEager(FOO);
+ assertEquals(FOO, repo.eagerPushPeers().iterator().next());
+ }
+
+ @Test
+ void testAddLazyPeer() {
+ LoggingPeerRepository repo = new LoggingPeerRepository();
+ assertTrue(repo.lazyPushPeers().isEmpty());
+ repo.addEager(FOO);
+ repo.moveToLazy(FOO);
+ assertEquals(FOO, repo.lazyPushPeers().iterator().next());
+ }
+
+ @Test
+ void testAddEagerLazyEager() {
+ LoggingPeerRepository repo = new LoggingPeerRepository();
+ assertTrue(repo.lazyPushPeers().isEmpty());
+ repo.addEager(FOO);
+ repo.moveToLazy(FOO);
+ repo.moveToEager(FOO);
+ assertEquals(FOO, repo.eagerPushPeers().iterator().next());
+ }
+
+ @Test
+ void testRemove() {
+ LoggingPeerRepository repo = new LoggingPeerRepository();
+ assertTrue(repo.lazyPushPeers().isEmpty());
+ repo.addEager(FOO);
+ repo.removePeer(FOO);
+ assertTrue(repo.eagerPushPeers().isEmpty());
+ assertTrue(repo.lazyPushPeers().isEmpty());
+ }
+
+ @Test
+ void testRemoveLazy() {
+ LoggingPeerRepository repo = new LoggingPeerRepository();
+ assertTrue(repo.lazyPushPeers().isEmpty());
+ repo.addEager(FOO);
+ repo.moveToLazy(FOO);
+ repo.removePeer(FOO);
+ assertTrue(repo.eagerPushPeers().isEmpty());
+ assertTrue(repo.lazyPushPeers().isEmpty());
+ }
+
+ @Test
+ void testConsiderPeer() {
+ LoggingPeerRepository repo = new LoggingPeerRepository();
+ assertTrue(repo.lazyPushPeers().isEmpty());
+ repo.considerNewPeer(FOO);
+ assertEquals(FOO, repo.eagerPushPeers().iterator().next());
+ repo.moveToLazy(FOO);
+ repo.considerNewPeer(FOO);
+ assertTrue(repo.eagerPushPeers().isEmpty());
+ assertEquals(FOO, repo.lazyPushPeers().iterator().next());
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]