package org.ourgrid.acceptance.util.broker;
import java.util.ArrayList;
import java.util.List;
import org.easymock.classextension.EasyMock;
import org.ourgrid.acceptance.util.BrokerAcceptanceUtil;
import org.ourgrid.broker.BrokerConfiguration;
import org.ourgrid.broker.BrokerServerModule;
import org.ourgrid.broker.business.dao.Request;
import org.ourgrid.broker.business.scheduler.workqueue.JobInfo;
import org.ourgrid.common.BrokerLoginResult;
import org.ourgrid.common.interfaces.LocalWorkerProvider;
import org.ourgrid.common.interfaces.LocalWorkerProviderClient;
import org.ourgrid.common.interfaces.to.RequestSpecification;
import org.ourgrid.common.job.Job;
import org.ourgrid.common.specification.job.JobSpecification;
import org.ourgrid.matchers.RequestSpecMatcher;
import org.ourgrid.peer.PeerConstants;
import br.edu.ufcg.lsd.commune.container.logging.CommuneLogger;
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.testinfra.AcceptanceTestUtil;
import br.edu.ufcg.lsd.commune.testinfra.util.TestStub;
public class Req_311_Util extends BrokerAcceptanceUtil {
public Req_311_Util(ModuleContext context) {
super(context);
}
public LocalWorkerProvider verifyLogin(BrokerServerModule component, String peerPublicKey,
boolean isAlreadyLogged, boolean hasError, String loginResultMessage, TestStub testStub) {
return verifyLogin(component, peerPublicKey, isAlreadyLogged, hasError, loginResultMessage, testStub, null, null);
}
public LocalWorkerProvider verifyLogin(BrokerServerModule component, String peerPublicKey,
boolean isAlreadyLogged, boolean hasError, String loginResultMessage, TestStub testStub,
List<JobSpecification> jobs, List<Integer> jobIDs) {
CommuneLogger newLogger = component.getLogger();
EasyMock.reset(newLogger);
LocalWorkerProvider localWorkerProviderMock = (LocalWorkerProvider) testStub.getObject();
BrokerLoginResult result = new BrokerLoginResult(loginResultMessage);
component.setLogger(newLogger);
EasyMock.reset(localWorkerProviderMock);
LocalWorkerProviderClient localProviderClient = getLocalWorkerProviderClient(component);
if (hasError) {
if(isAlreadyLogged){
newLogger.warn("The peer with public key [" + peerPublicKey + "] tried to send " +
"a login response, but it is already logged.");
} else if (peerPublicKey.equals("wrongPublicKey")){
newLogger.warn("An unknown peer sent a login response. Peer public key: " +
"[" + peerPublicKey + "]");
} else if (peerPublicKey.equals("publicKey1")) {
newLogger.warn("An error ocurred while logging in the peer with public key : " +
"[" + peerPublicKey + "] - error message");
}
}
String maxReplicas = component.getContext().getProperty(BrokerConfiguration.PROP_MAX_REPLICAS);
String maxFails = component.getContext().getProperty(BrokerConfiguration.PROP_MAX_FAILS);
Integer replicas = Integer.valueOf(maxReplicas);
Integer fails = Integer.valueOf(maxFails);
if (!hasError && jobs != null) {
for (int i = 0; i < jobs.size(); i++) {
Job job = JobInfo.getInstance().getJob(jobIDs.get(i));
RequestSpecification requestSpec = createRequestSpec(job.getJobId(), job.getSpec(), replicas, fails);
List<Request> requests = new ArrayList<Request>(job.getRequests());
for (Request request : requests) {
LocalWorkerProvider lwp = AcceptanceTestUtil.getStub(component,
new DeploymentID(request.getPeerID()), LocalWorkerProvider.class);
if (lwp == localWorkerProviderMock) {
requestSpec = request.getSpecification();
break;
}
}
localWorkerProviderMock.requestWorkers(RequestSpecMatcher.eqMatcher(requestSpec));
}
}
EasyMock.replay(localWorkerProviderMock);
EasyMock.replay(newLogger);
AcceptanceTestUtil.notifyRecovery(component, testStub.getDeploymentID());
if (peerPublicKey.equals("wrongPublicKey")){
DeploymentID correctID = testStub.getDeploymentID();
DeploymentID wrongID = new DeploymentID(new ContainerID(correctID.getUserName(), correctID.getServerName(),
PeerConstants.MODULE_NAME, peerPublicKey),
PeerConstants.LOCAL_WORKER_PROVIDER);
AcceptanceTestUtil.publishTestObject(component, wrongID, localWorkerProviderMock, LocalWorkerProvider.class);
AcceptanceTestUtil.setExecutionContext(component, getLocalWorkerProviderClientDeployment(component), testStub.getDeploymentID());
localProviderClient.loginSucceed(localWorkerProviderMock, result);
} else {
testStub.getDeploymentID().setPublicKey(peerPublicKey);
AcceptanceTestUtil.setExecutionContext(component, getLocalWorkerProviderClientDeployment(component), testStub.getDeploymentID());
localProviderClient.loginSucceed(localWorkerProviderMock, result);
EasyMock.verify(localWorkerProviderMock);
}
EasyMock.verify(newLogger);
return localWorkerProviderMock;
}
}