package org.forgerock.openidm.cluster;
import static org.forgerock.json.JsonValue.field;
import static org.forgerock.json.JsonValue.json;
import static org.forgerock.json.JsonValue.object;
import java.io.IOException;
import org.assertj.core.api.Assertions;
import org.forgerock.openidm.router.IDMConnectionFactoryWrapper;
import org.forgerock.services.context.RootContext;
import org.forgerock.json.JsonValue;
import org.forgerock.json.resource.ReadRequest;
import org.forgerock.json.resource.RequestHandler;
import org.forgerock.json.resource.Requests;
import org.forgerock.json.resource.ResourceException;
import org.forgerock.json.resource.ResourceResponse;
import org.forgerock.json.resource.Resources;
import org.forgerock.openidm.cluster.mocks.MockRepositoryService;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
/**
* Tests {@link ClusterManager}
*/
public class ClusterManagerTest {
private static JsonValue config = json(object(
field("instanceId", "test-node"),
field("instanceTimeout", "30000"),
field("instanceRecoveryTimeout", "30000"),
field("instanceCheckInInterval", "5000"),
field("instanceCheckInOffset", "0"),
field("enabled", true)));
private RequestHandler clusterHandler = null;
private ClusterManagementService clusterService = null;
@BeforeMethod
public void setUp() throws ResourceException, InterruptedException {
final ClusterManager clusterManager = new ClusterManager();
final MockRepositoryService mockRepoService = new MockRepositoryService();
clusterManager.repoService = mockRepoService;
clusterManager.connectionFactory = new IDMConnectionFactoryWrapper(Resources.newInternalConnectionFactory(mockRepoService));
clusterManager.init(config);
clusterHandler = clusterManager;
clusterService = clusterManager;
// Start the Cluster Management Service thread
clusterService.startClusterManagement();
// Allow enough time for the cluster management thread
// to initialize the node data in the repository
Thread.sleep(1000);
}
@AfterMethod
public void tearDown() throws ResourceException {
// Stop the Cluster Management Service thread
clusterService.stopClusterManagement();
}
@Test
public void testReadEntry() throws ResourceException, Exception {
final ReadRequest readRequest = Requests.newReadRequest("test-node");
final ResourceResponse resource = clusterHandler.handleRead(new RootContext(), readRequest).get();
// Test basic instance fields
Assertions.assertThat(resource.getContent().get("state").asString()).isEqualTo("running");
Assertions.assertThat(resource.getContent().get("instanceId").asString()).isEqualTo("test-node");
Assertions.assertThat(resource.getContent().get("startup").asString()).isNotNull();
Assertions.assertThat(resource.getContent().get("shutdown").asString()).isEqualTo("");
}
@Test
public void testClusterManagement() throws ResourceException, IOException {
// Test basic ClusterManagementService methods
Assertions.assertThat(clusterService.getInstanceId()).isEqualTo("test-node");
Assertions.assertThat(clusterService.isEnabled()).isTrue();
Assertions.assertThat(clusterService.isStarted()).isTrue();
}
}