2021-05-02 19:18:15 +02:00
|
|
|
package it.cavallium.dbengine;
|
2021-04-30 19:15:04 +02:00
|
|
|
|
2021-05-02 19:18:15 +02:00
|
|
|
import static it.cavallium.dbengine.DbTestUtils.*;
|
2021-04-30 19:15:04 +02:00
|
|
|
|
|
|
|
import it.cavallium.dbengine.database.UpdateMode;
|
|
|
|
import java.util.Arrays;
|
2021-05-08 03:09:00 +02:00
|
|
|
import java.util.List;
|
2021-04-30 19:15:04 +02:00
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Map.Entry;
|
|
|
|
import java.util.Objects;
|
|
|
|
import java.util.Set;
|
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
import java.util.stream.Stream;
|
|
|
|
import org.junit.jupiter.params.ParameterizedTest;
|
|
|
|
import org.junit.jupiter.params.provider.Arguments;
|
|
|
|
import org.junit.jupiter.params.provider.MethodSource;
|
|
|
|
import reactor.core.publisher.Flux;
|
|
|
|
import reactor.core.publisher.Mono;
|
|
|
|
import reactor.test.StepVerifier;
|
|
|
|
import reactor.test.StepVerifier.Step;
|
|
|
|
import reactor.util.function.Tuple2;
|
|
|
|
import reactor.util.function.Tuples;
|
|
|
|
|
|
|
|
public class TestDictionaryMap {
|
|
|
|
|
2021-05-02 19:18:15 +02:00
|
|
|
private static boolean isTestBadKeysEnabled() {
|
|
|
|
return System.getProperty("badkeys", "true").equalsIgnoreCase("true");
|
2021-04-30 19:15:04 +02:00
|
|
|
}
|
|
|
|
|
2021-05-02 19:18:15 +02:00
|
|
|
private static final String BIG_STRING
|
|
|
|
= "01234567890123456789012345678901234567890123456789012345678901234567890123456789"
|
|
|
|
+ "01234567890123456789012345678901234567890123456789012345678901234567890123456789"
|
|
|
|
+ "01234567890123456789012345678901234567890123456789012345678901234567890123456789"
|
|
|
|
+ "01234567890123456789012345678901234567890123456789012345678901234567890123456789"
|
|
|
|
+ "01234567890123456789012345678901234567890123456789012345678901234567890123456789"
|
|
|
|
+ "01234567890123456789012345678901234567890123456789012345678901234567890123456789";
|
2021-04-30 19:15:04 +02:00
|
|
|
|
|
|
|
private static Stream<Arguments> provideArgumentsPut() {
|
2021-05-08 03:09:00 +02:00
|
|
|
var goodKeys = List.of("12345");
|
|
|
|
List<String> badKeys;
|
2021-05-02 19:18:15 +02:00
|
|
|
if (isTestBadKeysEnabled()) {
|
2021-05-08 03:09:00 +02:00
|
|
|
badKeys = List.of("", "aaaa", "aaaaaa");
|
2021-05-02 19:18:15 +02:00
|
|
|
} else {
|
2021-05-08 03:09:00 +02:00
|
|
|
badKeys = List.of();
|
2021-05-02 19:18:15 +02:00
|
|
|
}
|
2021-05-08 03:09:00 +02:00
|
|
|
List<Tuple2<String, Boolean>> keys = Stream.concat(
|
2021-04-30 19:15:04 +02:00
|
|
|
goodKeys.stream().map(s -> Tuples.of(s, false)),
|
|
|
|
badKeys.stream().map(s -> Tuples.of(s, true))
|
2021-05-08 03:09:00 +02:00
|
|
|
).collect(Collectors.toList());
|
|
|
|
var values = List.of("", "\0", BIG_STRING);
|
2021-04-30 19:15:04 +02:00
|
|
|
|
|
|
|
return keys
|
|
|
|
.stream()
|
|
|
|
.flatMap(keyTuple -> {
|
|
|
|
Stream<String> strm;
|
|
|
|
if (keyTuple.getT2()) {
|
2021-05-08 03:09:00 +02:00
|
|
|
strm = values.stream().findFirst().stream();
|
2021-04-30 19:15:04 +02:00
|
|
|
} else {
|
|
|
|
strm = values.stream();
|
|
|
|
}
|
|
|
|
return strm.map(val -> Tuples.of(keyTuple.getT1(), val, keyTuple.getT2()));
|
|
|
|
})
|
|
|
|
.flatMap(entryTuple -> Arrays.stream(UpdateMode.values()).map(updateMode -> Tuples.of(updateMode,
|
|
|
|
entryTuple.getT1(),
|
|
|
|
entryTuple.getT2(),
|
|
|
|
entryTuple.getT3()
|
|
|
|
)))
|
2021-05-03 18:07:18 +02:00
|
|
|
.flatMap(entryTuple -> Stream.of(Tuples.of(DbType.MAP, entryTuple.getT1(),
|
|
|
|
entryTuple.getT2(),
|
|
|
|
entryTuple.getT3(),
|
|
|
|
entryTuple.getT4()
|
|
|
|
), Tuples.of(DbType.HASH_MAP, entryTuple.getT1(),
|
|
|
|
entryTuple.getT2(),
|
|
|
|
entryTuple.getT3(),
|
2021-05-08 03:09:00 +02:00
|
|
|
false
|
2021-05-03 18:07:18 +02:00
|
|
|
)))
|
2021-05-08 03:09:00 +02:00
|
|
|
.filter(tuple -> !(tuple.getT1() == DbType.HASH_MAP && tuple.getT2() != UpdateMode.ALLOW))
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(fullTuple -> Arguments.of(fullTuple.getT1(), fullTuple.getT2(), fullTuple.getT3(), fullTuple.getT4(), fullTuple.getT5()));
|
2021-04-30 19:15:04 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPut")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testPut(DbType dbType, UpdateMode updateMode, String key, String value, boolean shouldFail) {
|
2021-04-30 19:15:04 +02:00
|
|
|
var stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMap(map -> map
|
|
|
|
.putValue(key, value)
|
|
|
|
.then(map.getValue(null, key))
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
|
|
|
));
|
|
|
|
if (shouldFail) {
|
|
|
|
stpVer.verifyError();
|
|
|
|
} else {
|
|
|
|
stpVer.expectNext(value).verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPut")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testAtSetAtGet(DbType dbType, UpdateMode updateMode, String key, String value, boolean shouldFail) {
|
2021-04-30 19:15:04 +02:00
|
|
|
var stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMap(map -> map
|
2021-05-12 21:41:47 +02:00
|
|
|
.at(null, key).flatMap(v -> v.set(value).doAfterTerminate(v::release))
|
|
|
|
.then(map.at(null, key).flatMap(v -> v.get(null).doAfterTerminate(v::release)))
|
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
|
|
|
));
|
|
|
|
if (shouldFail) {
|
|
|
|
stpVer.verifyError();
|
|
|
|
} else {
|
|
|
|
stpVer.expectNext(value).verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPut")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testPutAndGetPrevious(DbType dbType, UpdateMode updateMode, String key, String value, boolean shouldFail) {
|
2021-04-30 19:15:04 +02:00
|
|
|
var stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMapMany(map -> Flux
|
|
|
|
.concat(
|
|
|
|
map.putValueAndGetPrevious(key, "error?"),
|
|
|
|
map.putValueAndGetPrevious(key, value),
|
|
|
|
map.putValueAndGetPrevious(key, value)
|
|
|
|
)
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
|
|
|
));
|
|
|
|
if (shouldFail) {
|
|
|
|
stpVer.verifyError();
|
|
|
|
} else {
|
|
|
|
stpVer.expectNext("error?").expectNext(value).verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPut")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testPutValueRemoveAndGetPrevious(DbType dbType, UpdateMode updateMode, String key, String value, boolean shouldFail) {
|
2021-04-30 19:15:04 +02:00
|
|
|
var stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMapMany(map -> Flux
|
|
|
|
.concat(
|
|
|
|
map.removeAndGetPrevious(key),
|
|
|
|
map.putValue(key, value).then(map.removeAndGetPrevious(key)),
|
|
|
|
map.removeAndGetPrevious(key)
|
|
|
|
)
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
|
|
|
));
|
|
|
|
if (shouldFail) {
|
|
|
|
stpVer.verifyError();
|
|
|
|
} else {
|
|
|
|
stpVer.expectNext(value).verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPut")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testPutValueRemoveAndGetStatus(DbType dbType, UpdateMode updateMode, String key, String value, boolean shouldFail) {
|
2021-04-30 19:15:04 +02:00
|
|
|
var stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMapMany(map -> Flux
|
|
|
|
.concat(
|
|
|
|
map.removeAndGetStatus(key),
|
|
|
|
map.putValue(key, value).then(map.removeAndGetStatus(key)),
|
|
|
|
map.removeAndGetStatus(key)
|
|
|
|
)
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
|
|
|
));
|
|
|
|
if (shouldFail) {
|
|
|
|
stpVer.verifyError();
|
|
|
|
} else {
|
|
|
|
stpVer.expectNext(false, true, false).verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPut")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testUpdate(DbType dbType, UpdateMode updateMode, String key, String value, boolean shouldFail) {
|
2021-05-02 19:18:15 +02:00
|
|
|
if (updateMode == UpdateMode.DISALLOW && !isTestBadKeysEnabled()) {
|
|
|
|
return;
|
|
|
|
}
|
2021-04-30 19:15:04 +02:00
|
|
|
var stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMapMany(map -> Flux
|
|
|
|
.concat(
|
|
|
|
map.updateValue(key, old -> {
|
|
|
|
assert old == null;
|
|
|
|
return "error?";
|
|
|
|
}),
|
|
|
|
map.updateValue(key, false, old -> {
|
|
|
|
assert Objects.equals(old, "error?");
|
|
|
|
return "error?";
|
|
|
|
}),
|
|
|
|
map.updateValue(key, true, old -> {
|
|
|
|
assert Objects.equals(old, "error?");
|
|
|
|
return "error?";
|
|
|
|
}),
|
|
|
|
map.updateValue(key, true, old -> {
|
|
|
|
assert Objects.equals(old, "error?");
|
|
|
|
return value;
|
|
|
|
}),
|
|
|
|
map.updateValue(key, true, old -> {
|
|
|
|
assert Objects.equals(old, value);
|
|
|
|
return value;
|
|
|
|
})
|
|
|
|
)
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
|
|
|
));
|
|
|
|
if (updateMode == UpdateMode.DISALLOW || shouldFail) {
|
|
|
|
stpVer.verifyError();
|
|
|
|
} else {
|
|
|
|
stpVer.expectNext(true, false, false, true, false).verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPut")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testUpdateGet(DbType dbType, UpdateMode updateMode, String key, String value, boolean shouldFail) {
|
2021-05-02 19:18:15 +02:00
|
|
|
if (updateMode == UpdateMode.DISALLOW && !isTestBadKeysEnabled()) {
|
|
|
|
return;
|
|
|
|
}
|
2021-04-30 19:15:04 +02:00
|
|
|
var stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMapMany(map -> Flux
|
|
|
|
.concat(
|
|
|
|
map.updateValue(key, old -> {
|
|
|
|
assert old == null;
|
|
|
|
return "error?";
|
|
|
|
}).then(map.getValue(null, key)),
|
|
|
|
map.updateValue(key, false, old -> {
|
|
|
|
assert Objects.equals(old, "error?");
|
|
|
|
return "error?";
|
|
|
|
}).then(map.getValue(null, key)),
|
|
|
|
map.updateValue(key, true, old -> {
|
|
|
|
assert Objects.equals(old, "error?");
|
|
|
|
return "error?";
|
|
|
|
}).then(map.getValue(null, key)),
|
|
|
|
map.updateValue(key, true, old -> {
|
|
|
|
assert Objects.equals(old, "error?");
|
|
|
|
return value;
|
|
|
|
}).then(map.getValue(null, key)),
|
|
|
|
map.updateValue(key, true, old -> {
|
|
|
|
assert Objects.equals(old, value);
|
|
|
|
return value;
|
|
|
|
}).then(map.getValue(null, key))
|
|
|
|
)
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
|
|
|
));
|
|
|
|
if (updateMode == UpdateMode.DISALLOW || shouldFail) {
|
|
|
|
stpVer.verifyError();
|
|
|
|
} else {
|
|
|
|
stpVer.expectNext("error?", "error?", "error?", value, value).verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPut")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testPutAndGetChanged(DbType dbType, UpdateMode updateMode, String key, String value, boolean shouldFail) {
|
2021-04-30 19:15:04 +02:00
|
|
|
var stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMapMany(map -> Flux
|
|
|
|
.concat(
|
2021-05-02 19:18:15 +02:00
|
|
|
map.putValueAndGetChanged(key, "error?").single(),
|
|
|
|
map.putValueAndGetChanged(key, value).single(),
|
|
|
|
map.putValueAndGetChanged(key, value).single(),
|
2021-04-30 19:15:04 +02:00
|
|
|
map.remove(key),
|
2021-05-02 19:18:15 +02:00
|
|
|
map.putValueAndGetChanged(key, "error?").single()
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
|
|
|
));
|
|
|
|
if (shouldFail) {
|
|
|
|
stpVer.verifyError();
|
|
|
|
} else {
|
2021-05-02 19:18:15 +02:00
|
|
|
stpVer.expectNext(true, true, false, true).verifyComplete();
|
2021-04-30 19:15:04 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static Stream<Arguments> provideArgumentsPutMulti() {
|
2021-05-08 03:09:00 +02:00
|
|
|
var goodKeys = List.of(List.of("12345", "67890"), List.<String>of());
|
|
|
|
List<List<String>> badKeys;
|
2021-05-02 19:18:15 +02:00
|
|
|
if (isTestBadKeysEnabled()) {
|
2021-05-08 03:09:00 +02:00
|
|
|
badKeys = List.of(List.of("", "12345"), List.of("45678", "aaaa"), List.of("aaaaaa", "capra"));
|
2021-05-02 19:18:15 +02:00
|
|
|
} else {
|
2021-05-08 03:09:00 +02:00
|
|
|
badKeys = List.of();
|
2021-05-02 19:18:15 +02:00
|
|
|
}
|
2021-05-08 03:09:00 +02:00
|
|
|
List<Tuple2<List<String>, Boolean>> keys = Stream.concat(
|
2021-04-30 19:15:04 +02:00
|
|
|
goodKeys.stream().map(s -> Tuples.of(s, false)),
|
|
|
|
badKeys.stream().map(s -> Tuples.of(s, true))
|
2021-05-08 03:09:00 +02:00
|
|
|
).collect(Collectors.toList());
|
|
|
|
var values = List.of("", "\0", BIG_STRING);
|
2021-04-30 19:15:04 +02:00
|
|
|
|
|
|
|
return keys
|
|
|
|
.stream()
|
|
|
|
.map(keyTuple -> keyTuple.mapT1(ks -> Flux
|
|
|
|
.zip(Flux.fromIterable(ks), Flux.fromIterable(values))
|
|
|
|
.collectMap(Tuple2::getT1, Tuple2::getT2)
|
|
|
|
.block()
|
|
|
|
))
|
|
|
|
.flatMap(entryTuple -> Arrays.stream(UpdateMode.values()).map(updateMode -> Tuples.of(updateMode,
|
|
|
|
entryTuple.getT1(),
|
|
|
|
entryTuple.getT2()
|
|
|
|
)))
|
2021-05-03 18:07:18 +02:00
|
|
|
.flatMap(entryTuple -> Stream.of(Tuples.of(DbType.MAP, entryTuple.getT1(),
|
|
|
|
entryTuple.getT2(),
|
|
|
|
entryTuple.getT3()
|
|
|
|
), Tuples.of(DbType.HASH_MAP, entryTuple.getT1(),
|
|
|
|
entryTuple.getT2(),
|
2021-05-08 03:09:00 +02:00
|
|
|
false
|
2021-05-03 18:07:18 +02:00
|
|
|
)))
|
2021-05-08 03:09:00 +02:00
|
|
|
.filter(tuple -> !(tuple.getT1() == DbType.HASH_MAP && tuple.getT2() != UpdateMode.ALLOW))
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(fullTuple -> Arguments.of(fullTuple.getT1(), fullTuple.getT2(), fullTuple.getT3(), fullTuple.getT4()));
|
2021-04-30 19:15:04 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPutMulti")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testPutMultiGetMulti(DbType dbType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
2021-04-30 19:15:04 +02:00
|
|
|
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
|
|
|
Step<Entry<String, String>> stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMapMany(map -> Flux
|
|
|
|
.concat(
|
|
|
|
map.putMulti(Flux.fromIterable(entries.entrySet())).then(Mono.empty()),
|
|
|
|
map.getMulti(null, Flux.fromIterable(entries.keySet()))
|
|
|
|
)
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
|
|
|
));
|
|
|
|
if (shouldFail) {
|
|
|
|
stpVer.verifyError();
|
|
|
|
} else {
|
|
|
|
entries.forEach((k, v) -> remainingEntries.add(Map.entry(k, v)));
|
|
|
|
for (Entry<String, String> ignored : remainingEntries) {
|
|
|
|
stpVer = stpVer.expectNextMatches(remainingEntries::remove);
|
|
|
|
}
|
|
|
|
stpVer.verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPutMulti")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testSetAllValuesGetMulti(DbType dbType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
2021-04-30 19:15:04 +02:00
|
|
|
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
|
|
|
Step<Entry<String, String>> stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMapMany(map -> map
|
|
|
|
.setAllValues(Flux.fromIterable(entries.entrySet()))
|
|
|
|
.thenMany(map.getMulti(null, Flux.fromIterable(entries.keySet())))
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
|
|
|
));
|
|
|
|
if (shouldFail) {
|
|
|
|
stpVer.verifyError();
|
|
|
|
} else {
|
|
|
|
entries.forEach((k, v) -> remainingEntries.add(Map.entry(k, v)));
|
|
|
|
for (Entry<String, String> ignored : remainingEntries) {
|
|
|
|
stpVer = stpVer.expectNextMatches(remainingEntries::remove);
|
|
|
|
}
|
|
|
|
stpVer.verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPutMulti")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testSetAllValuesAndGetPrevious(DbType dbType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
2021-04-30 19:15:04 +02:00
|
|
|
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
|
|
|
Step<Entry<String, String>> stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMapMany(map -> Flux
|
|
|
|
.concat(
|
|
|
|
map.setAllValuesAndGetPrevious(Flux.fromIterable(entries.entrySet())),
|
|
|
|
map.setAllValuesAndGetPrevious(Flux.fromIterable(entries.entrySet()))
|
|
|
|
)
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
|
|
|
));
|
|
|
|
if (shouldFail) {
|
|
|
|
stpVer.verifyError();
|
|
|
|
} else {
|
|
|
|
entries.forEach((k, v) -> remainingEntries.add(Map.entry(k, v)));
|
|
|
|
for (Entry<String, String> ignored : remainingEntries) {
|
|
|
|
stpVer = stpVer.expectNextMatches(remainingEntries::remove);
|
|
|
|
}
|
|
|
|
stpVer.verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPutMulti")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testSetGetMulti(DbType dbType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
2021-04-30 19:15:04 +02:00
|
|
|
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
|
|
|
Step<Entry<String, String>> stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMapMany(map -> Flux
|
|
|
|
.concat(
|
|
|
|
map.set(entries).then(Mono.empty()),
|
|
|
|
map.getMulti(null, Flux.fromIterable(entries.keySet()))
|
|
|
|
)
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
|
|
|
));
|
|
|
|
if (shouldFail) {
|
|
|
|
stpVer.verifyError();
|
|
|
|
} else {
|
|
|
|
entries.forEach((k, v) -> remainingEntries.add(Map.entry(k, v)));
|
|
|
|
for (Entry<String, String> ignored : remainingEntries) {
|
|
|
|
stpVer = stpVer.expectNextMatches(remainingEntries::remove);
|
|
|
|
}
|
|
|
|
stpVer.verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPutMulti")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testSetAndGetChanged(DbType dbType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
2021-04-30 19:15:04 +02:00
|
|
|
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
|
|
|
Step<Boolean> stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMapMany(map -> {
|
|
|
|
Mono<Void> removalMono;
|
|
|
|
if (entries.isEmpty()) {
|
|
|
|
removalMono = Mono.empty();
|
|
|
|
} else {
|
2021-05-08 03:09:00 +02:00
|
|
|
removalMono = map.remove(entries.keySet().stream().findFirst().orElseThrow());
|
2021-04-30 19:15:04 +02:00
|
|
|
}
|
|
|
|
return Flux
|
|
|
|
.concat(
|
|
|
|
map.setAndGetChanged(entries).single(),
|
|
|
|
map.setAndGetChanged(entries).single(),
|
|
|
|
removalMono.then(Mono.empty()),
|
|
|
|
map.setAndGetChanged(entries).single()
|
|
|
|
)
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release);
|
2021-04-30 19:15:04 +02:00
|
|
|
})
|
|
|
|
));
|
|
|
|
if (shouldFail) {
|
|
|
|
stpVer.verifyError();
|
|
|
|
} else {
|
|
|
|
stpVer.expectNext(!entries.isEmpty(), false, !entries.isEmpty()).verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPutMulti")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testSetAndGetPrevious(DbType dbType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
2021-04-30 19:15:04 +02:00
|
|
|
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
|
|
|
Step<Entry<String, String>> stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMapMany(map -> Flux
|
|
|
|
.concat(map.setAndGetPrevious(entries), map.setAndGetPrevious(entries))
|
|
|
|
.map(Map::entrySet)
|
|
|
|
.flatMap(Flux::fromIterable)
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
|
|
|
));
|
|
|
|
if (shouldFail) {
|
|
|
|
stpVer.verifyError();
|
|
|
|
} else {
|
|
|
|
entries.forEach((k, v) -> remainingEntries.add(Map.entry(k, v)));
|
|
|
|
for (Entry<String, String> ignored : remainingEntries) {
|
|
|
|
stpVer = stpVer.expectNextMatches(remainingEntries::remove);
|
|
|
|
}
|
|
|
|
stpVer.verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPutMulti")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testSetClearAndGetPreviousGet(DbType dbType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
2021-04-30 19:15:04 +02:00
|
|
|
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
|
|
|
Step<Entry<String, String>> stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMapMany(map -> Flux
|
|
|
|
.concat(map.set(entries).then(Mono.empty()), map.clearAndGetPrevious(), map.get(null))
|
|
|
|
.map(Map::entrySet)
|
|
|
|
.flatMap(Flux::fromIterable)
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
|
|
|
));
|
|
|
|
if (shouldFail) {
|
|
|
|
stpVer.verifyError();
|
|
|
|
} else {
|
|
|
|
entries.forEach((k, v) -> remainingEntries.add(Map.entry(k, v)));
|
|
|
|
for (Entry<String, String> ignored : remainingEntries) {
|
|
|
|
stpVer = stpVer.expectNextMatches(remainingEntries::remove);
|
|
|
|
}
|
|
|
|
stpVer.verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPutMulti")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testPutMultiGetAllValues(DbType dbType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
2021-04-30 19:15:04 +02:00
|
|
|
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
|
|
|
Step<Entry<String, String>> stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMapMany(map -> Flux
|
|
|
|
.concat(
|
|
|
|
map.putMulti(Flux.fromIterable(entries.entrySet())).then(Mono.empty()),
|
|
|
|
map.getAllValues(null)
|
|
|
|
)
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
|
|
|
));
|
|
|
|
if (shouldFail) {
|
|
|
|
stpVer.verifyError();
|
|
|
|
} else {
|
|
|
|
entries.forEach((k, v) -> remainingEntries.add(Map.entry(k, v)));
|
|
|
|
for (Entry<String, String> ignored : remainingEntries) {
|
|
|
|
stpVer = stpVer.expectNextMatches(remainingEntries::remove);
|
|
|
|
}
|
|
|
|
stpVer.verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPutMulti")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testPutMultiGet(DbType dbType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
2021-04-30 19:15:04 +02:00
|
|
|
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
|
|
|
Step<Entry<String, String>> stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMapMany(map -> Flux
|
|
|
|
.concat(
|
|
|
|
map.putMulti(Flux.fromIterable(entries.entrySet())).then(Mono.empty()),
|
|
|
|
map.get(null)
|
|
|
|
.map(Map::entrySet)
|
|
|
|
.flatMapMany(Flux::fromIterable)
|
|
|
|
)
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
|
|
|
));
|
|
|
|
if (shouldFail) {
|
|
|
|
stpVer.verifyError();
|
|
|
|
} else {
|
|
|
|
entries.forEach((k, v) -> remainingEntries.add(Map.entry(k, v)));
|
|
|
|
for (Entry<String, String> ignored : remainingEntries) {
|
|
|
|
stpVer = stpVer.expectNextMatches(remainingEntries::remove);
|
|
|
|
}
|
|
|
|
stpVer.verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPutMulti")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testPutMultiGetAllStagesGet(DbType dbType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
2021-04-30 19:15:04 +02:00
|
|
|
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
|
|
|
Step<Entry<String, String>> stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMapMany(map -> Flux
|
|
|
|
.concat(
|
|
|
|
map.putMulti(Flux.fromIterable(entries.entrySet())).then(Mono.empty()),
|
|
|
|
map
|
|
|
|
.getAllStages(null)
|
|
|
|
.flatMap(stage -> stage
|
|
|
|
.getValue()
|
|
|
|
.get(null)
|
|
|
|
.map(val -> Map.entry(stage.getKey(), val))
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(() -> stage.getValue().release())
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
|
|
|
)
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
|
|
|
));
|
|
|
|
if (shouldFail) {
|
|
|
|
stpVer.verifyError();
|
|
|
|
} else {
|
|
|
|
entries.forEach((k, v) -> remainingEntries.add(Map.entry(k, v)));
|
|
|
|
for (Entry<String, String> ignored : remainingEntries) {
|
|
|
|
stpVer = stpVer.expectNextMatches(remainingEntries::remove);
|
|
|
|
}
|
|
|
|
stpVer.verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPutMulti")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testPutMultiIsEmpty(DbType dbType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
2021-04-30 19:15:04 +02:00
|
|
|
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
|
|
|
Step<Boolean> stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMapMany(map -> Flux
|
|
|
|
.concat(
|
|
|
|
map.isEmpty(null),
|
|
|
|
map.putMulti(Flux.fromIterable(entries.entrySet())).then(Mono.empty()),
|
|
|
|
map.isEmpty(null)
|
|
|
|
)
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
2021-05-08 03:09:00 +02:00
|
|
|
.flatMap(val -> shouldFail ? Mono.empty() : Mono.just(val))
|
2021-04-30 19:15:04 +02:00
|
|
|
));
|
|
|
|
if (shouldFail) {
|
2021-05-08 03:09:00 +02:00
|
|
|
stpVer.verifyError();
|
2021-04-30 19:15:04 +02:00
|
|
|
} else {
|
|
|
|
stpVer.expectNext(true, entries.isEmpty()).verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@ParameterizedTest
|
|
|
|
@MethodSource("provideArgumentsPutMulti")
|
2021-05-03 18:07:18 +02:00
|
|
|
public void testPutMultiClear(DbType dbType, UpdateMode updateMode, Map<String, String> entries, boolean shouldFail) {
|
2021-04-30 19:15:04 +02:00
|
|
|
var remainingEntries = new ConcurrentHashMap<Entry<String, String>, Boolean>().keySet(true);
|
|
|
|
Step<Boolean> stpVer = StepVerifier
|
|
|
|
.create(tempDb(db -> tempDictionary(db, updateMode)
|
2021-05-03 18:07:18 +02:00
|
|
|
.map(dict -> tempDatabaseMapDictionaryMap(dict, dbType, 5))
|
2021-04-30 19:15:04 +02:00
|
|
|
.flatMapMany(map -> Flux
|
|
|
|
.concat(
|
|
|
|
map.isEmpty(null),
|
|
|
|
map.putMulti(Flux.fromIterable(entries.entrySet())).then(Mono.empty()),
|
|
|
|
map.isEmpty(null),
|
|
|
|
map.clear().then(Mono.empty()),
|
|
|
|
map.isEmpty(null)
|
|
|
|
)
|
2021-05-12 21:41:47 +02:00
|
|
|
.doAfterTerminate(map::release)
|
2021-04-30 19:15:04 +02:00
|
|
|
)
|
2021-05-08 03:09:00 +02:00
|
|
|
.flatMap(val -> shouldFail ? Mono.empty() : Mono.just(val))
|
2021-04-30 19:15:04 +02:00
|
|
|
));
|
|
|
|
if (shouldFail) {
|
2021-05-08 03:09:00 +02:00
|
|
|
stpVer.verifyError();
|
2021-04-30 19:15:04 +02:00
|
|
|
} else {
|
|
|
|
stpVer.expectNext(true, entries.isEmpty(), true).verifyComplete();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|