/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.broadcast.server.plugin;
import java.io.File;
import java.sql.SQLException;
import junit.framework.Assert;
import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
import net.codjo.agent.AclMessage;
import net.codjo.agent.Agent;
import net.codjo.agent.Aid;
import net.codjo.agent.ContainerFailureException;
import net.codjo.agent.MessageTemplate;
import net.codjo.agent.test.AgentContainerFixture;
import net.codjo.agent.test.SubStep;
import net.codjo.agent.test.TesterAgent;
import net.codjo.broadcast.common.Broadcaster;
import net.codjo.broadcast.common.Context;
import net.codjo.broadcast.common.message.BroadcastRequest;
import net.codjo.test.common.LogString;
import net.codjo.workflow.common.message.JobAudit;
import net.codjo.workflow.common.message.JobAudit.Status;
import net.codjo.workflow.common.protocol.JobProtocol;
/**
* Classe de test de {@link BroadcastJobAgent}.
*/
public class BroadcastJobAgentTest extends TestCase {
private static final String BROADCAST_AID = "broadcast-broadcastAgent";
private BroadcastJobAgent broadcastAgent;
private AgentContainerFixture agentContainerFixture = new AgentContainerFixture();
private LogString logString = new LogString();
private JobConfigMock jobConfig;
public void test_broadcast_warnings() throws Exception {
test_broadcast(true, "warnings");
}
public void test_broadcast() throws Exception {
test_broadcast(false, null);
}
private void test_broadcast(boolean withWarnings, String warnings) throws Exception {
agentContainerFixture.startNewAgent(BROADCAST_AID, broadcastAgent);
if (withWarnings) {
jobConfig.mockWarnings(warnings);
}
AclMessage broadcastMessage = createBroadcastRequest("r24",
"2006-01-01",
"1998-07-12",
"destfolder",
"result.txt");
TesterAgent tester = new TesterAgent();
tester.record().sendMessage(broadcastMessage);
tester.record().receiveMessage(hasAuditType(JobAudit.Type.PRE));
tester.record().receiveMessage(hasAuditType(JobAudit.Type.POST))
.add(new AssertAuditArguments("destfolder\\result.txt",
withWarnings,
"Warnings durant l'export de result.txt",
warnings)).die();
runAndAssertNoError(tester);
Context context = new Context();
context.putParameter("broadcastDate", "1998-07-12");
context.putParameter("userId", null);
context.putParameter("jobRequest", broadcastMessage.getContentObject());
context.putParameter("agentContainer", tester.getAgentContainer());
logString.assertContent(
"jobConfig.init(agent:broadcast-broadcastAgent, message:REQUEST), "
+ "jobConfig.buildContext(r24, result.txt, 2006-01-01, 1998-07-12, destfolder), "
+ "jobConfig.getBroadcastersFor(result.txt, context(1998-07-12)), "
+ "Broadcaster.setDestinationFile(destfolder\\result.txt), "
+ "Broadcaster.broadcast(" + context.getParameters() + ")");
}
public void test_broadcast_withoutParameter()
throws Exception {
jobConfig.mockGetBroadcastersFor(new Broadcaster[0]);
agentContainerFixture.startNewAgent(BROADCAST_AID, broadcastAgent);
TesterAgent tester = new TesterAgent();
tester.record().sendMessage(createBroadcastRequest());
tester.record().receiveMessage(hasAuditType(JobAudit.Type.PRE))
.assertReceivedMessage(hasNoAuditError());
tester.record().receiveMessage(hasAuditType(JobAudit.Type.POST))
.assertReceivedMessage(hasAuditError(true,
"Erreur durant l'export de broadcast-result.txt : Broadcaster introuvable."))
.die();
runAndAssertNoError(tester);
}
public void test_broadcast_error() throws Exception {
jobConfig.mockGetBroadcastersForFailure(new SQLException("Erreur SQL"));
agentContainerFixture.startNewAgent(BROADCAST_AID, broadcastAgent);
TesterAgent tester = new TesterAgent();
tester.record().sendMessage(createBroadcastRequest());
tester.record().receiveMessage(hasAuditType(JobAudit.Type.PRE))
.assertReceivedMessage(hasNoAuditError());
tester.record().receiveMessage(hasAuditType(JobAudit.Type.POST))
.assertReceivedMessage(hasAuditError(true,
"Erreur durant l'export de broadcast-result.txt : Erreur SQL"))
.die();
runAndAssertNoError(tester);
}
public void test_agentDescription() throws Exception {
agentContainerFixture.startNewAgent(BROADCAST_AID, broadcastAgent);
agentContainerFixture.assertAgentWithService(new String[]{BROADCAST_AID},
BroadcastRequest.BROADCAST_JOB_TYPE);
}
@Override
protected void setUp() throws Exception {
jobConfig = new JobConfigMock(new LogString("jobConfig", logString));
broadcastAgent = new BroadcastJobAgent(jobConfig);
agentContainerFixture.doSetUp();
}
@Override
protected void tearDown() throws Exception {
agentContainerFixture.doTearDown();
}
private MessageTemplate hasAuditType(JobAudit.Type type) {
return MessageTemplate.and(MessageTemplate.matchPerformative(AclMessage.Performative.INFORM),
matchType(type));
}
private MessageTemplate matchType(final JobAudit.Type auditType) {
return MessageTemplate.matchWith(new MessageTemplate.MatchExpression() {
public boolean match(AclMessage aclMessage) {
JobAudit jobAudit = (JobAudit)aclMessage.getContentObject();
return auditType == jobAudit.getType();
}
});
}
private MessageTemplate hasNoAuditError() {
return hasAuditError(false, "");
}
private MessageTemplate hasAuditError(final boolean hasError, final String message) {
return MessageTemplate.matchWith(new MessageTemplate.MatchExpression() {
public boolean match(AclMessage aclMessage) {
JobAudit jobAudit = (JobAudit)aclMessage.getContentObject();
if (jobAudit.hasError() && hasError) {
return message.equals(jobAudit.getErrorMessage());
}
return jobAudit.hasError() == hasError;
}
});
}
private AclMessage createBroadcastRequest() {
return createBroadcastRequest("r24(comme le metier)", "2006-01-01", "2006-01-20",
"destfolder", "broadcast-result.txt");
}
private AclMessage createBroadcastRequest(String user, String generationDate,
String broadcastDate, String destFolderValue, String fileName) {
AclMessage requestMessage = new AclMessage(AclMessage.Performative.REQUEST);
requestMessage.setConversationId("conversation-id");
requestMessage.setProtocol(JobProtocol.ID);
requestMessage.addReceiver(new Aid(BROADCAST_AID));
BroadcastRequest request = new BroadcastRequest();
request.setId(requestMessage.getConversationId());
request.setInitiatorLogin(user);
request.setDate(java.sql.Date.valueOf(generationDate));
request.setBroadcastDate(java.sql.Date.valueOf(broadcastDate));
request.setDestinationFile(new File(destFolderValue, fileName));
requestMessage.setContentObject(request.toRequest());
return requestMessage;
}
private void runAndAssertNoError(TesterAgent tester)
throws ContainerFailureException {
agentContainerFixture.startNewAgent("tester", tester);
try {
agentContainerFixture.waitForAgentDeath("tester");
}
catch (AssertionFailedError e) {
tester.getErrorManager().assertNoError();
}
assertFalse(tester.getErrorManager().hasError());
}
private static class AssertAuditArguments implements SubStep {
private final String expected;
private final boolean withWarnings;
private final String warningMessage;
private final String warningDescription;
AssertAuditArguments(String expectedResultFile,
boolean withWarnings,
String expectedWarningMessage,
String expectedWarningDescription) {
expected = expectedResultFile;
this.withWarnings = withWarnings;
warningMessage = expectedWarningMessage;
warningDescription = expectedWarningDescription;
}
public void run(Agent agent, AclMessage message)
throws AssertionFailedError {
JobAudit audit = (JobAudit)message.getContentObject();
Assert.assertNotNull(audit.getArguments());
Assert.assertEquals(expected,
audit.getArguments().get(BroadcastJobAgent.RESULT_FILE));
if (withWarnings) {
Assert.assertEquals("wrong status", Status.WARNING, audit.getStatus());
Assert.assertEquals("wrong description", warningDescription, audit.getWarning().getDescription());
Assert.assertEquals("wrong message", warningMessage, audit.getWarningMessage());
}
}
}
}