You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ad...@apache.org on 2017/02/02 14:26:46 UTC
[2/5] james-project git commit: PROTOCOL-115 Move
ConcurrentTestRunner to james-util
PROTOCOL-115 Move ConcurrentTestRunner to james-util
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/4eb5e7df
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/4eb5e7df
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/4eb5e7df
Branch: refs/heads/master
Commit: 4eb5e7dfd86a17e0e936c1a2e68e7b477acb8a34
Parents: d4f18a9
Author: Raphael Ouazana <ra...@linagora.com>
Authored: Thu Feb 2 10:12:19 2017 +0100
Committer: Raphael Ouazana <ra...@linagora.com>
Committed: Thu Feb 2 15:23:43 2017 +0100
----------------------------------------------------------------------
mailbox/pom.xml | 5 +
mailbox/store/pom.xml | 5 +
.../store/mail/model/MessageIdMapperTest.java | 2 +-
.../store/mail/model/MessageMapperTest.java | 2 +-
.../model/concurrency/ConcurrentTestRunner.java | 90 -------------
.../concurrency/ConcurrentTestRunnerTest.java | 135 -------------------
.../util/concurrency/ConcurrentTestRunner.java | 90 +++++++++++++
.../concurrency/ConcurrentTestRunnerTest.java | 135 +++++++++++++++++++
8 files changed, 237 insertions(+), 227 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/4eb5e7df/mailbox/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/pom.xml b/mailbox/pom.xml
index c4699f6..e838610 100644
--- a/mailbox/pom.xml
+++ b/mailbox/pom.xml
@@ -215,6 +215,11 @@
<artifactId>apache-james-mailbox-tool</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.james</groupId>
+ <artifactId>james-server-util</artifactId>
+ <version>${project.version}</version>
+ </dependency>
<!--
END Modules
-->
http://git-wip-us.apache.org/repos/asf/james-project/blob/4eb5e7df/mailbox/store/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/store/pom.xml b/mailbox/store/pom.xml
index f6f10b0..52d16de 100644
--- a/mailbox/store/pom.xml
+++ b/mailbox/store/pom.xml
@@ -38,6 +38,11 @@
</dependency>
<dependency>
<groupId>org.apache.james</groupId>
+ <artifactId>james-server-util</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.james</groupId>
<artifactId>apache-mime4j-core</artifactId>
</dependency>
<dependency>
http://git-wip-us.apache.org/repos/asf/james-project/blob/4eb5e7df/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
index 5ede73c..0770ec1 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
@@ -43,10 +43,10 @@ import org.apache.james.mailbox.store.mail.MailboxMapper;
import org.apache.james.mailbox.store.mail.MessageIdMapper;
import org.apache.james.mailbox.store.mail.MessageMapper;
import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
-import org.apache.james.mailbox.store.mail.model.concurrency.ConcurrentTestRunner;
import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
+import org.apache.james.util.concurrency.ConcurrentTestRunner;
import org.assertj.core.data.MapEntry;
import org.junit.After;
import org.junit.Assume;
http://git-wip-us.apache.org/repos/asf/james-project/blob/4eb5e7df/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
index ccbb0f2..6fdb35a 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
@@ -46,10 +46,10 @@ import org.apache.james.mailbox.store.FlagsUpdateCalculator;
import org.apache.james.mailbox.store.mail.MailboxMapper;
import org.apache.james.mailbox.store.mail.MessageMapper;
import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
-import org.apache.james.mailbox.store.mail.model.concurrency.ConcurrentTestRunner;
import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
+import org.apache.james.util.concurrency.ConcurrentTestRunner;
import org.junit.After;
import org.junit.Assume;
import org.junit.Rule;
http://git-wip-us.apache.org/repos/asf/james-project/blob/4eb5e7df/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/concurrency/ConcurrentTestRunner.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/concurrency/ConcurrentTestRunner.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/concurrency/ConcurrentTestRunner.java
deleted file mode 100644
index 35be61e..0000000
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/concurrency/ConcurrentTestRunner.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/****************************************************************
- * 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.james.mailbox.store.mail.model.concurrency;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Preconditions;
-
-public class ConcurrentTestRunner {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ConcurrentTestRunner.class);
-
- public interface BiConsumer {
- void consume(int threadNumber, int step) throws Exception;
- }
-
- private class ConcurrentRunnableTask implements Runnable {
- private final int threadNumber;
- private final BiConsumer biConsumer;
-
- public ConcurrentRunnableTask(int threadNumber, BiConsumer biConsumer) {
- this.threadNumber = threadNumber;
- this.biConsumer = biConsumer;
- }
-
- @Override
- public void run() {
- countDownLatch.countDown();
- for (int i = 0; i < operationCount; i++) {
- try {
- biConsumer.consume(threadNumber, i);
- } catch (Exception e) {
- LOGGER.error("Error caught during concurrent testing", e);
- }
- }
- }
- }
-
- private final int threadCount;
- private final int operationCount;
- private final CountDownLatch countDownLatch;
- private final BiConsumer biConsumer;
- private final ExecutorService executorService;
-
- public ConcurrentTestRunner(int threadCount, int operationCount, BiConsumer biConsumer) {
- Preconditions.checkArgument(threadCount > 0, "Thread count should be strictly positive");
- Preconditions.checkArgument(operationCount > 0, "Operation count should be strictly positive");
- Preconditions.checkNotNull(biConsumer);
- this.threadCount = threadCount;
- this.operationCount = operationCount;
- this.countDownLatch = new CountDownLatch(threadCount);
- this.biConsumer = biConsumer;
- this.executorService = Executors.newFixedThreadPool(threadCount);
- }
-
- public ConcurrentTestRunner run() {
- for (int i = 0; i < threadCount; i++) {
- executorService.submit(new ConcurrentRunnableTask(i, biConsumer));
- }
- return this;
- }
-
- public boolean awaitTermination(long time, TimeUnit unit) throws InterruptedException {
- executorService.shutdown();
- return executorService.awaitTermination(time, unit);
- }
-}
http://git-wip-us.apache.org/repos/asf/james-project/blob/4eb5e7df/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/concurrency/ConcurrentTestRunnerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/concurrency/ConcurrentTestRunnerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/concurrency/ConcurrentTestRunnerTest.java
deleted file mode 100644
index 302ed9e..0000000
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/concurrency/ConcurrentTestRunnerTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/****************************************************************
- * 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.james.mailbox.store.mail.model.concurrency;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.TimeUnit;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-
-public class ConcurrentTestRunnerTest {
-
- public static final ConcurrentTestRunner.BiConsumer EMPTY_BI_CONSUMER = new ConcurrentTestRunner.BiConsumer() {
- @Override
- public void consume(int threadNumber, int step) throws Exception {
-
- }
- };
- public static final int DEFAULT_AWAIT_TIME = 100;
- @Rule
- public ExpectedException expectedException = ExpectedException.none();
-
- @Test
- public void constructorShouldThrowOnNegativeThreadCount() {
- expectedException.expect(IllegalArgumentException.class);
-
- int operationCount = 1;
- int threadCount = -1;
- new ConcurrentTestRunner(threadCount, operationCount, EMPTY_BI_CONSUMER);
- }
-
- @Test
- public void constructorShouldThrowOnNegativeOperationCount() {
- expectedException.expect(IllegalArgumentException.class);
-
- int operationCount = -1;
- int threadCount = 1;
- new ConcurrentTestRunner(threadCount, operationCount, EMPTY_BI_CONSUMER);
- }
-
- @Test
- public void constructorShouldThrowOnZeroThreadCount() {
- expectedException.expect(IllegalArgumentException.class);
-
- int operationCount = 1;
- int threadCount = 0;
- new ConcurrentTestRunner(threadCount, operationCount, EMPTY_BI_CONSUMER);
- }
-
- @Test
- public void constructorShouldThrowOnZeroOperationCount() {
- expectedException.expect(IllegalArgumentException.class);
-
- int operationCount = 0;
- int threadCount = 1;
- new ConcurrentTestRunner(threadCount, operationCount, EMPTY_BI_CONSUMER);
- }
-
- @Test
- public void constructorShouldThrowOnNullBiConsumer() {
- expectedException.expect(NullPointerException.class);
-
- int operationCount = 1;
- int threadCount = 1;
- new ConcurrentTestRunner(threadCount, operationCount, null);
- }
-
- @Test
- public void awaitTerminationShouldReturnTrueWhenFinished() throws Exception {
- int operationCount = 1;
- int threadCount = 1;
-
- ConcurrentTestRunner concurrentTestRunner = new ConcurrentTestRunner(threadCount, operationCount, EMPTY_BI_CONSUMER)
- .run();
-
- assertThat(concurrentTestRunner.awaitTermination(DEFAULT_AWAIT_TIME, TimeUnit.MILLISECONDS)).isTrue();
- }
-
- @Test
- public void awaitTerminationShouldReturnFalseWhenNotFinished() throws Exception {
- int operationCount = 1;
- int threadCount = 1;
- final int sleepDelay = 50;
-
- ConcurrentTestRunner concurrentTestRunner = new ConcurrentTestRunner(threadCount, operationCount,
- new ConcurrentTestRunner.BiConsumer() {
- @Override
- public void consume(int threadNumber, int step) throws Exception {
- Thread.sleep(sleepDelay);
- }
- })
- .run();
-
- assertThat(concurrentTestRunner.awaitTermination(sleepDelay / 2, TimeUnit.MILLISECONDS)).isFalse();
- }
-
- @Test
- public void runShouldPerformAllOperations() throws Exception {
- int operationCount = 2;
- int threadCount = 2;
- final ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
-
- ConcurrentTestRunner concurrentTestRunner = new ConcurrentTestRunner(threadCount, operationCount,
- new ConcurrentTestRunner.BiConsumer() {
- @Override
- public void consume(int threadNumber, int step) throws Exception {
- queue.add(threadNumber + ":" + step);
- }
- })
- .run();
-
- assertThat(concurrentTestRunner.awaitTermination(DEFAULT_AWAIT_TIME, TimeUnit.MILLISECONDS)).isTrue();
- assertThat(queue).containsOnly("0:0", "0:1", "1:0", "1:1");
- }
-}
http://git-wip-us.apache.org/repos/asf/james-project/blob/4eb5e7df/server/container/util/src/main/java/org/apache/james/util/concurrency/ConcurrentTestRunner.java
----------------------------------------------------------------------
diff --git a/server/container/util/src/main/java/org/apache/james/util/concurrency/ConcurrentTestRunner.java b/server/container/util/src/main/java/org/apache/james/util/concurrency/ConcurrentTestRunner.java
new file mode 100644
index 0000000..0a4fa40
--- /dev/null
+++ b/server/container/util/src/main/java/org/apache/james/util/concurrency/ConcurrentTestRunner.java
@@ -0,0 +1,90 @@
+/****************************************************************
+ * 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.james.util.concurrency;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Preconditions;
+
+public class ConcurrentTestRunner {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ConcurrentTestRunner.class);
+
+ public interface BiConsumer {
+ void consume(int threadNumber, int step) throws Exception;
+ }
+
+ private class ConcurrentRunnableTask implements Runnable {
+ private final int threadNumber;
+ private final BiConsumer biConsumer;
+
+ public ConcurrentRunnableTask(int threadNumber, BiConsumer biConsumer) {
+ this.threadNumber = threadNumber;
+ this.biConsumer = biConsumer;
+ }
+
+ @Override
+ public void run() {
+ countDownLatch.countDown();
+ for (int i = 0; i < operationCount; i++) {
+ try {
+ biConsumer.consume(threadNumber, i);
+ } catch (Exception e) {
+ LOGGER.error("Error caught during concurrent testing", e);
+ }
+ }
+ }
+ }
+
+ private final int threadCount;
+ private final int operationCount;
+ private final CountDownLatch countDownLatch;
+ private final BiConsumer biConsumer;
+ private final ExecutorService executorService;
+
+ public ConcurrentTestRunner(int threadCount, int operationCount, BiConsumer biConsumer) {
+ Preconditions.checkArgument(threadCount > 0, "Thread count should be strictly positive");
+ Preconditions.checkArgument(operationCount > 0, "Operation count should be strictly positive");
+ Preconditions.checkNotNull(biConsumer);
+ this.threadCount = threadCount;
+ this.operationCount = operationCount;
+ this.countDownLatch = new CountDownLatch(threadCount);
+ this.biConsumer = biConsumer;
+ this.executorService = Executors.newFixedThreadPool(threadCount);
+ }
+
+ public ConcurrentTestRunner run() {
+ for (int i = 0; i < threadCount; i++) {
+ executorService.submit(new ConcurrentRunnableTask(i, biConsumer));
+ }
+ return this;
+ }
+
+ public boolean awaitTermination(long time, TimeUnit unit) throws InterruptedException {
+ executorService.shutdown();
+ return executorService.awaitTermination(time, unit);
+ }
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/4eb5e7df/server/container/util/src/test/java/org/apache/james/util/concurrency/ConcurrentTestRunnerTest.java
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/java/org/apache/james/util/concurrency/ConcurrentTestRunnerTest.java b/server/container/util/src/test/java/org/apache/james/util/concurrency/ConcurrentTestRunnerTest.java
new file mode 100644
index 0000000..98bde34
--- /dev/null
+++ b/server/container/util/src/test/java/org/apache/james/util/concurrency/ConcurrentTestRunnerTest.java
@@ -0,0 +1,135 @@
+/****************************************************************
+ * 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.james.util.concurrency;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class ConcurrentTestRunnerTest {
+
+ public static final ConcurrentTestRunner.BiConsumer EMPTY_BI_CONSUMER = new ConcurrentTestRunner.BiConsumer() {
+ @Override
+ public void consume(int threadNumber, int step) throws Exception {
+
+ }
+ };
+ public static final int DEFAULT_AWAIT_TIME = 100;
+ @Rule
+ public ExpectedException expectedException = ExpectedException.none();
+
+ @Test
+ public void constructorShouldThrowOnNegativeThreadCount() {
+ expectedException.expect(IllegalArgumentException.class);
+
+ int operationCount = 1;
+ int threadCount = -1;
+ new ConcurrentTestRunner(threadCount, operationCount, EMPTY_BI_CONSUMER);
+ }
+
+ @Test
+ public void constructorShouldThrowOnNegativeOperationCount() {
+ expectedException.expect(IllegalArgumentException.class);
+
+ int operationCount = -1;
+ int threadCount = 1;
+ new ConcurrentTestRunner(threadCount, operationCount, EMPTY_BI_CONSUMER);
+ }
+
+ @Test
+ public void constructorShouldThrowOnZeroThreadCount() {
+ expectedException.expect(IllegalArgumentException.class);
+
+ int operationCount = 1;
+ int threadCount = 0;
+ new ConcurrentTestRunner(threadCount, operationCount, EMPTY_BI_CONSUMER);
+ }
+
+ @Test
+ public void constructorShouldThrowOnZeroOperationCount() {
+ expectedException.expect(IllegalArgumentException.class);
+
+ int operationCount = 0;
+ int threadCount = 1;
+ new ConcurrentTestRunner(threadCount, operationCount, EMPTY_BI_CONSUMER);
+ }
+
+ @Test
+ public void constructorShouldThrowOnNullBiConsumer() {
+ expectedException.expect(NullPointerException.class);
+
+ int operationCount = 1;
+ int threadCount = 1;
+ new ConcurrentTestRunner(threadCount, operationCount, null);
+ }
+
+ @Test
+ public void awaitTerminationShouldReturnTrueWhenFinished() throws Exception {
+ int operationCount = 1;
+ int threadCount = 1;
+
+ ConcurrentTestRunner concurrentTestRunner = new ConcurrentTestRunner(threadCount, operationCount, EMPTY_BI_CONSUMER)
+ .run();
+
+ assertThat(concurrentTestRunner.awaitTermination(DEFAULT_AWAIT_TIME, TimeUnit.MILLISECONDS)).isTrue();
+ }
+
+ @Test
+ public void awaitTerminationShouldReturnFalseWhenNotFinished() throws Exception {
+ int operationCount = 1;
+ int threadCount = 1;
+ final int sleepDelay = 50;
+
+ ConcurrentTestRunner concurrentTestRunner = new ConcurrentTestRunner(threadCount, operationCount,
+ new ConcurrentTestRunner.BiConsumer() {
+ @Override
+ public void consume(int threadNumber, int step) throws Exception {
+ Thread.sleep(sleepDelay);
+ }
+ })
+ .run();
+
+ assertThat(concurrentTestRunner.awaitTermination(sleepDelay / 2, TimeUnit.MILLISECONDS)).isFalse();
+ }
+
+ @Test
+ public void runShouldPerformAllOperations() throws Exception {
+ int operationCount = 2;
+ int threadCount = 2;
+ final ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
+
+ ConcurrentTestRunner concurrentTestRunner = new ConcurrentTestRunner(threadCount, operationCount,
+ new ConcurrentTestRunner.BiConsumer() {
+ @Override
+ public void consume(int threadNumber, int step) throws Exception {
+ queue.add(threadNumber + ":" + step);
+ }
+ })
+ .run();
+
+ assertThat(concurrentTestRunner.awaitTermination(DEFAULT_AWAIT_TIME, TimeUnit.MILLISECONDS)).isTrue();
+ assertThat(queue).containsOnly("0:0", "0:1", "1:0", "1:1");
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org