Skip to content

Commit

Permalink
test: add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
stawirej committed Dec 22, 2023
1 parent acb69d2 commit d08e8e8
Show file tree
Hide file tree
Showing 3 changed files with 247 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package pl.amazingcode.threadscollider.fixtures;

public final class ThreadUnsafeCounter {

private int counter = 0;

public void increment() {
counter++;
}

public void decrement() {
counter--;
}

public int value() {
return counter;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,220 @@
package pl.amazingcode.threadscollider.multi;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.TestInfo;
import pl.amazingcode.threadscollider.fixtures.ThreadUnsafeCounter;
import pl.amazingcode.threadscollider.fixtures.assertobject.CollisionsAssert;

@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
final class MultiThreadsCollider_Negative_Scenarios {

private static final int TEST_REPETITIONS = 200;
private static final int ACTION_THREADS_COUNT = Runtime.getRuntime().availableProcessors() / 2;

private static final CollisionsAssert collisionsAssert =
CollisionsAssert.newInstance(TEST_REPETITIONS);

@AfterAll
static void afterAll() {

collisionsAssert.report();
}

@RepeatedTest(TEST_REPETITIONS)
void Build_multi_threads_collider(TestInfo testInfo) {
// Given
String testName = testInfo.getTestMethod().get().getName();
ThreadUnsafeCounter counter = new ThreadUnsafeCounter();

// When
try (MultiThreadsCollider threadsCollider =
MultiThreadsCollider.MultiThreadsColliderBuilder.multiThreadsCollider()
.withAction(counter::increment)
.times(ACTION_THREADS_COUNT)
.withAction(counter::decrement)
.times(ACTION_THREADS_COUNT)
.build()) {

threadsCollider.collide();
}

// Then
collisionsAssert.assertTrue(testName, counter.value() != 0);
}

@Nested
class Build_threads_collider_with_custom_executor_await_termination_timeout {

@RepeatedTest(TEST_REPETITIONS)
void as_nanoseconds(TestInfo testInfo) {
// Given
String testName = testInfo.getTestMethod().get().getName();
ThreadUnsafeCounter counter = new ThreadUnsafeCounter();

// When
try (MultiThreadsCollider threadsCollider =
MultiThreadsCollider.MultiThreadsColliderBuilder.multiThreadsCollider()
.withAction(counter::increment)
.times(ACTION_THREADS_COUNT)
.withAction(counter::decrement)
.times(ACTION_THREADS_COUNT)
.withAwaitTerminationTimeout(1_000_000)
.asNanoseconds()
.build()) {

threadsCollider.collide();
}

// Then
collisionsAssert.assertTrue(testName, counter.value() != 0);
}

@RepeatedTest(TEST_REPETITIONS)
void as_microseconds(TestInfo testInfo) {
// Given
String testName = testInfo.getTestMethod().get().getName();
ThreadUnsafeCounter counter = new ThreadUnsafeCounter();

// When
try (MultiThreadsCollider threadsCollider =
MultiThreadsCollider.MultiThreadsColliderBuilder.multiThreadsCollider()
.withAction(counter::increment)
.times(ACTION_THREADS_COUNT)
.withAction(counter::decrement)
.times(ACTION_THREADS_COUNT)
.withAwaitTerminationTimeout(1_000)
.asMicroseconds()
.build()) {

threadsCollider.collide();
}

// Then
collisionsAssert.assertTrue(testName, counter.value() != 0);
}

@RepeatedTest(TEST_REPETITIONS)
void as_milliseconds(TestInfo testInfo) {
// Given
String testName = testInfo.getTestMethod().get().getName();
ThreadUnsafeCounter counter = new ThreadUnsafeCounter();

// When
try (MultiThreadsCollider threadsCollider =
MultiThreadsCollider.MultiThreadsColliderBuilder.multiThreadsCollider()
.withAction(counter::increment)
.times(ACTION_THREADS_COUNT)
.withAction(counter::decrement)
.times(ACTION_THREADS_COUNT)
.withAwaitTerminationTimeout(1)
.asMilliseconds()
.build()) {

threadsCollider.collide();
}

// Then
collisionsAssert.assertTrue(testName, counter.value() != 0);
}

@RepeatedTest(TEST_REPETITIONS)
void as_seconds(TestInfo testInfo) {
// Given
String testName = testInfo.getTestMethod().get().getName();
ThreadUnsafeCounter counter = new ThreadUnsafeCounter();

// When
try (MultiThreadsCollider threadsCollider =
MultiThreadsCollider.MultiThreadsColliderBuilder.multiThreadsCollider()
.withAction(counter::increment)
.times(ACTION_THREADS_COUNT)
.withAction(counter::decrement)
.times(ACTION_THREADS_COUNT)
.withAwaitTerminationTimeout(1)
.asSeconds()
.build()) {

threadsCollider.collide();
}

// Then
collisionsAssert.assertTrue(testName, counter.value() != 0);
}

@RepeatedTest(TEST_REPETITIONS)
void as_minutes(TestInfo testInfo) {
// Given
String testName = testInfo.getTestMethod().get().getName();
ThreadUnsafeCounter counter = new ThreadUnsafeCounter();

// When
try (MultiThreadsCollider threadsCollider =
MultiThreadsCollider.MultiThreadsColliderBuilder.multiThreadsCollider()
.withAction(counter::increment)
.times(ACTION_THREADS_COUNT)
.withAction(counter::decrement)
.times(ACTION_THREADS_COUNT)
.withAwaitTerminationTimeout(1)
.asMinutes()
.build()) {

threadsCollider.collide();
}

// Then
collisionsAssert.assertTrue(testName, counter.value() != 0);
}

@RepeatedTest(TEST_REPETITIONS)
void as_hours(TestInfo testInfo) {
// Given
String testName = testInfo.getTestMethod().get().getName();
ThreadUnsafeCounter counter = new ThreadUnsafeCounter();

// When
try (MultiThreadsCollider threadsCollider =
MultiThreadsCollider.MultiThreadsColliderBuilder.multiThreadsCollider()
.withAction(counter::increment)
.times(ACTION_THREADS_COUNT)
.withAction(counter::decrement)
.times(ACTION_THREADS_COUNT)
.withAwaitTerminationTimeout(1)
.asHours()
.build()) {

threadsCollider.collide();
}

// Then
collisionsAssert.assertTrue(testName, counter.value() != 0);
}

@RepeatedTest(TEST_REPETITIONS)
void as_days(TestInfo testInfo) {
// Given
String testName = testInfo.getTestMethod().get().getName();
ThreadUnsafeCounter counter = new ThreadUnsafeCounter();

// When
try (MultiThreadsCollider threadsCollider =
MultiThreadsCollider.MultiThreadsColliderBuilder.multiThreadsCollider()
.withAction(counter::increment)
.times(ACTION_THREADS_COUNT)
.withAction(counter::decrement)
.times(ACTION_THREADS_COUNT)
.withAwaitTerminationTimeout(1)
.asDays()
.build()) {

threadsCollider.collide();
}

// Then
collisionsAssert.assertTrue(testName, counter.value() != 0);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import static org.assertj.core.api.BDDAssertions.then;
import static pl.amazingcode.threadscollider.multi.MultiThreadsCollider.MultiThreadsColliderBuilder.multiThreadsCollider;

import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.RepeatedTest;
Expand All @@ -11,24 +13,29 @@
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
final class UseCases_Scenarios {

private static final int ACTION_THREADS_COUNT = Runtime.getRuntime().availableProcessors() / 2;

@RepeatedTest(10)
void Thread_safe_counter() {
// Given
Counter counter = new Counter();
List<Exception> exceptions = new ArrayList<>();

// When
try (MultiThreadsCollider threadsCollider =
multiThreadsCollider()
.withAction(counter::increment)
.times(4)
.times(ACTION_THREADS_COUNT)
.withAction(counter::decrement)
.times(4)
.times(ACTION_THREADS_COUNT)
.withThreadsExceptionsConsumer(exceptions::add)
.build()) {

threadsCollider.collide();
}

// Then
then(counter.value()).isZero();
then(exceptions).isEmpty();
}
}

0 comments on commit d08e8e8

Please sign in to comment.