/* * 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.util.peer; import java.util.List; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import org.bouncycastle.jce.provider.JDKKeyFactory.X509; import org.easymock.classextension.EasyMock; import org.ourgrid.acceptance.util.PeerAcceptanceUtil; import org.ourgrid.common.interfaces.control.PeerControl; import org.ourgrid.common.interfaces.control.PeerControlClient; import org.ourgrid.common.interfaces.management.PeerManager; import org.ourgrid.common.interfaces.management.WorkerManagement; import org.ourgrid.common.interfaces.management.WorkerManagementClient; import org.ourgrid.common.specification.worker.WorkerSpecification; import org.ourgrid.matchers.ControlOperationResultMatcher; import org.ourgrid.matchers.SaveAccountingRepetitionRunnableMatcher; import org.ourgrid.matchers.WorkerLoginResultMatcher; import org.ourgrid.peer.PeerComponent; import org.ourgrid.peer.PeerConstants; import org.ourgrid.peer.business.controller.accounting.AccountingConstants; import org.ourgrid.worker.WorkerConstants; import sun.security.provider.certpath.X509CertPath; import br.edu.ufcg.lsd.commune.container.ObjectDeployment; import br.edu.ufcg.lsd.commune.container.logging.CommuneLogger; import br.edu.ufcg.lsd.commune.container.servicemanager.actions.RepetitionRunnable; import br.edu.ufcg.lsd.commune.context.ModuleContext; import br.edu.ufcg.lsd.commune.identification.ContainerID; import br.edu.ufcg.lsd.commune.identification.DeploymentID; import br.edu.ufcg.lsd.commune.network.signature.SignatureProperties; import br.edu.ufcg.lsd.commune.testinfra.AcceptanceTestUtil; public class Req_010_Util extends PeerAcceptanceUtil { public Req_010_Util(ModuleContext context) { super(context); } public void workerLoginAgain(PeerComponent component, WorkerSpecification workerSpecification, DeploymentID wmDID) { workerLogin(component, workerSpecification, wmDID, true); } public void workerLogin(PeerComponent component, WorkerSpecification workerSpecification, DeploymentID wmDID) { workerLogin(component, workerSpecification, wmDID, false); } public void workerLogin(PeerComponent component, WorkerSpecification workerSpecification, DeploymentID wmDID, boolean alreadyLogged) { WorkerManagementClient workerManagementClient = getWorkerManagementClient(); WorkerManagementClient workerManagementClientProxy = getWorkerManagementClientProxy(); ObjectDeployment workerManagementClientDeployment = getWorkerManagementClientDeployment(); CommuneLogger oldLogger = component.getLogger(); CommuneLogger newLogger = EasyMock.createMock(CommuneLogger.class); component.setLogger(newLogger); WorkerManagement workerManagementMock = EasyMock .createMock(WorkerManagement.class); EasyMock.reset(workerManagementMock); EasyMock.reset(newLogger); X509CertPath workerCertPath = AcceptanceTestUtil .getCertificateMock(wmDID); AcceptanceTestUtil.publishTestObject(component, wmDID, workerManagementMock, WorkerManagement.class); workerManagementMock.loginSucceeded( EasyMock.same(workerManagementClient), WorkerLoginResultMatcher.noError()); if (alreadyLogged) { newLogger.warn("The worker [" + wmDID.getServiceID() + "] was identified " + "but it is already logged. Maybe it is recovering? Login with success."); } newLogger.info("The worker [" + wmDID.getServiceID() + "] was identified. " + "Login with success."); EasyMock.replay(workerManagementMock); EasyMock.replay(newLogger); //Login into peer AcceptanceTestUtil.setExecutionContext(component, workerManagementClientDeployment, wmDID, workerCertPath); workerManagementClientProxy.workerLogin(workerManagementMock, workerSpecification); EasyMock.verify(workerManagementMock); EasyMock.verify(newLogger); component.setLogger(oldLogger); } /** * Sets workers in a peer according to their <code>WorkerSpec</code>, setting the sender public key * @param workers Attributes of the workers to be set * @param senderPubKey The sender public key */ public void workerLogin(PeerComponent component, List<WorkerSpecification> workers) { WorkerManagementClient workerManagementClient = getWorkerManagementClient(); WorkerManagementClient workerManagementClientProxy = getWorkerManagementClientProxy(); ObjectDeployment workerManagementClientDeployment = getWorkerManagementClientDeployment(); CommuneLogger oldLogger = component.getLogger(); CommuneLogger newLogger = EasyMock.createMock(CommuneLogger.class); component.setLogger(newLogger); int i = 1; for (WorkerSpecification workerSpecification : workers) { WorkerManagement workerManagementMock = EasyMock.createMock(WorkerManagement.class); EasyMock.reset(workerManagementMock); EasyMock.reset(newLogger); String workerPublicKey = workerSpecification.getServiceID().getPublicKey(); //the worker must have a valid public key if (workerPublicKey == null) { workerPublicKey = "publicKey" + i++; } DeploymentID workerManagementID = new DeploymentID(new ContainerID(workerSpecification.getUser(), workerSpecification.getServer(), WorkerConstants.WORKER, workerPublicKey), WorkerConstants.LOCAL_WORKER_MANAGEMENT); X509CertPath workerCertPath = AcceptanceTestUtil.getCertificateMock(workerManagementID); AcceptanceTestUtil.setExecutionContext(component, workerManagementClientDeployment, workerManagementID, workerCertPath); AcceptanceTestUtil.publishTestObject(component, workerManagementID, workerManagementMock, WorkerManagement.class); workerManagementMock.loginSucceeded( EasyMock.same(workerManagementClient), WorkerLoginResultMatcher.noError()); newLogger.info("The worker [" + workerManagementID.getServiceID() + "] was identified. " + "Login with success."); EasyMock.replay(workerManagementMock); EasyMock.replay(newLogger); workerManagementClientProxy.workerLogin(workerManagementMock, workerSpecification); EasyMock.verify(workerManagementMock); EasyMock.verify(newLogger); } component.setLogger(oldLogger); } public void setWorkersWithWrongPubKey(PeerComponent component, List<WorkerSpecification> workers, String senderPubKey) { // Get the logger mock CommuneLogger oldLogger = component.getLogger(); CommuneLogger newLogger = EasyMock.createMock(CommuneLogger.class); component.setLogger(newLogger); // Create client mock PeerControlClient peerControlClientMock = EasyMock.createMock(PeerControlClient.class); // Get peer control PeerControl peerControl = getPeerControl(); ObjectDeployment peerControlDeployment = getPeerControlDeployment(); // Verifies if this is my public key if (senderPubKey.equals(peerControlDeployment.getDeploymentID().getPublicKey())) { peerControlClientMock.operationSucceed(ControlOperationResultMatcher.noError()); } else { newLogger.warn("An unknown entity tried to set the workers. Only the local modules can perform this operation." + " Unknown entity public key: [" + senderPubKey + "]."); } EasyMock.replay(peerControlClientMock); EasyMock.replay(newLogger); // defining workers on peer AcceptanceTestUtil.setExecutionContext(component, peerControlDeployment,senderPubKey); // peerControl.setWorkers(peerControlClientMock, workers); EasyMock.verify(peerControlClientMock); EasyMock.verify(newLogger); component.setLogger(oldLogger); } /** * Creates mocks for timer and logger and starts the peer * @param component The peer component to be started * @return The peer component */ public PeerComponent startPeer(PeerComponent component) { ObjectDeployment peerControlDeployment = getPeerControlDeployment(); return startPeer(component, peerControlDeployment.getDeploymentID().getPublicKey()); } /** * Creates mocks for timer and logger and starts the peer * @param component The peer component to be started * @param senderPublicKey The sender public key * @return The peer component */ @SuppressWarnings("unchecked") public PeerComponent startPeer(PeerComponent component, String senderPublicKey) { ScheduledExecutorService oldTimer = component.getTimer(); ScheduledExecutorService newTimer = EasyMock.createMock(ScheduledExecutorService.class); component.setTimer(newTimer); CommuneLogger logger = EasyMock.createMock(CommuneLogger.class); component.setLogger(logger); PeerControlClient peerControlClientMock = EasyMock.createMock(PeerControlClient.class); ObjectDeployment peerControlDeployment = getPeerControlDeployment(); boolean rightPubKey = senderPublicKey.equals(peerControlDeployment.getDeploymentID().getPublicKey()); if (rightPubKey) { peerControlClientMock.operationSucceed(ControlOperationResultMatcher.noError()); } else { logger.warn("An unknown entity tried to start the Peer. Only the local modules can perform this operation." + " Unknown entity public key: [" + senderPublicKey + "]."); EasyMock.replay(logger); } EasyMock.replay(peerControlClientMock); ScheduledFuture<?> future = EasyMock.createMock(ScheduledFuture.class); EasyMock.replay(future); PeerManager peerManager = (PeerManager) getPeerControl(); RepetitionRunnable runnableSaveAcc = new RepetitionRunnable(component, peerManager, PeerConstants.SAVE_ACCOUNTING_ACTION_NAME, null); RepetitionRunnable runnableUpdateAcc = new RepetitionRunnable(component, peerManager, PeerConstants.UPDATE_PEER_UPTIME_ACTION_NAME, null); RepetitionRunnable runnableUpdateGc = new RepetitionRunnable(component, peerManager, PeerConstants.INVOKE_GARBAGE_COLLECTOR_ACTION_NAME, null); long frequenceAcc = AccountingConstants.RANKING_SAVING_FREQ; long frequenceGc = PeerConstants.INVOKE_GARBAGE_COLLECTOR_DELAY; //timer.scheduleWithFixedDelay(runnableSaveAcc, frequenceAcc, frequenceAcc, TimeUnit.SECONDS); if (rightPubKey) { EasyMock.expect( (ScheduledFuture) newTimer.scheduleWithFixedDelay(SaveAccountingRepetitionRunnableMatcher.eqMatcher(runnableSaveAcc), EasyMock.eq(frequenceAcc), EasyMock.eq(frequenceAcc), EasyMock.same(TimeUnit.SECONDS))).andReturn(future); EasyMock.expect( (ScheduledFuture) newTimer.scheduleWithFixedDelay(SaveAccountingRepetitionRunnableMatcher.eqMatcher(runnableUpdateAcc), EasyMock.eq(frequenceAcc), EasyMock.eq(frequenceAcc), EasyMock.same(TimeUnit.SECONDS))).andReturn(future); EasyMock.expect( (ScheduledFuture) newTimer.scheduleWithFixedDelay(SaveAccountingRepetitionRunnableMatcher.eqMatcher(runnableUpdateGc), EasyMock.eq(frequenceGc), EasyMock.eq(frequenceGc), EasyMock.same(TimeUnit.SECONDS))).andReturn(future); } EasyMock.replay(newTimer); DeploymentID peerClientID = new DeploymentID(new ContainerID("broker", "broker", "broker", senderPublicKey),"broker"); AcceptanceTestUtil.publishTestObject(component, peerClientID, peerControlClientMock, PeerControlClient.class); AcceptanceTestUtil.setExecutionContext(component, peerControlDeployment, senderPublicKey); peerManager.start(peerControlClientMock); EasyMock.verify(peerControlClientMock); EasyMock.verify(newTimer); EasyMock.verify(future); if (!rightPubKey) { EasyMock.verify(logger); EasyMock.reset(logger); } component.setTimer(oldTimer); return component; } public PeerComponent query(PeerComponent component, String query, String result) { String senderPublicKey = context.getProperty(SignatureProperties.PROP_PUBLIC_KEY); return query(component, senderPublicKey, query, result); } public PeerComponent query(PeerComponent component, String senderPublicKey, String query, String result) { ScheduledExecutorService oldTimer = component.getTimer(); ScheduledExecutorService newTimer = EasyMock.createMock(ScheduledExecutorService.class); component.setTimer(newTimer); CommuneLogger logger = EasyMock.createMock(CommuneLogger.class); component.setLogger(logger); PeerControlClient peerControlClientMock = EasyMock.createMock(PeerControlClient.class); ObjectDeployment peerControlDeployment = getPeerControlDeployment(); boolean rightPubKey = senderPublicKey.equals(peerControlDeployment.getDeploymentID().getPublicKey()); if (rightPubKey) { peerControlClientMock.operationSucceed(ControlOperationResultMatcher.withResult(result)); } else { logger.warn("An unknown entity tried to query the Peer. Only the local modules can perform this operation." + " Unknown entity public key: [" + senderPublicKey + "]."); EasyMock.replay(logger); } EasyMock.replay(peerControlClientMock); ScheduledFuture<?> future = EasyMock.createMock(ScheduledFuture.class); EasyMock.replay(future); PeerManager peerManager = (PeerManager) getPeerControl(); EasyMock.replay(newTimer); DeploymentID peerClientID = new DeploymentID(new ContainerID("broker", "broker", "broker", senderPublicKey),"broker"); AcceptanceTestUtil.publishTestObject(component, peerClientID, peerControlClientMock, PeerControlClient.class); AcceptanceTestUtil.setExecutionContext(component, peerControlDeployment, senderPublicKey); peerManager.query(peerControlClientMock, query); EasyMock.verify(peerControlClientMock); EasyMock.verify(newTimer); EasyMock.verify(future); if (!rightPubKey) { EasyMock.verify(logger); EasyMock.reset(logger); } component.setTimer(oldTimer); return component; } /** * Creates a peer component ands starts the peer * @return The created peer component * @throws Exception */ public PeerComponent startPeer() throws Exception { PeerComponent component = createPeerComponent(context); component = startPeer(component, context.getProperty(SignatureProperties.PROP_PUBLIC_KEY)); application = component; return component; } /** * Stops the peer verifying logging for NOF Ranking file saving * @param component The peer component */ public void notNiceStopPeer(PeerComponent component) { ObjectDeployment peerControlDeployment = getPeerControlDeployment(); if(peerControlDeployment == null) { return; } stopPeer(component, false, peerControlDeployment.getDeploymentID().getPublicKey()); } /** * Stops the peer without verifying logging * @param component The peer component */ public void niceStopPeer(PeerComponent component) { if (component == null) { return; } ObjectDeployment deployment = getPeerControlDeployment(); if(deployment == null) { return; } stopPeer(component, true, deployment.getDeploymentID().getPublicKey()); } /** * Stops the peer verifying logging for NOF Ranking file saving * @param component The peer component * @param senderPubKey The publicKey of the component that asked the peer to stop */ public void notNiceStopPeer(PeerComponent component, String senderPubKey) { stopPeer(component, false, senderPubKey); } /** * Stops the peer without verifying logging * @param component The peer component * @param senderPubKey The publicKey of the component that asked the peer to stop */ public void niceStopPeer(PeerComponent component, String senderPubKey) { stopPeer(component, true, senderPubKey); } private void stopPeer(PeerComponent component, boolean nice, String senderPubKey) { if(component == null) { return; } PeerControlClient peerControlClientMock = null; CommuneLogger oldLogger = component.getLogger(); CommuneLogger newLogger = null; ObjectDeployment peerControlDeployment = getPeerControlDeployment(); if (nice) { peerControlClientMock = EasyMock.createNiceMock(PeerControlClient.class); newLogger = EasyMock.createNiceMock(CommuneLogger.class); } else { peerControlClientMock = EasyMock.createMock(PeerControlClient.class); newLogger = EasyMock.createMock(CommuneLogger.class); if(senderPubKey.equals(peerControlDeployment.getDeploymentID().getPublicKey())) { newLogger.debug("Saving the Network of favours data."); peerControlClientMock.operationSucceed(ControlOperationResultMatcher.noError()); } else { newLogger.warn("An unknown entity tried to stop the Peer. Only the local modules can perform this operation." + " Unknown entity public key: [" + senderPubKey + "]."); newLogger.warn("An unknown sender tried to save the Network of favors data. This message was ignored." + " Sender public key: " + senderPubKey); } EasyMock.replay(peerControlClientMock); EasyMock.replay(newLogger); } component.setLogger(newLogger); // Stop the peer if (peerControlDeployment != null) { DeploymentID pccID = new DeploymentID(new ContainerID("pcc", "pcc", "peer", senderPubKey), "broker"); AcceptanceTestUtil.publishTestObject(component, pccID, peerControlClientMock, PeerControlClient.class); AcceptanceTestUtil.setExecutionContext(component, peerControlDeployment, senderPubKey); getPeerControl().stop(false, false, peerControlClientMock); } if (!nice) { EasyMock.verify(peerControlClientMock); EasyMock.verify(newLogger); } component.setLogger(oldLogger); } }