@Test
public void testRemoveTableKeys() {
MockConnectionFactory factory = new MockConnectionFactory();
List<TableKey<byte[]>> keys = Arrays.asList(new TableKeyImpl<>("k".getBytes(), KeyVersion.NOT_EXISTS),
new TableKeyImpl<>("k1".getBytes(), KeyVersion.NOT_EXISTS));
CompletableFuture<Void> result = helper.removeTableKeys("", "", keys, new MockHostControllerStore(), factory, "",
System.nanoTime());
factory.rp.tableKeysRemoved(new WireCommands.TableKeysRemoved(0, getQualifiedStreamSegmentName("", "", 0L) ));
assertTrue(Futures.await(result));
result = helper.removeTableKeys("", "", keys, new MockHostControllerStore(), factory, "", System.nanoTime());
factory.rp.tableKeyDoesNotExist(new WireCommands.TableKeyDoesNotExist(0, getQualifiedStreamSegmentName("", "", 0L), ""));
assertTrue(Futures.await(result));
result = helper.removeTableKeys("", "", keys, new MockHostControllerStore(), factory, "", System.nanoTime());
factory.rp.tableKeyBadVersion(new WireCommands.TableKeyBadVersion(0, getQualifiedStreamSegmentName("", "", 0L), ""));
AssertExtensions.assertThrows("", result::join,
ex -> ex instanceof WireCommandFailedException &&
(((WireCommandFailedException) ex).getReason() == WireCommandFailedException.Reason.TableKeyBadVersion));
Supplier<CompletableFuture<?>> futureSupplier = () -> helper.removeTableKeys("", "", keys, new MockHostControllerStore(),
factory, "", System.nanoTime());
validateAuthTokenCheckFailed(factory, futureSupplier);
validateWrongHost(factory, futureSupplier);
validateConnectionDropped(factory, futureSupplier);
validateProcessingFailure(factory, futureSupplier);
validateNoSuchSegment(factory, futureSupplier);
}