|
|
|
|
@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
|
|
|
|
|
/* |
|
|
|
|
* Copyright 2002-2020 the original author or authors. |
|
|
|
|
* Copyright 2002-2023 the original author or authors. |
|
|
|
|
* |
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
|
@ -55,7 +55,7 @@ abstract class AbstractSchedulingTaskExecutorTests {
@@ -55,7 +55,7 @@ abstract class AbstractSchedulingTaskExecutorTests {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@BeforeEach |
|
|
|
|
void setUp(TestInfo testInfo) { |
|
|
|
|
void setup(TestInfo testInfo) { |
|
|
|
|
this.testName = testInfo.getTestMethod().get().getName(); |
|
|
|
|
this.threadNamePrefix = this.testName + "-"; |
|
|
|
|
this.executor = buildExecutor(); |
|
|
|
|
@ -84,11 +84,11 @@ abstract class AbstractSchedulingTaskExecutorTests {
@@ -84,11 +84,11 @@ abstract class AbstractSchedulingTaskExecutorTests {
|
|
|
|
|
TestTask task = new TestTask(this.testName, 0); |
|
|
|
|
executor.execute(task); |
|
|
|
|
Awaitility.await() |
|
|
|
|
.dontCatchUncaughtExceptions() |
|
|
|
|
.atMost(1, TimeUnit.SECONDS) |
|
|
|
|
.pollInterval(10, TimeUnit.MILLISECONDS) |
|
|
|
|
.until(() -> task.exception.get() != null && task.exception.get().getMessage().equals( |
|
|
|
|
"TestTask failure for test 'executeFailingRunnable': expectedRunCount:<0>, actualRunCount:<1>")); |
|
|
|
|
.dontCatchUncaughtExceptions() |
|
|
|
|
.atMost(1, TimeUnit.SECONDS) |
|
|
|
|
.pollInterval(10, TimeUnit.MILLISECONDS) |
|
|
|
|
.until(() -> task.exception.get() != null && task.exception.get().getMessage().equals( |
|
|
|
|
"TestTask failure for test 'executeFailingRunnable': expectedRunCount:<0>, actualRunCount:<1>")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
@ -101,7 +101,7 @@ abstract class AbstractSchedulingTaskExecutorTests {
@@ -101,7 +101,7 @@ abstract class AbstractSchedulingTaskExecutorTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void submitFailingRunnable() throws Exception { |
|
|
|
|
void submitFailingRunnable() { |
|
|
|
|
TestTask task = new TestTask(this.testName, 0); |
|
|
|
|
Future<?> future = executor.submit(task); |
|
|
|
|
assertThatExceptionOfType(ExecutionException.class).isThrownBy(() -> |
|
|
|
|
@ -121,31 +121,31 @@ abstract class AbstractSchedulingTaskExecutorTests {
@@ -121,31 +121,31 @@ abstract class AbstractSchedulingTaskExecutorTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void submitListenableRunnable() throws Exception { |
|
|
|
|
void submitListenableRunnable() { |
|
|
|
|
TestTask task = new TestTask(this.testName, 1); |
|
|
|
|
// Act
|
|
|
|
|
ListenableFuture<?> future = executor.submitListenable(task); |
|
|
|
|
future.addCallback(result -> outcome = result, ex -> outcome = ex); |
|
|
|
|
// Assert
|
|
|
|
|
Awaitility.await() |
|
|
|
|
.atMost(1, TimeUnit.SECONDS) |
|
|
|
|
.pollInterval(10, TimeUnit.MILLISECONDS) |
|
|
|
|
.until(future::isDone); |
|
|
|
|
.atMost(1, TimeUnit.SECONDS) |
|
|
|
|
.pollInterval(10, TimeUnit.MILLISECONDS) |
|
|
|
|
.until(future::isDone); |
|
|
|
|
assertThat(outcome).isNull(); |
|
|
|
|
assertThreadNamePrefix(task); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void submitFailingListenableRunnable() throws Exception { |
|
|
|
|
void submitFailingListenableRunnable() { |
|
|
|
|
TestTask task = new TestTask(this.testName, 0); |
|
|
|
|
ListenableFuture<?> future = executor.submitListenable(task); |
|
|
|
|
future.addCallback(result -> outcome = result, ex -> outcome = ex); |
|
|
|
|
|
|
|
|
|
Awaitility.await() |
|
|
|
|
.dontCatchUncaughtExceptions() |
|
|
|
|
.atMost(1, TimeUnit.SECONDS) |
|
|
|
|
.pollInterval(10, TimeUnit.MILLISECONDS) |
|
|
|
|
.until(() -> future.isDone() && outcome != null); |
|
|
|
|
.dontCatchUncaughtExceptions() |
|
|
|
|
.atMost(1, TimeUnit.SECONDS) |
|
|
|
|
.pollInterval(10, TimeUnit.MILLISECONDS) |
|
|
|
|
.until(() -> future.isDone() && outcome != null); |
|
|
|
|
assertThat(outcome.getClass()).isSameAs(RuntimeException.class); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -159,14 +159,13 @@ abstract class AbstractSchedulingTaskExecutorTests {
@@ -159,14 +159,13 @@ abstract class AbstractSchedulingTaskExecutorTests {
|
|
|
|
|
future1.get(1000, TimeUnit.MILLISECONDS); |
|
|
|
|
} |
|
|
|
|
catch (Exception ex) { |
|
|
|
|
/* ignore */ |
|
|
|
|
// ignore
|
|
|
|
|
} |
|
|
|
|
Awaitility.await() |
|
|
|
|
.atMost(4, TimeUnit.SECONDS) |
|
|
|
|
.pollInterval(10, TimeUnit.MILLISECONDS) |
|
|
|
|
.untilAsserted(() -> |
|
|
|
|
assertThatExceptionOfType(CancellationException.class).isThrownBy(() -> |
|
|
|
|
future2.get(1000, TimeUnit.MILLISECONDS))); |
|
|
|
|
.atMost(4, TimeUnit.SECONDS) |
|
|
|
|
.pollInterval(10, TimeUnit.MILLISECONDS) |
|
|
|
|
.untilAsserted(() -> assertThatExceptionOfType(CancellationException.class) |
|
|
|
|
.isThrownBy(() -> future2.get(1000, TimeUnit.MILLISECONDS))); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
@ -178,11 +177,11 @@ abstract class AbstractSchedulingTaskExecutorTests {
@@ -178,11 +177,11 @@ abstract class AbstractSchedulingTaskExecutorTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void submitFailingCallable() throws Exception { |
|
|
|
|
void submitFailingCallable() { |
|
|
|
|
TestCallable task = new TestCallable(this.testName, 0); |
|
|
|
|
Future<String> future = executor.submit(task); |
|
|
|
|
assertThatExceptionOfType(ExecutionException.class).isThrownBy(() -> |
|
|
|
|
future.get(1000, TimeUnit.MILLISECONDS)); |
|
|
|
|
assertThatExceptionOfType(ExecutionException.class) |
|
|
|
|
.isThrownBy(() -> future.get(1000, TimeUnit.MILLISECONDS)); |
|
|
|
|
assertThat(future.isDone()).isTrue(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -196,42 +195,41 @@ abstract class AbstractSchedulingTaskExecutorTests {
@@ -196,42 +195,41 @@ abstract class AbstractSchedulingTaskExecutorTests {
|
|
|
|
|
future1.get(1000, TimeUnit.MILLISECONDS); |
|
|
|
|
} |
|
|
|
|
catch (Exception ex) { |
|
|
|
|
/* ignore */ |
|
|
|
|
// ignore
|
|
|
|
|
} |
|
|
|
|
Awaitility.await() |
|
|
|
|
.atMost(4, TimeUnit.SECONDS) |
|
|
|
|
.pollInterval(10, TimeUnit.MILLISECONDS) |
|
|
|
|
.untilAsserted(() -> |
|
|
|
|
assertThatExceptionOfType(CancellationException.class).isThrownBy(() -> |
|
|
|
|
future2.get(1000, TimeUnit.MILLISECONDS))); |
|
|
|
|
.atMost(4, TimeUnit.SECONDS) |
|
|
|
|
.pollInterval(10, TimeUnit.MILLISECONDS) |
|
|
|
|
.untilAsserted(() -> assertThatExceptionOfType(CancellationException.class) |
|
|
|
|
.isThrownBy(() -> future2.get(1000, TimeUnit.MILLISECONDS))); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void submitListenableCallable() throws Exception { |
|
|
|
|
void submitListenableCallable() { |
|
|
|
|
TestCallable task = new TestCallable(this.testName, 1); |
|
|
|
|
// Act
|
|
|
|
|
ListenableFuture<String> future = executor.submitListenable(task); |
|
|
|
|
future.addCallback(result -> outcome = result, ex -> outcome = ex); |
|
|
|
|
// Assert
|
|
|
|
|
Awaitility.await() |
|
|
|
|
.atMost(1, TimeUnit.SECONDS) |
|
|
|
|
.pollInterval(10, TimeUnit.MILLISECONDS) |
|
|
|
|
.until(() -> future.isDone() && outcome != null); |
|
|
|
|
.atMost(1, TimeUnit.SECONDS) |
|
|
|
|
.pollInterval(10, TimeUnit.MILLISECONDS) |
|
|
|
|
.until(() -> future.isDone() && outcome != null); |
|
|
|
|
assertThat(outcome.toString().substring(0, this.threadNamePrefix.length())).isEqualTo(this.threadNamePrefix); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void submitFailingListenableCallable() throws Exception { |
|
|
|
|
void submitFailingListenableCallable() { |
|
|
|
|
TestCallable task = new TestCallable(this.testName, 0); |
|
|
|
|
// Act
|
|
|
|
|
ListenableFuture<String> future = executor.submitListenable(task); |
|
|
|
|
future.addCallback(result -> outcome = result, ex -> outcome = ex); |
|
|
|
|
// Assert
|
|
|
|
|
Awaitility.await() |
|
|
|
|
.dontCatchUncaughtExceptions() |
|
|
|
|
.atMost(1, TimeUnit.SECONDS) |
|
|
|
|
.pollInterval(10, TimeUnit.MILLISECONDS) |
|
|
|
|
.until(() -> future.isDone() && outcome != null); |
|
|
|
|
.dontCatchUncaughtExceptions() |
|
|
|
|
.atMost(1, TimeUnit.SECONDS) |
|
|
|
|
.pollInterval(10, TimeUnit.MILLISECONDS) |
|
|
|
|
.until(() -> future.isDone() && outcome != null); |
|
|
|
|
assertThat(outcome.getClass()).isSameAs(RuntimeException.class); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -296,8 +294,9 @@ abstract class AbstractSchedulingTaskExecutorTests {
@@ -296,8 +294,9 @@ abstract class AbstractSchedulingTaskExecutorTests {
|
|
|
|
|
} |
|
|
|
|
if (expectedRunCount >= 0) { |
|
|
|
|
if (actualRunCount.incrementAndGet() > expectedRunCount) { |
|
|
|
|
RuntimeException exception = new RuntimeException(String.format("%s failure for test '%s': expectedRunCount:<%d>, actualRunCount:<%d>", |
|
|
|
|
getClass().getSimpleName(), this.testName, expectedRunCount, actualRunCount.get())); |
|
|
|
|
RuntimeException exception = new RuntimeException(String.format( |
|
|
|
|
"%s failure for test '%s': expectedRunCount:<%d>, actualRunCount:<%d>", |
|
|
|
|
getClass().getSimpleName(), this.testName, expectedRunCount, actualRunCount.get())); |
|
|
|
|
this.exception.set(exception); |
|
|
|
|
throw exception; |
|
|
|
|
} |
|
|
|
|
@ -329,8 +328,9 @@ abstract class AbstractSchedulingTaskExecutorTests {
@@ -329,8 +328,9 @@ abstract class AbstractSchedulingTaskExecutorTests {
|
|
|
|
|
} |
|
|
|
|
if (expectedRunCount >= 0) { |
|
|
|
|
if (actualRunCount.incrementAndGet() > expectedRunCount) { |
|
|
|
|
throw new RuntimeException(String.format("%s failure for test '%s': expectedRunCount:<%d>, actualRunCount:<%d>", |
|
|
|
|
getClass().getSimpleName(), this.testName, expectedRunCount, actualRunCount.get())); |
|
|
|
|
throw new RuntimeException(String.format( |
|
|
|
|
"%s failure for test '%s': expectedRunCount:<%d>, actualRunCount:<%d>", |
|
|
|
|
getClass().getSimpleName(), this.testName, expectedRunCount, actualRunCount.get())); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return Thread.currentThread().getName(); |
|
|
|
|
|