This is an automated email from the ASF dual-hosted git repository.

ivank pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git


The following commit(s) were added to refs/heads/master by this push:
     new dca54b5  Allow construction of mock client context from scratch
dca54b5 is described below

commit dca54b531e90cb0a0d91628efedd30959ee62ecc
Author: Ivan Kelly <[email protected]>
AuthorDate: Tue Aug 28 15:42:54 2018 +0200

    Allow construction of mock client context from scratch
    
    So that ledger handle functionality can be tested without
    instantiating a BookKeeper client.
    
    Author: Ivan Kelly <[email protected]>
    
    Reviewers: Enrico Olivelli <[email protected]>, Sijie Guo 
<[email protected]>
    
    This closes #1625 from ivankelly/mock-client-context
---
 .../bookkeeper/client/MockClientContext.java       | 98 +++++++++++++++++-----
 1 file changed, 79 insertions(+), 19 deletions(-)

diff --git 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockClientContext.java
 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockClientContext.java
index 040402d..2f5b2dc 100644
--- 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockClientContext.java
+++ 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockClientContext.java
@@ -20,15 +20,27 @@
  */
 package org.apache.bookkeeper.client;
 
+import static com.google.common.base.Preconditions.checkState;
+
 import java.util.function.BooleanSupplier;
 
 import org.apache.bookkeeper.common.util.OrderedExecutor;
 import org.apache.bookkeeper.common.util.OrderedScheduler;
+import org.apache.bookkeeper.conf.ClientConfiguration;
+import org.apache.bookkeeper.discover.MockRegistrationClient;
 import org.apache.bookkeeper.meta.LedgerManager;
+import org.apache.bookkeeper.meta.MockLedgerManager;
 import org.apache.bookkeeper.proto.BookieClient;
+import org.apache.bookkeeper.proto.MockBookieClient;
+import org.apache.bookkeeper.stats.NullStatsLogger;
+import org.mockito.Mockito;
 
-class MockClientContext implements ClientContext {
-    private ClientInternalConf conf;
+/**
+ * Mock client context to allow testing client functionality with no external 
dependencies.
+ * The client context can be created with defaults, copied from another 
context or constructed from scratch.
+ */
+public class MockClientContext implements ClientContext {
+    private ClientInternalConf internalConf;
     private LedgerManager ledgerManager;
     private BookieWatcher bookieWatcher;
     private EnsemblePlacementPolicy placementPolicy;
@@ -37,6 +49,26 @@ class MockClientContext implements ClientContext {
     private OrderedScheduler scheduler;
     private BookKeeperClientStats clientStats;
     private BooleanSupplier isClientClosed;
+    private MockRegistrationClient regClient;
+
+    static MockClientContext create() {
+        ClientConfiguration conf = new ClientConfiguration();
+        OrderedScheduler scheduler = 
OrderedScheduler.newSchedulerBuilder().name("mock-executor").numThreads(1).build();
+        MockRegistrationClient regClient = new MockRegistrationClient();
+        EnsemblePlacementPolicy placementPolicy = new 
DefaultEnsemblePlacementPolicy();
+
+        return new MockClientContext()
+            .setConf(ClientInternalConf.fromConfig(conf))
+            .setLedgerManager(new MockLedgerManager())
+            .setBookieWatcher(new BookieWatcherImpl(conf, placementPolicy, 
regClient, NullStatsLogger.INSTANCE))
+            .setPlacementPolicy(placementPolicy)
+            .setRegistrationClient(regClient)
+            .setBookieClient(new MockBookieClient(scheduler))
+            .setMainWorkerPool(scheduler)
+            .setScheduler(scheduler)
+            
.setClientStats(BookKeeperClientStats.newInstance(NullStatsLogger.INSTANCE))
+            .setIsClientClosed(() -> false);
+    }
 
     static MockClientContext copyOf(ClientContext other) {
         return new MockClientContext()
@@ -51,54 +83,82 @@ class MockClientContext implements ClientContext {
             .setIsClientClosed(other::isClientClosed);
     }
 
-    MockClientContext setConf(ClientInternalConf conf) {
-        this.conf = conf;
+    public MockRegistrationClient getMockRegistrationClient() {
+        checkState(regClient != null);
+        return regClient;
+    }
+
+    public MockLedgerManager getMockLedgerManager() {
+        checkState(ledgerManager instanceof MockLedgerManager);
+        return (MockLedgerManager) ledgerManager;
+    }
+
+    public MockBookieClient getMockBookieClient() {
+        checkState(bookieClient instanceof MockBookieClient);
+        return (MockBookieClient) bookieClient;
+    }
+
+    public MockClientContext setConf(ClientInternalConf internalConf) {
+        this.internalConf = maybeSpy(internalConf);
         return this;
     }
 
-    MockClientContext setLedgerManager(LedgerManager ledgerManager) {
-        this.ledgerManager = ledgerManager;
+    public MockClientContext setLedgerManager(LedgerManager ledgerManager) {
+        this.ledgerManager = maybeSpy(ledgerManager);
         return this;
     }
 
-    MockClientContext setBookieWatcher(BookieWatcher bookieWatcher) {
-        this.bookieWatcher = bookieWatcher;
+    public MockClientContext setBookieWatcher(BookieWatcher bookieWatcher) {
+        this.bookieWatcher = maybeSpy(bookieWatcher);
         return this;
     }
 
-    MockClientContext setPlacementPolicy(EnsemblePlacementPolicy 
placementPolicy) {
-        this.placementPolicy = placementPolicy;
+    public MockClientContext setPlacementPolicy(EnsemblePlacementPolicy 
placementPolicy) {
+        this.placementPolicy = maybeSpy(placementPolicy);
         return this;
     }
 
-    MockClientContext setBookieClient(BookieClient bookieClient) {
-        this.bookieClient = bookieClient;
+    public MockClientContext setBookieClient(BookieClient bookieClient) {
+        this.bookieClient = maybeSpy(bookieClient);
         return this;
     }
 
-    MockClientContext setMainWorkerPool(OrderedExecutor mainWorkerPool) {
-        this.mainWorkerPool = mainWorkerPool;
+    public MockClientContext setMainWorkerPool(OrderedExecutor mainWorkerPool) 
{
+        this.mainWorkerPool = maybeSpy(mainWorkerPool);
         return this;
     }
 
-    MockClientContext setScheduler(OrderedScheduler scheduler) {
-        this.scheduler = scheduler;
+    public MockClientContext setScheduler(OrderedScheduler scheduler) {
+        this.scheduler = maybeSpy(scheduler);
         return this;
     }
 
-    MockClientContext setClientStats(BookKeeperClientStats clientStats) {
+    public MockClientContext setClientStats(BookKeeperClientStats clientStats) 
{
         this.clientStats = clientStats;
         return this;
     }
 
-    MockClientContext setIsClientClosed(BooleanSupplier isClientClosed) {
+    public MockClientContext setIsClientClosed(BooleanSupplier isClientClosed) 
{
         this.isClientClosed = isClientClosed;
         return this;
     }
 
+    public MockClientContext setRegistrationClient(MockRegistrationClient 
regClient) {
+        this.regClient = maybeSpy(regClient);
+        return this;
+    }
+
+    private static <T> T maybeSpy(T orig) {
+        if (Mockito.mockingDetails(orig).isSpy()) {
+            return orig;
+        } else {
+            return Mockito.spy(orig);
+        }
+    }
+
     @Override
     public ClientInternalConf getConf() {
-        return this.conf;
+        return this.internalConf;
     }
 
     @Override

Reply via email to