package com.lordofthejars.nosqlunit.mongodb.integration;
import com.lordofthejars.nosqlunit.mongodb.MongoDbCommands;
import com.lordofthejars.nosqlunit.mongodb.replicaset.ReplicaSetManagedMongoDb;
import com.mongodb.MongoClient;
import org.bson.Document;
import org.junit.AfterClass;
import org.junit.ClassRule;
import org.junit.Test;
import java.net.UnknownHostException;
import java.util.List;
import static com.lordofthejars.nosqlunit.mongodb.ManagedMongoDbLifecycleManagerBuilder.newManagedMongoDbLifecycle;
import static com.lordofthejars.nosqlunit.mongodb.replicaset.ReplicaSetBuilder.replicaSet;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
public class WhenReplicaSetIsRequired {
static {
System.setProperty("MONGO_HOME", "/opt/mongo");
}
@ClassRule
public static ReplicaSetManagedMongoDb replicaSetManagedMongoDb = replicaSet("rs-test")
.eligible(
newManagedMongoDbLifecycle().port(27017).dbRelativePath("rs-0").logRelativePath("log-0").get()
)
.eligible(
newManagedMongoDbLifecycle().port(27018).dbRelativePath("rs-1").logRelativePath("log-1").get()
)
.eligible(
newManagedMongoDbLifecycle().port(27019).dbRelativePath("rs-2").logRelativePath("log-2").get()
)
.get();
@AfterClass
public static void tearDown() {
System.clearProperty("MONGO_HOME");
}
@Test
public void three_member_set_scenario_should_be_started() throws UnknownHostException, InterruptedException {
MongoClient mongoClient = new MongoClient("localhost", 27017);
Document replicaSetGetStatus = MongoDbCommands.replicaSetGetStatus(mongoClient);
assertThat(countPrimary(replicaSetGetStatus), is(1));
assertThat(countSecondaries(replicaSetGetStatus), is(2));
mongoClient.close();
}
@Test
public void server_should_be_able_to_stopped_programmatically() throws UnknownHostException {
replicaSetManagedMongoDb.shutdownServer(27017);
replicaSetManagedMongoDb.waitUntilReplicaSetBecomesStable();
MongoClient mongoClient = new MongoClient("localhost", 27018);
Document replicaSetGetStatus = MongoDbCommands.replicaSetGetStatus(mongoClient);
assertThat(countPrimary(replicaSetGetStatus), is(1));
assertThat(countSecondaries(replicaSetGetStatus), is(1));
mongoClient.close();
}
private int countSecondaries(Document configuration) {
return countStates(configuration, "SECONDARY");
}
private int countPrimary(Document configuration) {
return countStates(configuration, "PRIMARY");
}
private int countStates(Document configuration, String wantedState) {
int number = 0;
List<Document> basicDBList = configuration.get("members", List.class);
for (Document object : basicDBList) {
String state = object.getString("stateStr");
if (state.equalsIgnoreCase(wantedState)) {
number++;
}
}
return number;
}
}