aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/org/apache/commons/lang3/concurrent/ConcurrentUtilsTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/org/apache/commons/lang3/concurrent/ConcurrentUtilsTest.java')
-rw-r--r--src/test/java/org/apache/commons/lang3/concurrent/ConcurrentUtilsTest.java496
1 files changed, 496 insertions, 0 deletions
diff --git a/src/test/java/org/apache/commons/lang3/concurrent/ConcurrentUtilsTest.java b/src/test/java/org/apache/commons/lang3/concurrent/ConcurrentUtilsTest.java
new file mode 100644
index 000000000..831c33349
--- /dev/null
+++ b/src/test/java/org/apache/commons/lang3/concurrent/ConcurrentUtilsTest.java
@@ -0,0 +1,496 @@
+/*
+ * 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.commons.lang3.concurrent;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.lang3.AbstractLangTest;
+import org.easymock.EasyMock;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Test class for {@link ConcurrentUtils}.
+ */
+public class ConcurrentUtilsTest extends AbstractLangTest {
+ /**
+ * Tests creating a ConcurrentException with a runtime exception as cause.
+ */
+ @Test
+ public void testConcurrentExceptionCauseUnchecked() {
+ assertThrows(IllegalArgumentException.class, () -> new ConcurrentException(new RuntimeException()));
+ }
+
+ /**
+ * Tests creating a ConcurrentException with an error as cause.
+ */
+ @Test
+ public void testConcurrentExceptionCauseError() {
+ assertThrows(IllegalArgumentException.class, () -> new ConcurrentException("An error", new Error()));
+ }
+
+ /**
+ * Tests creating a ConcurrentException with null as cause.
+ */
+ @Test
+ public void testConcurrentExceptionCauseNull() {
+ assertThrows(IllegalArgumentException.class, () -> new ConcurrentException(null));
+ }
+
+ /**
+ * Tries to create a ConcurrentRuntimeException with a runtime as cause.
+ */
+ @Test
+ public void testConcurrentRuntimeExceptionCauseUnchecked() {
+ assertThrows(IllegalArgumentException.class, () -> new ConcurrentRuntimeException(new RuntimeException()));
+ }
+
+ /**
+ * Tries to create a ConcurrentRuntimeException with an error as cause.
+ */
+ @Test
+ public void testConcurrentRuntimeExceptionCauseError() {
+ assertThrows(IllegalArgumentException.class, () -> new ConcurrentRuntimeException("An error", new Error()));
+ }
+
+ /**
+ * Tries to create a ConcurrentRuntimeException with null as cause.
+ */
+ @Test
+ public void testConcurrentRuntimeExceptionCauseNull() {
+ assertThrows(IllegalArgumentException.class, () -> new ConcurrentRuntimeException(null));
+ }
+
+ /**
+ * Tests extractCause() for a null exception.
+ */
+ @Test
+ public void testExtractCauseNull() {
+ assertNull(ConcurrentUtils.extractCause(null), "Non null result");
+ }
+
+ /**
+ * Tests extractCause() if the cause of the passed in exception is null.
+ */
+ @Test
+ public void testExtractCauseNullCause() {
+ assertNull(ConcurrentUtils.extractCause(new ExecutionException("Test", null)), "Non null result");
+ }
+
+ /**
+ * Tests extractCause() if the cause is an error.
+ */
+ @Test
+ public void testExtractCauseError() {
+ final Error err = new AssertionError("Test");
+ final AssertionError e = assertThrows(AssertionError.class, () -> ConcurrentUtils.extractCause(new ExecutionException(err)));
+ assertEquals(err, e, "Wrong error");
+ }
+
+ /**
+ * Tests extractCause() if the cause is an unchecked exception.
+ */
+ @Test
+ public void testExtractCauseUncheckedException() {
+ final RuntimeException rex = new RuntimeException("Test");
+ assertThrows(RuntimeException.class, () -> ConcurrentUtils.extractCause(new ExecutionException(rex)));
+ }
+
+ /**
+ * Tests extractCause() if the cause is a checked exception.
+ */
+ @Test
+ public void testExtractCauseChecked() {
+ final Exception ex = new Exception("Test");
+ final ConcurrentException cex = ConcurrentUtils.extractCause(new ExecutionException(ex));
+ assertSame(ex, cex.getCause(), "Wrong cause");
+ }
+
+ /**
+ * Tests extractCauseUnchecked() for a null exception.
+ */
+ @Test
+ public void testExtractCauseUncheckedNull() {
+ assertNull(ConcurrentUtils.extractCauseUnchecked(null), "Non null result");
+ }
+
+ /**
+ * Tests extractCauseUnchecked() if the cause of the passed in exception is null.
+ */
+ @Test
+ public void testExtractCauseUncheckedNullCause() {
+ assertNull(ConcurrentUtils.extractCauseUnchecked(new ExecutionException("Test", null)), "Non null result");
+ }
+
+ /**
+ * Tests extractCauseUnchecked() if the cause is an error.
+ */
+ @Test
+ public void testExtractCauseUncheckedError() {
+ final Error err = new AssertionError("Test");
+ final Error e = assertThrows(Error.class, () -> ConcurrentUtils.extractCauseUnchecked(new ExecutionException(err)));
+ assertEquals(err, e, "Wrong error");
+ }
+
+ /**
+ * Tests extractCauseUnchecked() if the cause is an unchecked exception.
+ */
+ @Test
+ public void testExtractCauseUncheckedUncheckedException() {
+ final RuntimeException rex = new RuntimeException("Test");
+ final RuntimeException r = assertThrows(RuntimeException.class, () -> ConcurrentUtils.extractCauseUnchecked(new ExecutionException(rex)));
+ assertEquals(rex, r, "Wrong exception");
+ }
+
+ /**
+ * Tests extractCauseUnchecked() if the cause is a checked exception.
+ */
+ @Test
+ public void testExtractCauseUncheckedChecked() {
+ final Exception ex = new Exception("Test");
+ final ConcurrentRuntimeException cex = ConcurrentUtils.extractCauseUnchecked(new ExecutionException(ex));
+ assertSame(ex, cex.getCause(), "Wrong cause");
+ }
+
+ /**
+ * Tests handleCause() if the cause is an error.
+ */
+ @Test
+ public void testHandleCauseError() {
+ final Error err = new AssertionError("Test");
+ final Error e = assertThrows(Error.class, () -> ConcurrentUtils.handleCause(new ExecutionException(err)));
+ assertEquals(err, e, "Wrong error");
+ }
+
+ /**
+ * Tests handleCause() if the cause is an unchecked exception.
+ */
+ @Test
+ public void testHandleCauseUncheckedException() {
+ final RuntimeException rex = new RuntimeException("Test");
+ final RuntimeException r = assertThrows(RuntimeException.class, () -> ConcurrentUtils.handleCause(new ExecutionException(rex)));
+ assertEquals(rex, r, "Wrong exception");
+ }
+
+ /**
+ * Tests handleCause() if the cause is a checked exception.
+ */
+ @Test
+ public void testHandleCauseChecked() {
+ final Exception ex = new Exception("Test");
+ final ConcurrentException cex = assertThrows(ConcurrentException.class, () -> ConcurrentUtils.handleCause(new ExecutionException(ex)));
+ assertEquals(ex, cex.getCause(), "Wrong cause");
+ }
+
+ /**
+ * Tests handleCause() for a null parameter or a null cause. In this case the method should do nothing. We can only test
+ * that no exception is thrown.
+ *
+ * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
+ */
+ @Test
+ public void testHandleCauseNull() throws ConcurrentException {
+ ConcurrentUtils.handleCause(null);
+ ConcurrentUtils.handleCause(new ExecutionException("Test", null));
+ }
+
+ /**
+ * Tests handleCauseUnchecked() if the cause is an error.
+ */
+ @Test
+ public void testHandleCauseUncheckedError() {
+ final Error err = new AssertionError("Test");
+ final Error e = assertThrows(Error.class, () -> ConcurrentUtils.handleCauseUnchecked(new ExecutionException(err)));
+ assertEquals(err, e, "Wrong error");
+ }
+
+ /**
+ * Tests handleCauseUnchecked() if the cause is an unchecked exception.
+ */
+ @Test
+ public void testHandleCauseUncheckedUncheckedException() {
+ final RuntimeException rex = new RuntimeException("Test");
+ final RuntimeException r = assertThrows(RuntimeException.class, () -> ConcurrentUtils.handleCauseUnchecked(new ExecutionException(rex)));
+ assertEquals(rex, r, "Wrong exception");
+ }
+
+ /**
+ * Tests handleCauseUnchecked() if the cause is a checked exception.
+ */
+ @Test
+ public void testHandleCauseUncheckedChecked() {
+ final Exception ex = new Exception("Test");
+ final ConcurrentRuntimeException crex = assertThrows(ConcurrentRuntimeException.class,
+ () -> ConcurrentUtils.handleCauseUnchecked(new ExecutionException(ex)));
+ assertEquals(ex, crex.getCause(), "Wrong cause");
+ }
+
+ /**
+ * Tests handleCauseUnchecked() for a null parameter or a null cause. In this case the method should do nothing. We can
+ * only test that no exception is thrown.
+ */
+ @Test
+ public void testHandleCauseUncheckedNull() {
+ ConcurrentUtils.handleCauseUnchecked(null);
+ ConcurrentUtils.handleCauseUnchecked(new ExecutionException("Test", null));
+ }
+
+ /**
+ * Tests initialize() for a null argument.
+ *
+ * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
+ */
+ @Test
+ public void testInitializeNull() throws ConcurrentException {
+ assertNull(ConcurrentUtils.initialize(null), "Got a result");
+ }
+
+ /**
+ * Tests a successful initialize() operation.
+ *
+ * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
+ */
+ @Test
+ public void testInitialize() throws ConcurrentException {
+ final ConcurrentInitializer<Object> init = EasyMock.createMock(ConcurrentInitializer.class);
+ final Object result = new Object();
+ EasyMock.expect(init.get()).andReturn(result);
+ EasyMock.replay(init);
+ assertSame(result, ConcurrentUtils.initialize(init), "Wrong result object");
+ EasyMock.verify(init);
+ }
+
+ /**
+ * Tests initializeUnchecked() for a null argument.
+ */
+ @Test
+ public void testInitializeUncheckedNull() {
+ assertNull(ConcurrentUtils.initializeUnchecked(null), "Got a result");
+ }
+
+ /**
+ * Tests creating ConcurrentRuntimeException with no arguments.
+ */
+ @Test
+ public void testUninitializedConcurrentRuntimeException() {
+ assertNotNull(new ConcurrentRuntimeException(), "Error creating empty ConcurrentRuntimeException");
+ }
+
+ /**
+ * Tests a successful initializeUnchecked() operation.
+ *
+ * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
+ */
+ @Test
+ public void testInitializeUnchecked() throws ConcurrentException {
+ final ConcurrentInitializer<Object> init = EasyMock.createMock(ConcurrentInitializer.class);
+ final Object result = new Object();
+ EasyMock.expect(init.get()).andReturn(result);
+ EasyMock.replay(init);
+ assertSame(result, ConcurrentUtils.initializeUnchecked(init), "Wrong result object");
+ EasyMock.verify(init);
+ }
+
+ /**
+ * Tests whether exceptions are correctly handled by initializeUnchecked().
+ *
+ * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
+ */
+ @Test
+ public void testInitializeUncheckedEx() throws ConcurrentException {
+ final ConcurrentInitializer<Object> init = EasyMock.createMock(ConcurrentInitializer.class);
+ final Exception cause = new Exception();
+ EasyMock.expect(init.get()).andThrow(new ConcurrentException(cause));
+ EasyMock.replay(init);
+ final ConcurrentRuntimeException crex = assertThrows(ConcurrentRuntimeException.class, () -> ConcurrentUtils.initializeUnchecked(init));
+ assertSame(cause, crex.getCause(), "Wrong cause");
+ EasyMock.verify(init);
+ }
+
+ /**
+ * Tests constant future.
+ *
+ * @throws Exception so we don't have to catch it
+ */
+ @Test
+ public void testConstantFuture_Integer() throws Exception {
+ final Integer value = Integer.valueOf(5);
+ final Future<Integer> test = ConcurrentUtils.constantFuture(value);
+ assertTrue(test.isDone());
+ assertSame(value, test.get());
+ assertSame(value, test.get(1000, TimeUnit.SECONDS));
+ assertSame(value, test.get(1000, null));
+ assertFalse(test.isCancelled());
+ assertFalse(test.cancel(true));
+ assertFalse(test.cancel(false));
+ }
+
+ /**
+ * Tests constant future.
+ *
+ * @throws Exception so we don't have to catch it
+ */
+ @Test
+ public void testConstantFuture_null() throws Exception {
+ final Integer value = null;
+ final Future<Integer> test = ConcurrentUtils.constantFuture(value);
+ assertTrue(test.isDone());
+ assertSame(value, test.get());
+ assertSame(value, test.get(1000, TimeUnit.SECONDS));
+ assertSame(value, test.get(1000, null));
+ assertFalse(test.isCancelled());
+ assertFalse(test.cancel(true));
+ assertFalse(test.cancel(false));
+ }
+
+ /**
+ * Tests putIfAbsent() if the map contains the key in question.
+ */
+ @Test
+ public void testPutIfAbsentKeyPresent() {
+ final String key = "testKey";
+ final Integer value = 42;
+ final ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>();
+ map.put(key, value);
+ assertEquals(value, ConcurrentUtils.putIfAbsent(map, key, 0), "Wrong result");
+ assertEquals(value, map.get(key), "Wrong value in map");
+ }
+
+ /**
+ * Tests putIfAbsent() if the map does not contain the key in question.
+ */
+ @Test
+ public void testPutIfAbsentKeyNotPresent() {
+ final String key = "testKey";
+ final Integer value = 42;
+ final ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>();
+ assertEquals(value, ConcurrentUtils.putIfAbsent(map, key, value), "Wrong result");
+ assertEquals(value, map.get(key), "Wrong value in map");
+ }
+
+ /**
+ * Tests putIfAbsent() if a null map is passed in.
+ */
+ @Test
+ public void testPutIfAbsentNullMap() {
+ assertNull(ConcurrentUtils.putIfAbsent(null, "test", 100), "Wrong result");
+ }
+
+ /**
+ * Tests createIfAbsent() if the key is found in the map.
+ *
+ * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
+ */
+ @Test
+ public void testCreateIfAbsentKeyPresent() throws ConcurrentException {
+ final ConcurrentInitializer<Integer> init = EasyMock.createMock(ConcurrentInitializer.class);
+ EasyMock.replay(init);
+ final String key = "testKey";
+ final Integer value = 42;
+ final ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>();
+ map.put(key, value);
+ assertEquals(value, ConcurrentUtils.createIfAbsent(map, key, init), "Wrong result");
+ assertEquals(value, map.get(key), "Wrong value in map");
+ EasyMock.verify(init);
+ }
+
+ /**
+ * Tests createIfAbsent() if the map does not contain the key in question.
+ *
+ * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
+ */
+ @Test
+ public void testCreateIfAbsentKeyNotPresent() throws ConcurrentException {
+ final ConcurrentInitializer<Integer> init = EasyMock.createMock(ConcurrentInitializer.class);
+ final String key = "testKey";
+ final Integer value = 42;
+ EasyMock.expect(init.get()).andReturn(value);
+ EasyMock.replay(init);
+ final ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>();
+ assertEquals(value, ConcurrentUtils.createIfAbsent(map, key, init), "Wrong result");
+ assertEquals(value, map.get(key), "Wrong value in map");
+ EasyMock.verify(init);
+ }
+
+ /**
+ * Tests createIfAbsent() if a null map is passed in.
+ *
+ * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
+ */
+ @Test
+ public void testCreateIfAbsentNullMap() throws ConcurrentException {
+ final ConcurrentInitializer<Integer> init = EasyMock.createMock(ConcurrentInitializer.class);
+ EasyMock.replay(init);
+ assertNull(ConcurrentUtils.createIfAbsent(null, "test", init), "Wrong result");
+ EasyMock.verify(init);
+ }
+
+ /**
+ * Tests createIfAbsent() if a null initializer is passed in.
+ *
+ * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
+ */
+ @Test
+ public void testCreateIfAbsentNullInit() throws ConcurrentException {
+ final ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>();
+ final String key = "testKey";
+ final Integer value = 42;
+ map.put(key, value);
+ assertNull(ConcurrentUtils.createIfAbsent(map, key, null), "Wrong result");
+ assertEquals(value, map.get(key), "Map was changed");
+ }
+
+ /**
+ * Tests createIfAbsentUnchecked() if no exception is thrown.
+ */
+ @Test
+ public void testCreateIfAbsentUncheckedSuccess() {
+ final String key = "testKey";
+ final Integer value = 42;
+ final ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>();
+ assertEquals(value, ConcurrentUtils.createIfAbsentUnchecked(map, key, new ConstantInitializer<>(value)), "Wrong result");
+ assertEquals(value, map.get(key), "Wrong value in map");
+ }
+
+ /**
+ * Tests createIfAbsentUnchecked() if an exception is thrown.
+ *
+ * @throws org.apache.commons.lang3.concurrent.ConcurrentException so we don't have to catch it
+ */
+ @Test
+ public void testCreateIfAbsentUncheckedException() throws ConcurrentException {
+ final ConcurrentInitializer<Integer> init = EasyMock.createMock(ConcurrentInitializer.class);
+ final Exception ex = new Exception();
+ EasyMock.expect(init.get()).andThrow(new ConcurrentException(ex));
+ EasyMock.replay(init);
+ final ConcurrentRuntimeException crex = assertThrows(ConcurrentRuntimeException.class,
+ () -> ConcurrentUtils.createIfAbsentUnchecked(new ConcurrentHashMap<>(), "test", init));
+ assertEquals(ex, crex.getCause(), "Wrong cause");
+ EasyMock.verify(init);
+ }
+}