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 <atou...@users.noreply.github.com> 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: commits-unsubscr...@tuweni.apache.org For additional commands, e-mail: commits-h...@tuweni.apache.org