package banking; import dev.banking.model.BankAccount; import org.junit.jupiter.api.Test; import java.util.concurrent.*; import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively; import java.time.Duration; public class BankAccountTransferDeadlockTest { @Test void deadlockFreeTransfers() { assertTimeoutPreemptively(Duration.ofSeconds(5), () -> { BankAccount a = new BankAccount(1, 1_000_000); BankAccount b = new BankAccount(2, 1_000_000); ExecutorService executor = Executors.newFixedThreadPool(50); for (int i = 0; i < 50_000; i++) { executor.submit(() -> a.transfer(b, 1)); executor.submit(() -> b.transfer(a, 1)); } executor.shutdown(); executor.awaitTermination(5, TimeUnit.SECONDS); }); } }