package integration_tests.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import integration_tests.tests_framework.TestsSuite;
import java.util.List;
import java.util.Map;
import org.junit.Ignore;
import org.junit.Test;
import codeine.CodeineApiClient;
import codeine.api.CommandExcutionType;
import codeine.api.CommandStatusJson;
import codeine.api.DurationUnits;
import codeine.api.NodeInfo;
import codeine.api.NodeWithMonitorsInfo;
import codeine.api.NodeWithPeerInfo;
import codeine.api.RatioType;
import codeine.api.ScehudleCommandExecutionInfo;
import codeine.api.VersionItemInfo;
import codeine.jsons.collectors.CollectorInfo;
import codeine.jsons.collectors.CollectorInfo.CollectorType;
import codeine.jsons.command.CommandInfo;
import codeine.jsons.command.CommandParameterInfo;
import codeine.jsons.project.CodeineProject;
import codeine.jsons.project.ProjectJson;
import codeine.utils.ThreadUtils;
import codeine.utils.network.InetUtils;
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
public class BasicTest extends TestsSuite {
private static final String TEST_PROJECT_NAME = "integration_test_project";
private static final String TEST_COMMAND_NAME = "test_command";
private static final String TEST_COLLECTOR_NAME = "test_collector";
private ProjectJson project;
private String file = "/tmp/codeine_integration_test_" + System.currentTimeMillis();
public BasicTest() {
super();
initProject();
}
private void initProject() {
project = new ProjectJson(TEST_PROJECT_NAME);
project.nodes_info().add(new NodeInfo(InetUtils.getLocalHost().getHostName()));
CollectorInfo collector = new CollectorInfo(TEST_COLLECTOR_NAME, "echo 'hi'", null, null, CollectorType.Monitor, false);
project.collectors().add(collector);
CommandExcutionType command_strategy = CommandExcutionType.Single;
Integer duration = null;
Integer concurrency = 1;
Integer error_percent_val = null;
DurationUnits duration_units = null;
String script_content = "touch " + file;
List<CommandParameterInfo> parameters = Lists.newArrayList();
Boolean prevent_override = false;
RatioType ratio = null;
CommandInfo command = new CommandInfo(TEST_COMMAND_NAME, "description", project.name(), null, 1, null, duration, concurrency, error_percent_val, command_strategy, false, duration_units, ratio , false, prevent_override, parameters, script_content);
project.commands().add(command);
}
@Test
public void sanityTest() {
final CodeineApiClient client = new CodeineApiClient(codeineConf().web_server_host(), codeineConf().web_server_port());
List<CodeineProject> projects = client.projects();
assertEquals(1, projects.size());
final ProjectJson projectJson = client.project(TEST_PROJECT_NAME);
final Map<String, VersionItemInfo> projectStatus = client.projectStatus(TEST_PROJECT_NAME);
NodesCountPredicate predicate = new NodesCountPredicate(projectStatus, client, projectJson);
assertBusyWait(predicate, 60);
assertEquals(1, predicate.size);
}
@Test
@Ignore
public void testCollector() {
final CodeineApiClient client = new CodeineApiClient(codeineConf().web_server_host(), codeineConf().web_server_port());
List<CodeineProject> projects = client.projects();
assertEquals(1, projects.size());
final ProjectJson projectJson = client.project(TEST_PROJECT_NAME);
final Map<String, VersionItemInfo> projectStatus = client.projectStatus(TEST_PROJECT_NAME);
NodesCountPredicate predicate = new NodesCountPredicate(projectStatus, client, projectJson);
assertBusyWait(predicate, 60);
assertTrue(predicate.nodes.get(0).collectors().get(TEST_COLLECTOR_NAME).isSuccess());
}
@Test
@Ignore
public void testCommand() {
final CodeineApiClient client = new CodeineApiClient(codeineConf().web_server_host(), codeineConf().web_server_port());
List<CodeineProject> projects = client.projects();
assertEquals(1, projects.size());
CommandInfo command_info = new CommandInfo(TEST_COMMAND_NAME, TEST_PROJECT_NAME);
ScehudleCommandExecutionInfo data = new ScehudleCommandExecutionInfo(command_info, Lists.<NodeWithPeerInfo>newArrayList(), true);
client.runCommand(data);
ThreadUtils.sleep(5000);
List<CommandStatusJson> commandHistory = client.commandHistory(TEST_PROJECT_NAME);
assertEquals(1, commandHistory.size());
assertTrue(commandHistory.get(0).finished());
assertEquals(100, commandHistory.get(0).successPercent);
}
@Override
protected ProjectJson getProjectConfiguration() {
return project;
}
public static boolean assertBusyWait(Predicate<Void> predicate, int timesToCheck)
{
if (timesToCheck <= 0) {
throw new IllegalArgumentException("timesToCheck less than 1 " + timesToCheck);
}
for (int counter = 0; counter < timesToCheck; ++counter)
{
if (predicate.apply(null))
{
return true;
}
ThreadUtils.sleep(1000);
}
return false;
}
private static final class NodesCountPredicate implements Predicate<Void> {
private final Map<String, VersionItemInfo> projectStatus;
private final CodeineApiClient client;
private final ProjectJson projectJson;
private int size;
private List<NodeWithMonitorsInfo> nodes;
private NodesCountPredicate(Map<String, VersionItemInfo> projectStatus, CodeineApiClient client,
ProjectJson projectJson) {
this.projectStatus = projectStatus;
this.client = client;
this.projectJson = projectJson;
}
@Override
public boolean apply(Void arg0) {
nodes = Lists.newArrayList(client.projectNodes(projectJson.name(), projectStatus.entrySet().iterator().next().getKey()));
size = nodes.size();
return size == 1;
}
}
}