/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.control.common; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import junit.framework.TestCase; import net.codjo.control.common.i18n.InternationalizationFixture; import org.easymock.MockControl; /** * Description of the Class * * @author $Author: gonnot $ * @version $Revision: 1.7 $ */ public class PlanTest extends TestCase { private InternationalizationFixture i18nFixture = new InternationalizationFixture(); private Dictionary dico; private Connection mockConnection; private Plan plan; private ControlContext context; Map<Step, StepAudit> stepAudit; /** * Verifie l'ordre d'execution des Step (par priorit� ascendante) en mode JAVA. */ public void test_executeJAVA_StepOrder() throws Exception { FakeStep step2 = new FakeStep(2, Step.FOR_BATCH); FakeStep step3 = new FakeStep(3, Step.FOR_USER); FakeStep step1 = new FakeStep(1, Step.FOR_BATCH); plan.setType("sql"); plan.addStep(step2); plan.addStep(step3); plan.addStep(step1); plan.setType(Plan.JAVA_TYPE); final Object obj = new Object(); plan.executeJAVA(obj, dico, context, Step.FOR_BATCH, stepAudit); assertTrue(step1.called); assertTrue(step2.called); assertTrue(!step3.called); assertTrue(step1.time < step2.time); // Verification des arguments assertEquals(context, step1.ctxt); assertEquals(context, step2.ctxt); assertEquals(dico, step1.dico); assertEquals(dico, step2.dico); assertEquals(obj, step1.obj); assertEquals(obj, step2.obj); assertEquals(3, stepAudit.size()); assertStepAudit(step1, 1, 0); assertStepAudit(step2, 1, 0); assertStepAudit(step3, 0, 1); } /** * Verifie que si une �tape en mode JAVA �choue, on arr�te le processus. */ public void test_executeJAVA_failure() { FakeStep step2 = new FakeStep(2, Step.FOR_BATCH); FakeStep step1 = new FakeStep(1, new ControlException(0, "")); plan.addStep(step2); plan.addStep(step1); plan.setType(Plan.JAVA_TYPE); try { Map<Step, StepAudit> stepAudit = new HashMap<Step, StepAudit>(); plan.executeJAVA(new Object(), dico, context, Step.FOR_BATCH, stepAudit); fail("Une �tape doit �chouer"); } catch (ControlException e) { ; } assertTrue(step1.called); assertTrue(!step2.called); } public void test_hasStepFor() { FakeStep step2 = new FakeStep(2, Step.FOR_BATCH); plan.addStep(step2); plan.setType(Plan.JAVA_TYPE); assertEquals(true, plan.hasStepFor(Step.FOR_BATCH)); assertEquals(false, plan.hasStepFor(Step.FOR_ALL)); assertEquals(false, plan.hasStepFor(Step.FOR_USER)); } /** * Verifie que si le plan n'est pas en mode JAVA, l'appel a executeJAVA echoue. */ public void test_executeJAVA_failure_badMode() throws Exception { FakeStep step2 = new FakeStep(2, Step.FOR_BATCH); plan.addStep(step2); plan.setType("sql"); try { plan.executeJAVA(new Object(), dico, context, Step.FOR_BATCH, stepAudit); fail("Echec car plan n'est pas de type JAVA"); } catch (IllegalArgumentException e) { ; } assertTrue(!step2.called); } /** * Verifie l'ordre d'execution des Step (par priorit� ascendante) en mode SQL. */ public void test_executeSQL_StepOrder() throws SQLException, ControlException { FakeStep step2 = new FakeStep(2, Step.FOR_BATCH); FakeStep step3 = new FakeStep(3, Step.FOR_USER); FakeStep step1 = new FakeStep(1, Step.FOR_BATCH); plan.addStep(step2); plan.addStep(step3); plan.addStep(step1); plan.executeMASS(mockConnection, dico, null, Step.FOR_BATCH, null, stepAudit); assertTrue(step1.called); assertTrue(step2.called); assertTrue(!step3.called); assertTrue(step1.time < step2.time); } /** * Verifie l'ordre d'execution des Step (par priorit� ascendante) en simulant Castor. */ public void test_executeSQL_StepOrder_Castor() throws SQLException, ControlException { FakeStep step2 = new FakeStep(2, Step.FOR_BATCH); FakeStep step3 = new FakeStep(3, Step.FOR_USER); FakeStep step1 = new FakeStep(1, Step.FOR_BATCH); plan.setSteps(new ArrayList<Step>()); plan.getSteps().add(step2); plan.getSteps().add(step3); plan.getSteps().add(step1); plan.executeMASS(mockConnection, dico, null, Step.FOR_BATCH, null, stepAudit); assertTrue(step1.called); assertTrue(step2.called); assertTrue(!step3.called); assertTrue(step1.time < step2.time); } /** * Verifie q'on peux pas ajouter 2 steps avec la meme priority. */ public void test_executeSQL_StepOrder_SamePriority() { FakeStep step2 = new FakeStep(2, Step.FOR_BATCH); FakeStep step1 = new FakeStep(2, Step.FOR_BATCH); plan.setSteps(new ArrayList<Step>()); plan.getSteps().add(step2); try { plan.getSteps().add(step1); fail("Impossible d'avoir 2 fois la meme priority"); } catch (Exception ex) { ; } } /** * Verifie que si une �tape en mode SQL �choue, on arr�te le processus. */ public void test_executeSQL_failure() throws ControlException { FakeStep step2 = new FakeStep(2, Step.FOR_BATCH); FakeStep step1 = new FakeStep(1, new SQLException()); plan.addStep(step2); plan.addStep(step1); try { plan.executeMASS(mockConnection, dico, null, Step.FOR_BATCH, null, stepAudit); fail("Une �tape doit �chouer"); } catch (SQLException e) { ; } assertTrue(step1.called); assertTrue(!step2.called); } /** * Verifie que si le plan n'est pas en mode SQL, l'appel a executeSQL echoue. */ public void test_executeSQL_failure_badMode() throws SQLException, ControlException { FakeStep step2 = new FakeStep(2, Step.FOR_BATCH); plan.addStep(step2); plan.setType(Plan.JAVA_TYPE); try { plan.executeMASS(mockConnection, dico, null, Step.FOR_BATCH, null, stepAudit); fail("Echec car plan de type JAVA"); } catch (IllegalArgumentException e) { ; } assertTrue(!step2.called); } private void assertStepAudit(FakeStep step, int okRunningCount, int notOkRunningCount) { assertEquals(okRunningCount, stepAudit.get(step).getOkRunningCount()); assertEquals(notOkRunningCount, stepAudit.get(step).getNotOkRunningCount()); } @Override protected void setUp() throws Exception { i18nFixture.doSetUp(); initMockStuff(); plan = new Plan(); dico = new Dictionary(); context = new ControlContext("user", "prevId", null); stepAudit = new HashMap<Step, StepAudit>(); } @Override protected void tearDown() throws Exception { i18nFixture.doTearDown(); } private void initMockStuff() { MockControl control = MockControl.createControl(Connection.class); mockConnection = (Connection)control.getMock(); } private class FakeStep extends Step { private boolean called = false; private long time = 0; private ControlContext ctxt; private Object obj; private Dictionary dico; private Exception error; FakeStep(int priority, String stepFor) { setPriority(priority); setId("" + priority); setStepFor(stepFor); } FakeStep(int priority, Exception error) { setPriority(priority); setId("" + priority); setStepFor(FOR_ALL); this.error = error; } @Override public void execute(Object object, Dictionary dictionary, ControlContext context) throws ControlException { called = true; this.ctxt = context; this.dico = dictionary; this.obj = object; time = System.currentTimeMillis(); if (error != null) { throw (ControlException)error; } try { Thread.sleep(100); } catch (Exception e) { ; } } @Override public void execute(Connection con, Dictionary dictionary, String controlTableName, boolean mass, ControlContext context) throws SQLException { called = true; time = System.currentTimeMillis(); if (error != null) { throw (SQLException)error; } try { Thread.sleep(100); } catch (Exception e) { ; } } } }