From 9d0bf84ae4c958eaf0956c45fe127ab98394ff7a Mon Sep 17 00:00:00 2001 From: John Blum Date: Mon, 28 May 2018 18:40:29 -0700 Subject: [PATCH] Add unit tests for o.s.b.d.g.function.support.AbstractResultCollector. --- .../support/AbstractResultCollector.java | 13 +- .../AbstractResultCollectorUnitTests.java | 152 ++++++++++++++++++ 2 files changed, 157 insertions(+), 8 deletions(-) create mode 100644 geode-spring-boot-starter/src/test/java/org/springframework/boot/data/geode/function/support/AbstractResultCollectorUnitTests.java diff --git a/geode-spring-boot-starter/src/main/java/org/springframework/boot/data/geode/function/support/AbstractResultCollector.java b/geode-spring-boot-starter/src/main/java/org/springframework/boot/data/geode/function/support/AbstractResultCollector.java index 3c22e886..d06ec47e 100644 --- a/geode-spring-boot-starter/src/main/java/org/springframework/boot/data/geode/function/support/AbstractResultCollector.java +++ b/geode-spring-boot-starter/src/main/java/org/springframework/boot/data/geode/function/support/AbstractResultCollector.java @@ -33,8 +33,6 @@ import org.apache.geode.cache.execute.ResultCollector; @SuppressWarnings("unused") public abstract class AbstractResultCollector implements ResultCollector { - private static final Object MUTEX = new Object(); - protected static final String NOT_IMPLEMENTED = "Not Implemented"; protected static final TimeUnit DEFAULT_TIME_UNIT = TimeUnit.MILLISECONDS; @@ -55,12 +53,11 @@ public abstract class AbstractResultCollector implements ResultCollector implements ResultCollector resultCollector; + + private static AbstractResultCollector newResultCollector() { + return newResultCollector(() -> {}); + } + + private static AbstractResultCollector newResultCollector(Runnable runnable) { + + return new AbstractResultCollector() { + + @Override + public synchronized S getResult() throws FunctionException { + runnable.run(); + return super.getResult(); + } + + @Override + @SuppressWarnings("unchecked") + public void addResult(DistributedMember memberID, T resultOfSingleExecution) { + setResult((S) resultOfSingleExecution); + } + }; + } + + @Before + public void setup() { + this.resultCollector = newResultCollector(); + } + + @Test + public void clearResultClearsResult() { + + this.resultCollector.setResult("test"); + + assertThat(this.resultCollector.getResult()).isEqualTo("test"); + + this.resultCollector.clearResults(); + + assertThat(this.resultCollector.getResult()).isNull(); + } + + @Test + public void getResultReturnsResult() { + + this.resultCollector.setResult("test"); + + assertThat(this.resultCollector.getResult()).isEqualTo("test"); + } + + @Test + public void getResultReturnsResultWithinTimeout() throws Throwable { + TestFramework.runOnce(new ReturnsResultWithinTimeoutMultithreadedTestCase()); + } + + @Test + public void resultsHaveEnded() { + + this.resultCollector.endResults(); + + assertThat(this.resultCollector.hasResultsEnded()).isTrue(); + assertThat(this.resultCollector.hasResultsNotEnded()).isFalse(); + } + + @Test + public void resultsHaveNotEnded() { + + assertThat(this.resultCollector.hasResultsEnded()).isFalse(); + assertThat(this.resultCollector.hasResultsNotEnded()).isTrue(); + } + + @SuppressWarnings("unused") + static class ReturnsResultWithinTimeoutMultithreadedTestCase extends MultithreadedTestCase { + + private long startTimestamp; + + private AbstractResultCollector resultCollector; + + @Override + public void initialize() { + + super.initialize(); + + this.resultCollector = newResultCollector(() -> waitForTick(1)); + this.startTimestamp = System.currentTimeMillis(); + } + + public void thread1() throws InterruptedException { + + Thread.currentThread().setName("ResultCollector.getResult()"); + + assertThat(this.resultCollector.getResult(500, TimeUnit.MILLISECONDS)).isEqualTo("test"); + } + + public void thread2() { + + Thread.currentThread().setName("ResultCollector.setResult(..)"); + + waitForTick(1); + + this.resultCollector.setResult("test"); + } + + @Override + public void finish() { + + long endTimestamp = System.currentTimeMillis(); + + assertThat(endTimestamp).isGreaterThan(this.startTimestamp); + assertThat(endTimestamp - this.startTimestamp).isLessThan(TimeUnit.SECONDS.toMillis(2)); + } + } +}