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

Reply via email to