package com.netflix.priam.agent; import com.netflix.priam.agent.process.AgentProcessManager; import com.netflix.priam.agent.process.AgentProcessMap; import com.netflix.priam.agent.process.IncorrectArgumentsException; import com.netflix.priam.agent.tasks.AgentTask; import com.netflix.priam.agent.tasks.ProcessTask; import org.codehaus.jettison.json.JSONArray; import org.codehaus.jettison.json.JSONObject; import org.junit.Assert; import org.junit.Test; import java.util.concurrent.TimeUnit; import static com.netflix.priam.agent.tasks.ProcessTaskConstants.*; public class TestTasks { @Test public void testStuckProcessAndStop() throws Exception { JSONObject commandObject = new JSONObject(); commandObject.put(FIELD_COMMAND, COMMAND_START); commandObject.put(FIELD_ID, "1"); commandObject.put(FIELD_NAME, "flush"); commandObject.put(FIELD_ARGUMENTS, new JSONArray()); JSONArray commandTab = new JSONArray(); commandTab.put(commandObject); MockAgentConfiguration configuration = new MockAgentConfiguration("localhost"); MockStorage storage = new MockStorage(); storage.setValue(configuration, ProcessTask.ROW_KEY, "localhost", commandTab.toString()); MockNodeStatus nodeStatus = new MockNodeStatus(); AgentProcessManager processManager = new AgentProcessManager(new AgentProcessMap(AgentProcessMap.buildDefaultMap()), configuration, nodeStatus); ProcessTask processTask = new ProcessTask(configuration, processManager, storage); processTask.execute(); Assert.assertTrue(nodeStatus.getFlushLatch().await(5, TimeUnit.SECONDS)); for ( int i = 0; i < 5; ++i ) { Assert.assertEquals(nodeStatus.getOperations().size(), 1); Assert.assertEquals(nodeStatus.getOperations().get(0), "flush"); TimeUnit.SECONDS.sleep(1); } commandObject = new JSONObject(); commandObject.put(FIELD_COMMAND, COMMAND_STOP); commandObject.put(FIELD_ID, "1"); commandTab = new JSONArray(); commandTab.put(commandObject); storage.setValue(configuration, ProcessTask.ROW_KEY, "localhost", commandTab.toString()); processTask.execute(); Assert.assertTrue(processManager.closeAndWaitForCompletion(5, TimeUnit.SECONDS)); Assert.assertEquals(processManager.getActiveProcesses().size(), 0); } @Test public void testIncorrectArguments() throws Exception { MockAgentConfiguration configuration = new MockAgentConfiguration("localhost"); MockNodeStatus nodeStatus = new MockNodeStatus(); AgentProcessManager processManager = new AgentProcessManager(new AgentProcessMap(AgentProcessMap.buildDefaultMap()), configuration, nodeStatus); try { processManager.startProcess("remove-node", "x", new String[0]); Assert.fail(); } catch ( IncorrectArgumentsException e ) { // correct } } @Test public void testAgentTaskBasic() throws Exception { MockNodeStatus nodeStatus = new MockNodeStatus(); JSONObject testInfo = new JSONObject(); testInfo.put("a", "a"); testInfo.put("b", "b"); testInfo.put("c", "c"); nodeStatus.setInfo(testInfo); MockStorage storage = new MockStorage(); MockAgentConfiguration configuration = new MockAgentConfiguration("localhost"); AgentProcessManager processManager = new AgentProcessManager(new AgentProcessMap(AgentProcessMap.buildDefaultMap()), configuration, nodeStatus); try { AgentTask agentTask = new AgentTask(configuration, processManager, nodeStatus, storage); agentTask.execute(); String value = storage.getData().values().iterator().next(); JSONObject obj = new JSONObject(value); JSONObject info = obj.getJSONObject("info"); Assert.assertNotNull(info); Assert.assertEquals(info.get("a"), "a"); Assert.assertEquals(info.get("b"), "b"); Assert.assertEquals(info.get("c"), "c"); } finally { processManager.close(); } } @Test public void testProcessTaskBasic() throws Exception { JSONObject commandObject = new JSONObject(); commandObject.put(FIELD_COMMAND, COMMAND_START); commandObject.put(FIELD_ID, "1"); commandObject.put(FIELD_NAME, "compact"); commandObject.put(FIELD_ARGUMENTS, new JSONArray()); JSONArray commandTab = new JSONArray(); commandTab.put(commandObject); MockAgentConfiguration configuration = new MockAgentConfiguration("localhost"); MockStorage storage = new MockStorage(); storage.setValue(configuration, ProcessTask.ROW_KEY, "localhost", commandTab.toString()); MockNodeStatus nodeStatus = new MockNodeStatus(); AgentProcessManager processManager = new AgentProcessManager(new AgentProcessMap(AgentProcessMap.buildDefaultMap()), configuration, nodeStatus); ProcessTask processTask = new ProcessTask(configuration, processManager, storage); processTask.execute(); Assert.assertTrue(processManager.closeAndWaitForCompletion(5, TimeUnit.SECONDS)); Assert.assertEquals(nodeStatus.getOperations().size(), 1); Assert.assertEquals(nodeStatus.getOperations().get(0), "compact"); Assert.assertEquals(processManager.getActiveProcesses().size(), 0); } }