/*
* Copyright (C) 2008 Universidade Federal de Campina Grande
*
* This file is part of OurGrid.
*
* OurGrid is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.ourgrid.acceptance.peer;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.File;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.easymock.classextension.EasyMock;
import org.junit.After;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.ourgrid.acceptance.util.JDLCompliantTest;
import org.ourgrid.acceptance.util.WorkerAcceptanceUtil;
import org.ourgrid.acceptance.util.peer.Req_010_Util;
import org.ourgrid.acceptance.util.peer.Req_019_Util;
import org.ourgrid.common.interfaces.DiscoveryServiceClient;
import org.ourgrid.common.interfaces.LocalWorkerProvider;
import org.ourgrid.common.interfaces.RemoteWorkerProvider;
import org.ourgrid.common.interfaces.RemoteWorkerProviderClient;
import org.ourgrid.common.interfaces.control.PeerControl;
import org.ourgrid.common.interfaces.control.PeerControlClient;
import org.ourgrid.common.interfaces.management.WorkerManagementClient;
import org.ourgrid.common.specification.OurGridSpecificationConstants;
import org.ourgrid.common.specification.main.DescriptionFileCompile;
import org.ourgrid.common.specification.main.SDFClassAdsSemanticAnalyzer;
import org.ourgrid.common.specification.worker.WorkerSpecification;
import org.ourgrid.common.specification.worker.WorkerSpecificationConstants;
import org.ourgrid.discoveryservice.DiscoveryServiceConstants;
import org.ourgrid.matchers.ControlOperationResultMatcher;
import org.ourgrid.peer.PeerComponent;
import org.ourgrid.peer.PeerConstants;
import org.ourgrid.reqtrace.ReqTest;
import br.edu.ufcg.lsd.commune.Module;
import br.edu.ufcg.lsd.commune.container.ObjectDeployment;
import br.edu.ufcg.lsd.commune.container.control.ModuleAlreadyStartedException;
import br.edu.ufcg.lsd.commune.container.control.ModuleNotStartedException;
import br.edu.ufcg.lsd.commune.container.control.ModuleStoppedException;
import br.edu.ufcg.lsd.commune.identification.ContainerID;
import br.edu.ufcg.lsd.commune.identification.DeploymentID;
import br.edu.ufcg.lsd.commune.identification.ServiceID;
import br.edu.ufcg.lsd.commune.testinfra.AcceptanceTestUtil;
/**
* @author melina
* @author gustavopf
* @author Ricardo Araujo Santos - ricardo@lsd.ufcg.edu.br
*/
@ReqTest(reqs="REQ010")
public class Req_010_Test extends PeerAcceptanceTestCase {
private PeerComponent component;
private WorkerAcceptanceUtil workerAcceptanceUtil = new WorkerAcceptanceUtil(getComponentContext());
private Req_010_Util req_010_Util = new Req_010_Util(getComponentContext());
private Req_019_Util req_019_Util = new Req_019_Util(getComponentContext());
@After
public void tearDown() throws Exception {
if (component != null && component.getContainerDAO().isStarted()) {
req_010_Util.niceStopPeer(component);
}
super.tearDown();
}
/**
* Verify if the Peer's module was created and if Peer Control was bound.
*/
@ReqTest(test="AT-010.1", reqs="REQ010")
@Test public void test_at_010_1_PeerCreation() throws Exception {
component = peerAcceptanceUtil.createPeerComponent(getComponentContext());
assertTrue(isModuleStarted(component, PeerConstants.MODULE_NAME));
assertTrue(isBound(component, Module.CONTROL_OBJECT_NAME, PeerControl.class));
}
/**
* Start the Peer and verify if:
* Peer and Community obtainer's modules were created
* Peer control, peer worker provider client, worker management client,
* worker manager, status, accounting, client monitor, provider monitor,
* ds monitor, lock manager, local worker provider and remote worker provider
* were bound on Peer's module
* Community obtainer was bound on Community obtainer's module
*/
@ReqTest(test="AT-010.2", reqs="REQ010")
@Test public void test_at_010_2_StartCommand() throws Exception {
component = req_010_Util.startPeer();
verifyPeerModulesAndBinds();
}
private void verifyPeerModulesAndBinds() {
//Verify modules
assertTrue(isModuleStarted(component, PeerConstants.MODULE_NAME));
//Verify bound objects and types
assertTrue(isBound(component, Module.CONTROL_OBJECT_NAME, PeerControl.class));
assertTrue(isBound(component, PeerConstants.REMOTE_WORKER_PROVIDER_CLIENT,
RemoteWorkerProviderClient.class));
assertTrue(isBound(component, PeerConstants.WORKER_MANAGEMENT_CLIENT_OBJECT_NAME,
WorkerManagementClient.class));
assertTrue(isBound(component, PeerConstants.LOCAL_WORKER_PROVIDER,
LocalWorkerProvider.class));
assertTrue(isBound(component, PeerConstants.REMOTE_WORKER_PROVIDER, RemoteWorkerProvider.class));
assertTrue(isBound(component, PeerConstants.DS_CLIENT,
DiscoveryServiceClient.class));
}
/**
* Execute start command twice, receive a peer already starter operation
* result and verify if the created modules and
* bound objects weren't affected.
*/
@ReqTest(test="AT-010.4", reqs="REQ010")
@Test public void test_at_010_4_StartCommandTwice() throws Exception{
component = req_010_Util.startPeer();
//Create mock and get bound object
PeerControlClient peerControlClientMock = EasyMock.createMock(PeerControlClient.class);
PeerControl peerControl = peerAcceptanceUtil.getPeerControl();
//Begin mock record
resetActiveMocks();
peerControlClientMock.operationSucceed(
ControlOperationResultMatcher.eqType(ModuleAlreadyStartedException.class));
EasyMock.replay(peerControlClientMock);
DeploymentID pccID = new DeploymentID(new ContainerID("pcc", "pccServer", DiscoveryServiceConstants.MODULE_NAME),
DiscoveryServiceConstants.DS_OBJECT_NAME);
AcceptanceTestUtil.publishTestObject(component, pccID, peerControlClientMock, PeerControlClient.class);
//Start peer again
peerControl.start(peerControlClientMock);
//Verify mock calls - Peer must return an error to client
EasyMock.verify(peerControlClientMock);
verifyPeerModulesAndBinds();
}
/**
* Verify Peer's modules destruction and if the client received an
* operation succeed result
*/
@ReqTest(test="AT-010.7", reqs="REQ010")
@Test public void test_at_010_7_stopCommand() throws Exception{
component = req_010_Util.startPeer();
//Create mock and get bound object
PeerControlClient peerControlClientMock = EasyMock.createMock(PeerControlClient.class);
PeerControl peerControl = peerAcceptanceUtil.getPeerControl();
//Begin mock record
resetActiveMocks();
peerControlClientMock.operationSucceed(ControlOperationResultMatcher.noError());
EasyMock.replay(peerControlClientMock);
DeploymentID pccID = new DeploymentID(new ContainerID("pcc", "pccServer", DiscoveryServiceConstants.MODULE_NAME),
DiscoveryServiceConstants.DS_OBJECT_NAME);
AcceptanceTestUtil.publishTestObject(component, pccID, peerControlClientMock, PeerControlClient.class);
//Stop peer
peerControl.stop(false, false, peerControlClientMock);
//Verify mock calls - Peer must return an operation succeeded result
EasyMock.verify(peerControlClientMock);
EasyMock.reset(peerControlClientMock);
//Verify modules destruction
//TODO assertFalse(isModuleStarted(component, PeerConstants.MODULE_NAME));
}
/**
* Test the Peer's states and transitions:
* setWorkers before start - error: peer not initialized
* stop before start - error: peer not initialized
* start twice - error: peer already started
* setWorkers after stop - error: peer finalized
* stoptwice - error: peer finalized
* start after stop - error: peer finalized
*/
@ReqTest(test="AT-010.8", reqs="REQ010")
@Test public void test_at_010_8_stateMachine() throws Exception {
component = peerAcceptanceUtil.createPeerComponent(getComponentContext());
PeerControl peerControl = peerAcceptanceUtil.getPeerControl();
ObjectDeployment peerControlDeployment = peerAcceptanceUtil.getPeerControlDeployment();
//Create mocks
PeerControlClient peerControlClientMock = EasyMock.createMock(PeerControlClient.class);
DeploymentID pccID = new DeploymentID(new ContainerID("peerClient", "peerClientServer", "broker"), "broker");
AcceptanceTestUtil.publishTestObject(component, pccID, peerControlClientMock, PeerControlClient.class);
WorkerSpecification workerSpec1 = workerAcceptanceUtil.createWorkerSpecMock(new ServiceID("U1", "S1", "M1", "W1"));
WorkerSpecification workerSpec2 = workerAcceptanceUtil.createWorkerSpecMock(new ServiceID("U2", "S2", "M2", "W2"));
List<WorkerSpecification> workers = new LinkedList<WorkerSpecification>();
workers.add(workerSpec1);
workers.add(workerSpec2);
// //setWorkers before start - error: peer not initialized
// EasyMock.reset(peerControlClientMock);
// peerControlClientMock.operationSucceed(
// ControlOperationResultMatcher.eqType(ModuleNotStartedException.class));
// EasyMock.replay(peerControlClientMock);
// peerControl.setWorkers(peerControlClientMock, workers);
// EasyMock.verify(peerControlClientMock);
//stop before start - error: peer not initialized
EasyMock.reset(peerControlClientMock);
peerControlClientMock.operationSucceed(
ControlOperationResultMatcher.eqType(ModuleNotStartedException.class));
EasyMock.replay(peerControlClientMock);
AcceptanceTestUtil.setExecutionContext(component, peerControlDeployment,
peerControlDeployment.getDeploymentID().getPublicKey());
peerControl.stop(false, false, peerControlClientMock);
EasyMock.verify(peerControlClientMock);
//start twice - no error / error: peer already started
EasyMock.reset(peerControlClientMock);
peerControlClientMock.operationSucceed(ControlOperationResultMatcher.noError());
peerControlClientMock.operationSucceed(
ControlOperationResultMatcher.eqType(ModuleAlreadyStartedException.class));
EasyMock.replay(peerControlClientMock);
peerControl.start(peerControlClientMock);
peerControl.start(peerControlClientMock);
EasyMock.verify(peerControlClientMock);
//stop after start - no error
EasyMock.reset(peerControlClientMock);
peerControlClientMock.operationSucceed(ControlOperationResultMatcher.noError());
EasyMock.replay(peerControlClientMock);
peerControl.stop(false, false, peerControlClientMock);
EasyMock.verify(peerControlClientMock);
// //setWorkers after stop - error: peer finalized
// EasyMock.reset(peerControlClientMock);
// peerControlClientMock.operationSucceed(
// ControlOperationResultMatcher.eqType(ModuleStoppedException.class));
// EasyMock.replay(peerControlClientMock);
// peerControl.setWorkers(peerControlClientMock, workers);
// EasyMock.verify(peerControlClientMock);
//stop after stop - error: peer finalized
EasyMock.reset(peerControlClientMock);
peerControlClientMock.operationSucceed(
ControlOperationResultMatcher.eqType(ModuleStoppedException.class));
EasyMock.replay(peerControlClientMock);
peerControl.stop(false, false, peerControlClientMock);
EasyMock.verify(peerControlClientMock);
//start after stop - error: peer finalized
EasyMock.reset(peerControlClientMock);
peerControlClientMock.operationSucceed(
ControlOperationResultMatcher.eqType(ModuleStoppedException.class));
EasyMock.replay(peerControlClientMock);
peerControl.start(peerControlClientMock);
EasyMock.verify(peerControlClientMock);
}
/**
* Verify WorkerSpec compilation on 4 scenarios:
* File 1: WorkerSpec A: only workerdefaults properties
* File 2: WorkerSpec B: workerdefaults and worker properties
* File 2: WorkerSpec C: workerdefaults and worker properties, 1 worker
* property overriding workerdefaults property
* File 3: WorkerSpec D: only worker properties
*/
@ReqTest(test="AT-010.10", reqs="REQ010")
@Category(JDLCompliantTest.class) @Test public void test_at_010_10_compileWorkerSpecsWithJDL() throws Exception {
component = req_010_Util.startPeer();
List<WorkerSpecification> specs = SDFClassAdsSemanticAnalyzer.compile( MACHINE1 );
assertTrue(1 == specs.size());
WorkerSpecification workerSpecA = specs.get(0);
assertEquals("testserver", workerSpecA.getAttribute(OurGridSpecificationConstants.SERVERNAME));
assertEquals("testuser", workerSpecA.getAttribute(OurGridSpecificationConstants.USERNAME));
assertEquals("linux", workerSpecA.getAttribute(OurGridSpecificationConstants.ATT_OS));
specs = SDFClassAdsSemanticAnalyzer.compile( MACHINE2 );
assertTrue(2 == specs.size());
WorkerSpecification workerSpecB = specs.get(0);
WorkerSpecification workerSpecC = specs.get(1);
assertEquals("testserver", workerSpecB.getAttribute(OurGridSpecificationConstants.SERVERNAME));
assertEquals("testuserB", workerSpecB.getAttribute(OurGridSpecificationConstants.USERNAME));
assertEquals("linux", workerSpecB.getAttribute(WorkerSpecificationConstants.OS));
assertEquals("128", workerSpecB.getAttribute(WorkerSpecificationConstants.MAIN_MEMORY));
assertEquals("testserver", workerSpecC.getAttribute(OurGridSpecificationConstants.SERVERNAME));
assertEquals("testuserC", workerSpecC.getAttribute(OurGridSpecificationConstants.USERNAME));
assertEquals("windows", workerSpecC.getAttribute(WorkerSpecificationConstants.OS));
assertEquals("256", workerSpecC.getAttribute(WorkerSpecificationConstants.MAIN_MEMORY));
specs = SDFClassAdsSemanticAnalyzer.compile( MACHINE3 );
assertTrue(1 == specs.size());
WorkerSpecification workerSpecD = specs.get(0);
assertEquals("testserver", workerSpecD.getAttribute(OurGridSpecificationConstants.SERVERNAME));
assertEquals("testuser", workerSpecD.getAttribute(OurGridSpecificationConstants.USERNAME));
assertEquals("linux", workerSpecD.getAttribute(WorkerSpecificationConstants.OS));
assertEquals("1024", workerSpecD.getAttribute(WorkerSpecificationConstants.MAIN_MEMORY));
}
/**
* Verify peer recovery interest on the logged workers.
*/
@ReqTest(test="AT-010.11", reqs="REQ010")
@Test public void test_at_010_11_SetWorkers() throws Exception{
//Start peer
component = req_010_Util.startPeer();
WorkerSpecification workerSpec = workerAcceptanceUtil.createWorkerSpec("testuserB", "testserver");
DeploymentID workerBDeploymentID = req_019_Util.createAndPublishWorkerManagement(component, workerSpec, "publicKey1");
req_010_Util.workerLogin(component, workerSpec, workerBDeploymentID);
workerSpec = workerAcceptanceUtil.createWorkerSpec("testuserC", "testserver");
DeploymentID workerCDeploymentID = req_019_Util.createAndPublishWorkerManagement(component, workerSpec, "publicKey1");
req_010_Util.workerLogin(component, workerSpec, workerCDeploymentID);
//Get Worker Monitor Object
ObjectDeployment workerMonitorDeployment = peerAcceptanceUtil.getWorkerMonitorDeployment();
//Verify if the monitor is recovery interested on the workers
AcceptanceTestUtil.isInterested(component, workerBDeploymentID.getServiceID(), workerMonitorDeployment.getDeploymentID());
AcceptanceTestUtil.isInterested(component, workerCDeploymentID.getServiceID(), workerMonitorDeployment.getDeploymentID());
}
/**
* Verify peer recovery interest on the logged workers.
*/
@ReqTest(test="AT-010.11", reqs="REQ010")
@Category(JDLCompliantTest.class) @Test public void test_at_010_11_SetWorkersWithJDL() throws Exception{
//Start peer
component = req_010_Util.startPeer();
WorkerSpecification workerSpec = workerAcceptanceUtil.createClassAdWorkerSpec("testuserB", "testserver");
DeploymentID workerBDeploymentID = req_019_Util.createAndPublishWorkerManagement(component, workerSpec, "publicKey1");
req_010_Util.workerLogin(component, workerSpec, workerBDeploymentID);
workerSpec = workerAcceptanceUtil.createClassAdWorkerSpec("testuserC", "testserver");
DeploymentID workerCDeploymentID = req_019_Util.createAndPublishWorkerManagement(component, workerSpec, "publicKey1");
req_010_Util.workerLogin(component, workerSpec, workerCDeploymentID);
//Get Worker Monitor Object
ObjectDeployment workerMonitorDeployment = peerAcceptanceUtil.getWorkerMonitorDeployment();
//Verify if the monitor is recovery interested on the workers
AcceptanceTestUtil.isInterested(component, workerBDeploymentID.getServiceID(), workerMonitorDeployment.getDeploymentID());
AcceptanceTestUtil.isInterested(component, workerCDeploymentID.getServiceID(), workerMonitorDeployment.getDeploymentID());
}
// ===================== Qualification Tests ============================================
/**
* This test verify if a Peer Without a configuration isn't created.
* @author gustavopf
* @author melina
* @Date: 14/04/08
* @throws Exception
*/
@ReqTest(test="AT-010.1", reqs="REQ010")
@Test public void test_at_010_1_PeerCreationWithoutConfiguration() throws Exception {
//component = req_010_Util.startPeer();
String errorMessage = "The container context is mandatory";
try {
peerAcceptanceUtil.createPeerComponent(null);
fail("Peer shoudn't be created without a configuration.");
} catch (IllegalArgumentException e) {
assertEquals(errorMessage, e.getMessage());
}
assertFalse(isModuleStarted(component, PeerConstants.MODULE_NAME));
assertFalse(isBound(component, Module.CONTROL_OBJECT_NAME, PeerControl.class));
}
}