package org.corfudb.runtime.clients;
import lombok.Getter;
import org.corfudb.AbstractCorfuTest;
import org.corfudb.infrastructure.AbstractServer;
import org.corfudb.infrastructure.ServerContext;
import org.corfudb.infrastructure.ServerContextBuilder;
import org.corfudb.infrastructure.TestServerRouter;
import org.corfudb.runtime.CorfuRuntime;
import org.junit.Before;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by mwei on 12/13/15.
*/
public abstract class AbstractClientTest extends AbstractCorfuTest {
/**
* Initialize the AbstractClientTest.
*/
public AbstractClientTest() {
// Force all new CorfuRuntimes to override the getRouterFn
CorfuRuntime.overrideGetRouterFunction = this::getRouterFunction;
}
@Getter
TestClientRouter router;
@Getter
TestServerRouter serverRouter;
@Before
public void resetTest() {
serverRouter = new TestServerRouter();
router = new TestClientRouter(serverRouter);
getServersForTest().stream().forEach(serverRouter::addServer);
getClientsForTest().stream().forEach(router::addClient);
}
/**
* A map of maps to endpoint->routers, mapped for each runtime instance captured
*/
final Map<CorfuRuntime, Map<String, TestClientRouter>>
runtimeRouterMap = new ConcurrentHashMap<>();
/**
* Function for obtaining a router, given a runtime and an endpoint.
*
* @param runtime The CorfuRuntime to obtain a router for.
* @param endpoint An endpoint string for the router.
* @return
*/
private IClientRouter getRouterFunction(CorfuRuntime runtime, String endpoint) {
runtimeRouterMap.putIfAbsent(runtime, new ConcurrentHashMap<>());
if (!endpoint.startsWith("test:")) {
throw new RuntimeException("Unsupported endpoint in test: " + endpoint);
}
return runtimeRouterMap.get(runtime).computeIfAbsent(endpoint,
x -> {
TestClientRouter tcn =
new TestClientRouter(serverRouter);
tcn.addClient(new BaseClient())
.addClient(new SequencerClient())
.addClient(new LayoutClient())
.addClient(new LogUnitClient())
.addClient(new ManagementClient());
return tcn;
}
);
}
abstract Set<AbstractServer> getServersForTest();
abstract Set<IClient> getClientsForTest();
public ServerContext defaultServerContext() {
return new ServerContextBuilder()
.setInitialToken(0)
.setMemory(true)
.setSingle(false)
.setServerRouter(serverRouter)
.build();
}
}