package org.opennaas.itests.core.queue;
import static org.openengsb.labs.paxexam.karaf.options.KarafDistributionOption.keepRuntimeFolder;
import static org.opennaas.itests.helpers.OpennaasExamOptions.includeFeatures;
import static org.opennaas.itests.helpers.OpennaasExamOptions.includeSwissboxFramework;
import static org.opennaas.itests.helpers.OpennaasExamOptions.noConsole;
import static org.opennaas.itests.helpers.OpennaasExamOptions.opennaasDistributionConfiguration;
import static org.ops4j.pax.exam.CoreOptions.options;
import static org.ops4j.pax.swissbox.framework.ServiceLookup.getService;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.opennaas.core.resources.CorruptStateException;
import org.opennaas.core.resources.IResource;
import org.opennaas.core.resources.IResourceManager;
import org.opennaas.core.resources.IncorrectLifecycleStateException;
import org.opennaas.core.resources.ResourceException;
import org.opennaas.core.resources.action.ActionResponse;
import org.opennaas.core.resources.capability.CapabilityException;
import org.opennaas.core.resources.capability.ICapabilityFactory;
import org.opennaas.core.resources.capability.ICapabilityLifecycle;
import org.opennaas.core.resources.command.Response;
import org.opennaas.core.resources.descriptor.CapabilityDescriptor;
import org.opennaas.core.resources.descriptor.Information;
import org.opennaas.core.resources.descriptor.ResourceDescriptor;
import org.opennaas.core.resources.descriptor.ResourceDescriptorConstants;
import org.opennaas.core.resources.helpers.ResourceHelper;
import org.opennaas.core.resources.mock.MockActionFactory;
import org.opennaas.core.resources.mock.MockResource;
import org.opennaas.core.resources.protocol.IProtocolManager;
import org.opennaas.core.resources.protocol.ProtocolException;
import org.opennaas.core.resources.queue.ModifyParams;
import org.opennaas.core.resources.queue.QueueResponse;
import org.opennaas.extensions.queuemanager.IQueueManagerCapability;
import org.opennaas.extensions.queuemanager.QueueManager;
import org.opennaas.extensions.router.model.ComputerSystem;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.junit.Configuration;
import org.ops4j.pax.exam.junit.ExamReactorStrategy;
import org.ops4j.pax.exam.junit.JUnit4TestRunner;
import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory;
import org.ops4j.pax.exam.util.Filter;
import org.osgi.framework.BundleContext;
import org.osgi.service.blueprint.container.BlueprintContainer;
/**
* Tests new queue operations. In the sprint for the week 26, it is planned to add new features in the queue.
*
* tasks:
*
* 1.- A queue have to remove elements from its queue list
*
* 2.- The queue has to implement a method to report responses from a list of actions
*
* @author Carlos Báez Ruiz
*
* jira ticket : http://jira.i2cat.net:8080/browse/MANTYCHORE-185
*/
@RunWith(JUnit4TestRunner.class)
@ExamReactorStrategy(AllConfinedStagedReactorFactory.class)
public class QueueTest
{
/*
* Note that the tests in this class have to run in isolation; this is because the initialization code is creating a new queue before each test
* runs.
*/
private final static Log log = LogFactory.getLog(QueueTest.class);
private final static String resourceName = "junosResource";
private String resourceID;
private MockResource mockResource;
private IQueueManagerCapability queueCapability;
private IQueueManagerCapability queueManagerService;
@SuppressWarnings("unused")
@Inject
@Filter(value = "(osgi.blueprint.container.symbolicname=org.opennaas.extensions.router.repository)", timeout = 20000)
private BlueprintContainer routerService;
@SuppressWarnings("unused")
@Inject
@Filter(value = "(osgi.blueprint.container.symbolicname=org.opennaas.extensions.queuemanager)", timeout = 20000)
private BlueprintContainer queueService;
@Inject
private IProtocolManager protocolManager;
@Inject
private IResourceManager resourceManager;
@Inject
@Filter("(capability=queue)")
private ICapabilityFactory queueManagerFactory;
@Inject
private BundleContext bundleContext;
@Configuration
public static Option[] configuration() {
return options(opennaasDistributionConfiguration(),
includeFeatures("opennaas-cim", "opennaas-netconf", "opennaas-router", "opennaas-junos", "itests-helpers"),
includeSwissboxFramework(),
noConsole(),
keepRuntimeFolder());
}
public void initBundles() throws ProtocolException, ResourceException {
/* init capability */
log.info("This is running inside Equinox. With all configuration set up like you specified. ");
/* initialize model */
mockResource = new MockResource();
mockResource.setModel(new ComputerSystem());
ResourceDescriptor resourceDescriptor = new ResourceDescriptor();
/* add queue capability */
Map<String, String> properties = new HashMap<String, String>();
properties.put(ResourceDescriptorConstants.PROTOCOL_URI,
"user:pass@host.net:2212");
List<CapabilityDescriptor> capabilityDescriptors = new ArrayList<CapabilityDescriptor>();
capabilityDescriptors.add(MockResource.createCapabilityDescriptor(QueueManager.QUEUE, "queue"));
resourceDescriptor.setProperties(properties);
resourceDescriptor.setCapabilityDescriptors(capabilityDescriptors);
Information info = new Information();
info.setName(resourceName);
info.setType("router");
resourceDescriptor.setInformation(info);
mockResource.setResourceDescriptor(resourceDescriptor);
// will not be the same that mockResource but will do the trick
IResource resource = resourceManager.createResource(resourceDescriptor);
resourceID = resource.getResourceIdentifier().getId();
protocolManager.getProtocolSessionManagerWithContext(resourceID, ResourceHelper.newSessionContextNetconf());
log.info("INFO: Initialized!");
}
@Before
public void before() throws ProtocolException, IncorrectLifecycleStateException, ResourceException, CorruptStateException {
initBundles();
log.info("INFO: Before test, getting queue...");
queueCapability = (IQueueManagerCapability) queueManagerFactory.create(mockResource);
/*
* initialize() registers the new queue manager as a service. Hence we cannot obtain this reference through injection.
*/
((ICapabilityLifecycle) queueCapability).initialize();
queueManagerService =
getService(bundleContext, IQueueManagerCapability.class, 20000,
String.format("(capability=queue)(capability.name=%s)",
resourceID));
}
@After
public void after() throws IncorrectLifecycleStateException, ResourceException, CorruptStateException {
log.info("INFO: After test, cleaning queue...");
((ICapabilityLifecycle) queueCapability).shutdown();
queueManagerService.clear();
}
/**
* A queue have to be new operations. In this sprint, it have to implement the remove operation to remove actions from the queue.
*
* Estimation: 3 hours
*
* tasks:
*
* 1.- Add unitary tests,
*
* 2.- Implement operation in the queue
*/
@Test
public void ModifyQueueTest() throws Exception {
// log.info("INFO: Remove actions");
// IAction action = new MockAction();
// action.setActionID("mockAction");
queueManagerService.queueAction(MockActionFactory.newMockActionAnError("action1"));
queueManagerService.queueAction(MockActionFactory.newMockActionDiffsCommandOks("action2"));
queueManagerService.queueAction(MockActionFactory.newMockActionOK("action3"));
queueCapability.modify(newQueueModifyParams());
Assert.assertTrue(queueManagerService.getActions().size() == 2);
}
private ModifyParams newQueueModifyParams() {
ModifyParams modifyParams = new ModifyParams();
modifyParams.setPosAction(1);
modifyParams.setQueueOper(ModifyParams.Operations.REMOVE);
return modifyParams;
}
/**
* A queue have to be new operations. In this sprint, it have to implement the remove operation to remove actions from the queue.
*
* Estimation: 5
*
* hours tasks:
*
* 1.- Add unitary test
*
* 2.- Add necessary refactoring to add new information in the queue
*
* @throws ProtocolException
*/
@Test
public void ResponseReportTest() throws CapabilityException, InterruptedException, ProtocolException {
queueManagerService.queueAction(MockActionFactory.newMockActionDiffsCommandOks("action1"));
queueManagerService.queueAction(MockActionFactory.newMockActionAnError("action2"));
queueManagerService.queueAction(MockActionFactory.newMockActionVariousError("action3"));
QueueResponse queueResponse = queueCapability.execute();
/* check prepare action */
ActionResponse prepareResponse = queueResponse.getPrepareResponse();
Assert.assertTrue(prepareResponse.getStatus() == ActionResponse.STATUS.OK);
Assert.assertTrue(queueResponse.getResponses().size() == 3);
ActionResponse actionResponse = queueResponse.getResponses().get(0);
for (Response response : actionResponse.getResponses()) {
Assert.assertTrue(response.getStatus() == Response.Status.OK);
Assert.assertNotNull(response.getSentMessage() != null);
}
ActionResponse actionResponseAnError = queueResponse.getResponses().get(1);
/* check message with error */
Assert.assertTrue(actionResponseAnError.getStatus() == ActionResponse.STATUS.ERROR);
Assert.assertTrue(actionResponseAnError.getResponses().size() == 1);
ActionResponse actionResponsePending = queueResponse.getResponses().get(2);
Assert.assertTrue(actionResponsePending.getStatus() == ActionResponse.STATUS.PENDING);
/* confirm response */
ActionResponse confirmResponse = queueResponse.getConfirmResponse();
Assert.assertTrue(confirmResponse.getStatus() == ActionResponse.STATUS.PENDING);
/* restore response */
ActionResponse restoreResponse = queueResponse.getRestoreResponse();
Assert.assertTrue(restoreResponse.getStatus() == ActionResponse.STATUS.OK);
}
}