FileSponge/src/test/lombok/org/warp/filesponge/ThreadSafety.java

46 lines
1.2 KiB
Java

package org.warp.filesponge;
import java.util.LinkedList;
import java.util.List;
import org.junit.jupiter.api.Test;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Scheduler;
import reactor.core.scheduler.Schedulers;
import reactor.test.StepVerifier;
public class ThreadSafety {
@Test
public void threadSafety() {
Scheduler schedulerSingle = Schedulers.newSingle("treadSafeScheduler");
Scheduler schedulerParallel = Schedulers.newParallel("threadUnsafeScheduler", 20);
int iterations = 500;
List<Integer> list = new LinkedList<>();
var flux = Flux.range(0, iterations)
.flatMap(s -> Mono.fromCallable(() -> {
list.add(s);
return s;
}).then(Mono.fromCallable(() -> {
list.add(1);
return s;
})).subscribeOn(schedulerSingle))
.ignoreElements()
.thenMany(Flux.defer(() -> Flux.fromIterable(list)))
.subscribeOn(schedulerParallel);
Integer[] checks = new Integer[iterations * 2];
for (int i = 0; i < iterations; i++) {
checks[i * 2] = i;
checks[i * 2 + 1] = 1;
}
StepVerifier
.create(flux)
.expectSubscription()
.expectNext(checks)
.verifyComplete();
}
}