diff options
| author | Thomas Lenz <thomas.lenz@egiz.gv.at> | 2018-06-26 11:03:48 +0200 | 
|---|---|---|
| committer | Thomas Lenz <thomas.lenz@egiz.gv.at> | 2018-06-26 11:03:48 +0200 | 
| commit | bee5dd259a4438d45ecd1bcc26dfba12875236d6 (patch) | |
| tree | fe1cf7a35cd15dee5fb3c05de0341aa63bf743e0 /eaaf_core/src/test/java | |
| download | EAAF-Components-bee5dd259a4438d45ecd1bcc26dfba12875236d6.tar.gz EAAF-Components-bee5dd259a4438d45ecd1bcc26dfba12875236d6.tar.bz2 EAAF-Components-bee5dd259a4438d45ecd1bcc26dfba12875236d6.zip | |
initial commit
Diffstat (limited to 'eaaf_core/src/test/java')
17 files changed, 1415 insertions, 0 deletions
| diff --git a/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/module/test/TestRequestImpl.java b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/module/test/TestRequestImpl.java new file mode 100644 index 00000000..92b2a709 --- /dev/null +++ b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/module/test/TestRequestImpl.java @@ -0,0 +1,257 @@ +/******************************************************************************* + *******************************************************************************/ +package at.gv.egiz.eaaf.core.impl.idp.module.test; + +import java.util.Map; + +import at.gv.egiz.eaaf.core.api.IRequest; +import at.gv.egiz.eaaf.core.api.idp.ISPConfiguration; +import at.gv.egiz.eaaf.core.exceptions.EAAFStorageException; + +/** + * @author tlenz + * + */ +public class TestRequestImpl implements IRequest { + +	private String processInstanceID = null;  +	 +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.moduls.IRequest#requestedModule() +	 */ +	@Override +	public String requestedModule() { +		// TODO Auto-generated method stub +		return null; +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.moduls.IRequest#requestedAction() +	 */ +	@Override +	public String requestedAction() { +		// TODO Auto-generated method stub +		return null; +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.moduls.IRequest#isPassiv() +	 */ +	@Override +	public boolean isPassiv() { +		// TODO Auto-generated method stub +		return false; +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.moduls.IRequest#forceAuth() +	 */ +	@Override +	public boolean forceAuth() { +		// TODO Auto-generated method stub +		return false; +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.moduls.IRequest#getGenericData(java.lang.String) +	 */ +	@Override +	public Object getGenericData(String key) { +		// TODO Auto-generated method stub +		return null; +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.moduls.IRequest#getGenericData(java.lang.String, java.lang.Class) +	 */ +	@Override +	public <T> T getGenericData(String key, Class<T> clazz) { +		// TODO Auto-generated method stub +		return null; +	} + + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.moduls.IRequest#getUniqueTransactionIdentifier() +	 */ +	@Override +	public String getUniqueTransactionIdentifier() { +		// TODO Auto-generated method stub +		return null; +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.moduls.IRequest#getUniqueSessionIdentifier() +	 */ +	@Override +	public String getUniqueSessionIdentifier() { +		// TODO Auto-generated method stub +		return null; +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.moduls.IRequest#getProcessInstanceId() +	 */ +	@Override +	public String getProcessInstanceId() { +		return processInstanceID; +		 +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.moduls.IRequest#getAuthURL() +	 */ +	@Override +	public String getAuthURL() { +		// TODO Auto-generated method stub +		return null; +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.moduls.IRequest#getAuthURLWithOutSlash() +	 */ +	@Override +	public String getAuthURLWithOutSlash() { +		// TODO Auto-generated method stub +		return null; +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.moduls.IRequest#isNeedAuthentication() +	 */ +	@Override +	public boolean isNeedAuthentication() { +		// TODO Auto-generated method stub +		return false; +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.moduls.IRequest#needSingleSignOnFunctionality() +	 */ +	@Override +	public boolean needSingleSignOnFunctionality() { +		// TODO Auto-generated method stub +		return false; +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.moduls.IRequest#setNeedSingleSignOnFunctionality(boolean) +	 */ +	@Override +	public void setNeedSingleSignOnFunctionality(boolean needSSO) { +		// TODO Auto-generated method stub + +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.moduls.IRequest#isAuthenticated() +	 */ +	@Override +	public boolean isAuthenticated() { +		// TODO Auto-generated method stub +		return false; +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.moduls.IRequest#setAuthenticated(boolean) +	 */ +	@Override +	public void setAuthenticated(boolean isAuthenticated) { +		// TODO Auto-generated method stub + +	} + +	/** +	 * @param processInstanceID the processInstanceID to set +	 */ +	public void setProcessInstanceID(String processInstanceID) { +		this.processInstanceID = processInstanceID; +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.moduls.IRequest#isAbortedByUser() +	 */ +	@Override +	public boolean isAbortedByUser() { +		// TODO Auto-generated method stub +		return false; +	} + +	/* (non-Javadoc) +	 * @see at.gv.egovernment.moa.id.moduls.IRequest#setAbortedByUser(boolean) +	 */ +	@Override +	public void setAbortedByUser(boolean isAborted) { +		// TODO Auto-generated method stub +		 +	} + +	@Override +	public String getSPEntityId() { +		// TODO Auto-generated method stub +		return null; +	} + +	@Override +	public void setGenericDataToSession(Map<String, Object> map) throws EAAFStorageException { +		// TODO Auto-generated method stub +		 +	} + +	@Override +	public Map<String, Object> genericFullDataStorage() { +		// TODO Auto-generated method stub +		return null; +	} + +	@Override +	public String getPendingRequestId() { +		// TODO Auto-generated method stub +		return null; +	} + +	@Override +	public String getSSOSessionIdentifier() { +		// TODO Auto-generated method stub +		return null; +	} + +	@Override +	public void setSSOSessionIdentifier(String internalSSOSessionId) { +		// TODO Auto-generated method stub +		 +	} + +	@Override +	public boolean isNeedUserConsent() { +		// TODO Auto-generated method stub +		return false; +	} + +	@Override +	public void setNeedUserConsent(boolean needConsent) { +		// TODO Auto-generated method stub +		 +	} + +	@Override +	public ISPConfiguration getServiceProviderConfiguration() { +		// TODO Auto-generated method stub +		return null; +	} + +	@Override +	public <T> T getServiceProviderConfiguration(Class<T> decorator) { +		// TODO Auto-generated method stub +		return null; +	} + +	@Override +	public void setGenericDataToSession(String key, Object object) throws EAAFStorageException { +		// TODO Auto-generated method stub +		 +	} +	 +	 + +} diff --git a/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/DummyTransactionStorage.java b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/DummyTransactionStorage.java new file mode 100644 index 00000000..15359261 --- /dev/null +++ b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/DummyTransactionStorage.java @@ -0,0 +1,165 @@ +/******************************************************************************* + *******************************************************************************/ +package at.gv.egiz.eaaf.core.impl.idp.process.spring.test; + +import java.util.ArrayList; +import java.util.Date; +import java.util.Iterator; +import java.util.List; + +import javax.sql.DataSource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import at.gv.egiz.eaaf.core.api.storage.ITransactionStorage; +import at.gv.egiz.eaaf.core.exceptions.EAAFException; + +/** + * Dummy DataSource implementation for convenience in test cases where a + * database connection will never actually be acquired. + * + * @see DataSource + * @author Chris Beams + */ +public class DummyTransactionStorage implements ITransactionStorage { + +	private static final Logger log = LoggerFactory.getLogger(DummyTransactionStorage.class); +	 +	 +	public class DummyDBEntry{ +		public DummyDBEntry(String key, Object value){ +			this.obj =value; +			this.key = key;  +		} +		public String getKey() { +			return key; +		} +		public void setKey(String key) { +			this.key = key; +		} +		public Object getObj() { +			return obj; +		} +		public void setObj(Object obj) { +			this.obj = obj; +		} +		private String key; +		private Object obj; +	} +	 +	private ArrayList<DummyDBEntry> ds = new ArrayList<DummyDBEntry>(); +	 + +	 +	@Override +	public boolean containsKey(String key) { +		// TODO Auto-generated method stub +		Iterator<DummyDBEntry> it = ds.iterator(); +		while(it.hasNext()){ +			DummyDBEntry t = it.next(); +			if(t.getKey().equals(key)) +				return true; +		} +		return false; +	} + +	@Override +	public void put(String key, Object value, int timeout) +			throws EAAFException { +		// TODO Auto-generated method stub +		this.remove(key); +		this.ds.add(new DummyDBEntry(key, value)); +		 +	} + +	@Override +	public Object get(String key) throws EAAFException { +		// TODO Auto-generated method stub +		Iterator<DummyDBEntry> it = ds.iterator(); +		while(it.hasNext()){ +			DummyDBEntry t = it.next(); +			if(t.getKey().equals(key)) +				return t; +		} +		return null; +	} + +	@Override +	public <T> T get(String key, Class<T> clazz) throws EAAFException { +		 +		  DummyDBEntry o = (DummyDBEntry) get(key); +		  if(o == null) +			  return null; +		  try { +			  @SuppressWarnings("unchecked") +			T test = (T) (clazz.cast(o.getObj())); +			return test; +			 +		  } catch (Exception e) { +			  log.warn("Sessioninformation Cast-Exception by using Artifact=" + key); +			throw new EAAFException("Sessioninformation Cast-Exception"); +			 +		  } +	} + +	@Override +	public <T> T get(String key, Class<T> clazz, long dataTimeOut) +			throws EAAFException { +		// TODO Auto-generated method stub +		return get(key,clazz); +	} + +	@Override +	public void changeKey(String oldKey, String newKey, Object value) +			throws EAAFException { +		this.remove(oldKey); +		this.put(newKey, value, -1); +		 +	} + +	@Override +	public void remove(String key) { +		Iterator<DummyDBEntry> it = ds.iterator(); +		while(it.hasNext()){ +			DummyDBEntry t = it.next(); +			if(t.getKey().equals(key)){ +				this.ds.remove(t); +				return; +			} +		} +		 +	} + +	@Override +	public List<String> clean(Date now, long dataTimeOut) { +		// TODO Auto-generated method stub +		return null; +	} + +	@Override +	public Object getRaw(String key) throws EAAFException { +		// TODO Auto-generated method stub +		return null; +	} + +	@Override +	public void putRaw(String key, Object element) throws EAAFException { +		// TODO Auto-generated method stub +		 +	} + +//	@Override +//	public Object getAssertionStore(String key) throwsEAAFException { +//		// TODO Auto-generated method stub +//		return null; +//	} +// +//	@Override +//	public void putAssertionStore(Object element) throws EAAFException { +//		// TODO Auto-generated method stub +//		 +//	} + +     +}
\ No newline at end of file diff --git a/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/ExpressionContextAdapter.java b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/ExpressionContextAdapter.java new file mode 100644 index 00000000..0a25ffe1 --- /dev/null +++ b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/ExpressionContextAdapter.java @@ -0,0 +1,54 @@ +/******************************************************************************* + *******************************************************************************/ +package at.gv.egiz.eaaf.core.impl.idp.process.spring.test; + + +import java.io.Serializable; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import at.gv.egiz.eaaf.core.api.idp.process.ExpressionEvaluationContext; + +/** + * Adapter class for {@link ExpressionEvaluationContext}. Intended to be used for testing purposes. + *  + * @author tknall + *  + */ +public class ExpressionContextAdapter implements ExpressionEvaluationContext { +  +	private static final long serialVersionUID = 1L; + +	private Map<String, Serializable> ctxData = Collections.synchronizedMap(new HashMap<String, Serializable>()); + +	/** +	 * Returns a certain {@link Serializable} object associated with a certain {@code key}. +	 *  +	 * @param key +	 *            The key. +	 * @return The object or {@code null} if no object was found stored with that key or if a {@code null} value was +	 *         stored. +	 */ +	Serializable get(String key) { +		return ctxData.get(key); +	} + +	/** +	 * Stores a {@link Serializable} with a certain {@code key}. +	 *  +	 * @param key +	 *            The key. +	 * @param object +	 *            The object. +	 */ +	void put(String key, Serializable object) { +		ctxData.put(key, object); +	} + +	@Override +	public Map<String, Serializable> getCtx() { +		return Collections.unmodifiableMap(ctxData); +	} + +} diff --git a/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/SimplePojo.java b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/SimplePojo.java new file mode 100644 index 00000000..de25ae3f --- /dev/null +++ b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/SimplePojo.java @@ -0,0 +1,43 @@ +/******************************************************************************* + *******************************************************************************/ +package at.gv.egiz.eaaf.core.impl.idp.process.spring.test; + +import at.gv.egiz.eaaf.core.api.idp.process.ExpressionEvaluator; + +/** + * A dummy pojo used to test {@link ExpressionEvaluator} with Spring EL referencing Spring beans. + *  + * @author tknall + *  + */ +public class SimplePojo { + +	private Boolean booleanValue; +	private String stringValue;  +	private Integer integerValue; + +	public Boolean getBooleanValue() { +		return booleanValue; +	} + +	public void setBooleanValue(Boolean booleanValue) { +		this.booleanValue = booleanValue; +	} + +	public String getStringValue() { +		return stringValue; +	} + +	public void setStringValue(String stringValue) { +		this.stringValue = stringValue; +	} + +	public Integer getIntegerValue() { +		return integerValue; +	} + +	public void setIntegerValue(Integer integerValue) { +		this.integerValue = integerValue; +	} + +} diff --git a/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/SpringExpressionAwareProcessEngineTest.java b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/SpringExpressionAwareProcessEngineTest.java new file mode 100644 index 00000000..a12e3856 --- /dev/null +++ b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/SpringExpressionAwareProcessEngineTest.java @@ -0,0 +1,153 @@ +/******************************************************************************* + *******************************************************************************/ +package at.gv.egiz.eaaf.core.impl.idp.process.spring.test; + +import static at.gv.egiz.eaaf.core.impl.idp.process.ProcessInstanceState.NOT_STARTED; +import static at.gv.egiz.eaaf.core.impl.idp.process.ProcessInstanceState.SUSPENDED; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.io.InputStream; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext; +import at.gv.egiz.eaaf.core.api.idp.process.ProcessEngine; +import at.gv.egiz.eaaf.core.exceptions.ProcessExecutionException; +import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl; +import at.gv.egiz.eaaf.core.impl.idp.process.ProcessDefinitionParserException; +import at.gv.egiz.eaaf.core.impl.idp.process.ProcessEngineImpl; +import at.gv.egiz.eaaf.core.impl.idp.process.ProcessInstance; +import at.gv.egiz.eaaf.core.impl.idp.process.spring.SpringExpressionEvaluator; + +/** + * Tests the process engine using processes based on Spring EL referencing the process context and further Spring beans. + *  + * @author tknall + *  + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("/process/spring/test/SpringExpressionAwareProcessEngineTest-context.xml") +public class SpringExpressionAwareProcessEngineTest { + +	@Autowired private static ProcessEngine pe; +	@Autowired private ApplicationContext applicationContext; +	 +	private boolean isInitialized = false;  + +	@Before +	public void init() throws IOException, ProcessDefinitionParserException { + +		if (!isInitialized) { + +			if (pe == null) { +				pe = applicationContext.getBean("processEngine", ProcessEngine.class); +				 +			} + +			((ProcessEngineImpl) pe).setTransitionConditionExpressionEvaluator(new SpringExpressionEvaluator()); +			try (InputStream in = SpringExpressionAwareProcessEngineTest.class.getResourceAsStream("/process/spring/test/SampleProcessDefinitionWithExpression1.xml")) { +				((ProcessEngineImpl) pe).registerProcessDefinition(in); +			} +			try (InputStream in = SpringExpressionAwareProcessEngineTest.class.getResourceAsStream("/process/spring/test/SampleProcessDefinitionForSAML1Authentication.xml")) { +				((ProcessEngineImpl) pe).registerProcessDefinition(in); +			} + +		//initHibernateForTesting(); +		} +	} + +	private static void initHibernateForTesting() throws IOException{ + +//		InputStream in = SpringExpressionAwareProcessEngineTest.class.getResourceAsStream("/at/gv/egovernment/moa/id/process/hibernate.configuration.test.properties"); +//		Properties props = new Properties(); +//		props.load(in); +// +//		try { +//			//ConfigurationDBUtils.initHibernate(props); +//			Configuration config = new Configuration(); +//			config.addProperties(props); +//			//config.addAnnotatedClass(ProcessInstanceStore.class); +//			config.addAnnotatedClass(AssertionStore.class); +//			//MOASessionDBUtils.initHibernate(config, props); +//		} catch (Exception e) { +//			e.printStackTrace(); +//		} +	} + + +	@Test +	public void testSampleProcessDefinitionWithExpression1() throws IOException, ProcessDefinitionParserException, ProcessExecutionException { + +		TestRequestImpl req =  new TestRequestImpl(); +		 +		String piId = pe.createProcessInstance("SampleProcessWithExpression1"); +		ProcessInstance pi = pe.getProcessInstance(piId); +		assertEquals(NOT_STARTED, pi.getState()); +		 +		 +		// start process +		req.setProcessInstanceID(piId); +		pe.start(req); +		 +		//processInstance should be removed when it ends +		try { +			pi = pe.getProcessInstance(piId); +			throw new ProcessExecutionException("ProcessInstance should be removed already, but it was found."); +			//assertEquals(ENDED, pi.getState()); +			 +		} catch (IllegalArgumentException e) { +			// do nothing because processInstance should be already removed  +			 +		} +	} + +	@Test +	public void testSampleProcessDefinitionForSAML1Authentication() throws IOException, ProcessDefinitionParserException, ProcessExecutionException { + +		TestRequestImpl req =  new TestRequestImpl(); +		 +		String piId = pe.createProcessInstance("SampleProcessDefinitionForSAML1Authentication"); +		ProcessInstance pi = pe.getProcessInstance(piId); +		assertEquals(NOT_STARTED, pi.getState()); + +		// start process +		req.setProcessInstanceID(piId); +		pe.start(req);		 +		pi = pe.getProcessInstance(piId); +		assertEquals(SUSPENDED, pi.getState()); +		 +		ExecutionContext ec = pi.getExecutionContext(); +		assertNotNull(ec); +		System.out.println(ec.keySet()); + +		assertNotNull(ec.get("bkuURL")); +		assertNotNull(ec.get("IdentityLink")); +		assertNotNull(ec.get("isIdentityLinkValidated")); +		assertNotNull(ec.get("SignedAuthBlock")); +		assertNotNull(ec.get("isSignedAuthBlockValidated")); +		assertNotNull(ec.get("SAML1Assertion")); +		 +		pe.signal(req); +		try { +			pi = pe.getProcessInstance(piId); +			throw new ProcessExecutionException("ProcessInstance should be removed already, but it was found."); +			//assertEquals(ENDED, pi.getState()); +			 +		} catch (IllegalArgumentException e) { +			// do nothing because processInstance should be already removed  +			 +		} + + + +	} + +} diff --git a/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/SpringExpressionEvaluatorTest.java b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/SpringExpressionEvaluatorTest.java new file mode 100644 index 00000000..8f1ac098 --- /dev/null +++ b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/SpringExpressionEvaluatorTest.java @@ -0,0 +1,56 @@ +/******************************************************************************* + *******************************************************************************/ +package at.gv.egiz.eaaf.core.impl.idp.process.spring.test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import at.gv.egiz.eaaf.core.api.idp.process.ExpressionEvaluator; + +/** + * Tests the {@link ExpressionEvaluator} using a Spring EL based implementation capable of dereferencing Spring beans. + *  + * @author tknall + *  + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("/process/spring/test/SpringExpressionEvaluatorTest-context.xml") +public class SpringExpressionEvaluatorTest { + +	private ExpressionContextAdapter ctx; + +	@Autowired  +	private ExpressionEvaluator expressionEvaluator; + +	@Before +	public void prepareTest() { +		ctx = new ExpressionContextAdapter(); +	} + +	@Test +	public void testEvaluateSimpleExpression() { +		assertTrue(expressionEvaluator.evaluate(ctx, "'true'")); +	} + +	@Test +	public void testEvaluateExpressionWithCtx() { +		ctx.put("myProperty", false); +		assertFalse(expressionEvaluator.evaluate(ctx, "ctx['myProperty']")); +	} + +//	@Test +	public void testEvaluateExpressionWithBeanReference() { +		assertTrue(expressionEvaluator.evaluate(ctx, "@simplePojo.booleanValue")); +		assertTrue(expressionEvaluator.evaluate(ctx, "'HelloWorld'.equals(@simplePojo.stringValue)")); +		assertTrue(expressionEvaluator.evaluate(ctx, "@simplePojo.integerValue == 42")); +		assertTrue(expressionEvaluator.evaluate(ctx, "@simplePojo.stringValue.length() == 10")); +	} + +} diff --git a/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/task/CreateSAML1AssertionTask.java b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/task/CreateSAML1AssertionTask.java new file mode 100644 index 00000000..cd1d8c0e --- /dev/null +++ b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/task/CreateSAML1AssertionTask.java @@ -0,0 +1,63 @@ +/******************************************************************************* + *******************************************************************************/ +package at.gv.egiz.eaaf.core.impl.idp.process.spring.test.task; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Objects; + +import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import at.gv.egiz.eaaf.core.api.IRequest; +import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext; +import at.gv.egiz.eaaf.core.api.idp.process.Task; +import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException; + +/** + * A dummy task simulating the creation of a SAML1 assertion. + * <p> + * Requires context data: + * <ul> + * <li>{@code IdentityLink}</li> + * <li>{@code isIdentityLinkValidated}</li> + * <li>{@code SignedAuthBlock}</li> + * <li>{@code isSignedAuthBlockValidated}</li> + * </ul> + * </p> + * <p> + * Enriches context data with: + * <ul> + * <li>{@code SAML1Assertion}</li> + * </ul> + * </p> + *  + * @author tknall + *  + */ +@Service("CreateSAML1AssertionTask") +public class CreateSAML1AssertionTask implements Task { + +	private Logger log = LoggerFactory.getLogger(getClass()); +  +	@Override +	public IRequest execute(IRequest penReq, ExecutionContext executionContext) throws TaskExecutionException { +		Objects.requireNonNull(executionContext.get("IdentityLink")); +		assert (Boolean.TRUE.equals(Objects.requireNonNull(executionContext.get("isIdentityLinkValidated")))); +		Objects.requireNonNull(executionContext.get("SignedAuthBlock")); +		assert (Boolean.TRUE.equals(Objects.requireNonNull(executionContext.get("isSignedAuthBlockValidated")))); + +		log.debug("Using IdentityLink and signed auth block in order to create SAML1 assertion."); + +		try (InputStream in = getClass().getResourceAsStream("/process/spring/test/task/SAML1Assertion.xml")) { +			executionContext.put("SAML1Assertion", IOUtils.toString(in, "UTF-8")); +		} catch (IOException e) { +			throw new TaskExecutionException(null, "", e); +		} + +		return null; +	} + +} diff --git a/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/task/GetIdentityLinkTask.java b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/task/GetIdentityLinkTask.java new file mode 100644 index 00000000..6f7246f1 --- /dev/null +++ b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/task/GetIdentityLinkTask.java @@ -0,0 +1,60 @@ +/******************************************************************************* + *******************************************************************************/ +package at.gv.egiz.eaaf.core.impl.idp.process.spring.test.task; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Objects; + +import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import at.gv.egiz.eaaf.core.api.IRequest; +import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext; +import at.gv.egiz.eaaf.core.api.idp.process.Task; +import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException; + +/** + * A dummy task simulating the retrieval of an IdentityLink. + * <p/> + * Asynchonous + * <p> + * Requires context data: + * <ul> + * <li>{@code bkuURL}</li> + * </ul> + * </p> + * <p> + * Enriches context data with: + * <ul> + * <li>{@code IdentityLink}</li> + * </ul> + * </p> + *  + * @author tknall + *  + */ +@Service("GetIdentityLinkTask") +public class GetIdentityLinkTask implements Task {  + +	private Logger log = LoggerFactory.getLogger(getClass()); + +	@Override +	public IRequest execute(IRequest penReq, ExecutionContext executionContext) throws TaskExecutionException { +		Objects.requireNonNull(executionContext.get("bkuURL")); + +		log.debug("Using bkuURL in order to retrieve IdentityLink."); + +		try (InputStream in = getClass().getResourceAsStream("/process/spring/test/task/IdentityLink_Max_Mustermann.xml")) { +			executionContext.put("IdentityLink", IOUtils.toString(in, "UTF-8")); +			 +		} catch (IOException e) { +			throw new TaskExecutionException(null, "", e); +		} +		 +		return null; +	} + +} diff --git a/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/task/SelectBKUTask.java b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/task/SelectBKUTask.java new file mode 100644 index 00000000..a763c759 --- /dev/null +++ b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/task/SelectBKUTask.java @@ -0,0 +1,39 @@ +/******************************************************************************* + *******************************************************************************/ +package at.gv.egiz.eaaf.core.impl.idp.process.spring.test.task; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import at.gv.egiz.eaaf.core.api.IRequest; +import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext; +import at.gv.egiz.eaaf.core.api.idp.process.Task; + +/** + * A dummy task simulating a bku selection. + * <p/> + * Asynchonous + * <p> + * Enriches context data with: + * <ul> + * <li>{@code bkuURL}</li> + * </ul> + * </p> + *  + * @author tknall + *  + */ +@Service("SelectBKUTask") +public class SelectBKUTask implements Task { +  +	private Logger log = LoggerFactory.getLogger(getClass()); + +	@Override +	public IRequest execute(IRequest penReq, ExecutionContext executionContext) { +		log.debug("Providing BKU selection."); +		executionContext.put("bkuURL", "https://127.0.0.1:3496/https-security-layer-request"); +		return null; +	} + +} diff --git a/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/task/SignAuthBlockTask.java b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/task/SignAuthBlockTask.java new file mode 100644 index 00000000..5b3158e3 --- /dev/null +++ b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/task/SignAuthBlockTask.java @@ -0,0 +1,62 @@ +/******************************************************************************* + *******************************************************************************/ +package at.gv.egiz.eaaf.core.impl.idp.process.spring.test.task; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Objects; + +import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import at.gv.egiz.eaaf.core.api.IRequest; +import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext; +import at.gv.egiz.eaaf.core.api.idp.process.Task; +import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException; + +/** + * A dummy task simulating the signature of an auth block. + * <p/> + * Asynchonous + * <p> + * Requires context data: + * <ul> + * <li>{@code IdentityLink}</li> + * <li>{@code isIdentityLinkValidated}</li> + * <li>{@code bkuURL}</li> + * </ul> + * </p> + * <p> + * Enriches context data with: + * <ul> + * <li>{@code SignedAuthBlock}</li> + * </ul> + * </p> + *  + * @author tknall + *  + */ +@Service("SignAuthBlockTask") +public class SignAuthBlockTask implements Task {  + +	private Logger log = LoggerFactory.getLogger(getClass()); + +	@Override +	public IRequest execute(IRequest penReq, ExecutionContext executionContext) throws TaskExecutionException { +		Objects.requireNonNull(executionContext.get("IdentityLink")); +		assert (Boolean.TRUE.equals(Objects.requireNonNull(executionContext.get("isIdentityLinkValidated")))); +		Objects.requireNonNull(executionContext.get("bkuURL")); + +		log.debug("Using validated IdentityLink and bkuURL in order to sign auth block."); +		try (InputStream in = getClass().getResourceAsStream("/process/spring/test/task/SignedAuthBlock.xml")) { +			executionContext.put("SignedAuthBlock", IOUtils.toString(in, "UTF-8")); +		} catch (IOException e) { +			throw new TaskExecutionException(null, "", e); +						 +		} +		return null; +	} + +} diff --git a/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/task/ValidateIdentityLinkTask.java b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/task/ValidateIdentityLinkTask.java new file mode 100644 index 00000000..8d4d507b --- /dev/null +++ b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/task/ValidateIdentityLinkTask.java @@ -0,0 +1,48 @@ +/******************************************************************************* + *******************************************************************************/ +package at.gv.egiz.eaaf.core.impl.idp.process.spring.test.task; + +import java.util.Objects; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import at.gv.egiz.eaaf.core.api.IRequest; +import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext; +import at.gv.egiz.eaaf.core.api.idp.process.Task; + +/** + * Dummy task simulating the validation of an IdentityLink. + * <p> + * Requires context data: + * <ul> + * <li>{@code IdentityLink}</li> + * </ul> + * </p> + * <p> + * Enriches context data with: + * <ul> + * <li>{@code isIdentityLinkValidated}</li> + * </ul> + * </p> + *  + * @author tknall  + *  + */ +@Service("ValidateIdentityLinkTask") +public class ValidateIdentityLinkTask implements Task { + +	private Logger log = LoggerFactory.getLogger(getClass()); + +	@Override +	public IRequest execute(IRequest penReq, ExecutionContext executionContext) { +		Objects.requireNonNull(executionContext.get("IdentityLink")); + +		log.debug("Validating IdentityLink."); + +		executionContext.put("isIdentityLinkValidated", true); +		return null; +	} + +} diff --git a/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/task/ValidateSignedAuthBlockTask.java b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/task/ValidateSignedAuthBlockTask.java new file mode 100644 index 00000000..26d1146d --- /dev/null +++ b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/spring/test/task/ValidateSignedAuthBlockTask.java @@ -0,0 +1,53 @@ +/******************************************************************************* + *******************************************************************************/ +package at.gv.egiz.eaaf.core.impl.idp.process.spring.test.task; + +import java.util.Objects; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import at.gv.egiz.eaaf.core.api.IRequest; +import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext; +import at.gv.egiz.eaaf.core.api.idp.process.Task; +import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException; + +/** + * A dummy task simulating the validation of an auth block. + * <p> + * Requires context data: + * <ul> + * <li>{@code IdentityLink}</li> + * <li>{@code isIdentityLinkValidated}</li> + * <li>{@code SignedAuthBlock}</li> + * </ul> + * </p> + * <p> + * Enriches context data with: + * <ul> + * <li>{@code isSignedAuthBlockValidated}</li> + * </ul> + * </p> + *  + * @author tknall + *  + */ +@Service("ValidateSignedAuthBlockTask") +public class ValidateSignedAuthBlockTask implements Task { + +	private Logger log = LoggerFactory.getLogger(getClass());  + +	@Override +	public IRequest execute(IRequest penReq, ExecutionContext executionContext) throws TaskExecutionException { +		Objects.requireNonNull(executionContext.get("IdentityLink")); +		assert (Boolean.TRUE.equals(Objects.requireNonNull(executionContext.get("isIdentityLinkValidated")))); +		Objects.requireNonNull(executionContext.get("SignedAuthBlock")); + +		log.debug("Using validated IdentityLink and signed auth block in order to validate signed auth block."); + +		executionContext.put("isSignedAuthBlockValidated", true); +		return null; +	} + +} diff --git a/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/test/BooleanStringExpressionEvaluator.java b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/test/BooleanStringExpressionEvaluator.java new file mode 100644 index 00000000..9b03f60f --- /dev/null +++ b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/test/BooleanStringExpressionEvaluator.java @@ -0,0 +1,26 @@ +/******************************************************************************* + *******************************************************************************/ +package at.gv.egiz.eaaf.core.impl.idp.process.test; + +import java.util.Objects; + +import org.apache.commons.lang3.BooleanUtils; + +import at.gv.egiz.eaaf.core.api.idp.process.ExpressionEvaluationContext; +import at.gv.egiz.eaaf.core.api.idp.process.ExpressionEvaluator; + +/** + * Expression evaluator that guesses the boolean value from a String. Refer to {@link BooleanUtils#toBoolean(String)} + * for further information. + *  + * @author tknall + *   + */ +public class BooleanStringExpressionEvaluator implements ExpressionEvaluator { + +	@Override +	public boolean evaluate(ExpressionEvaluationContext expressionContext, String expression) { +		return BooleanUtils.toBoolean(Objects.requireNonNull(expression, "Expression must not be null.")); +	} + +} diff --git a/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/test/HalloWeltTask.java b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/test/HalloWeltTask.java new file mode 100644 index 00000000..62e82bac --- /dev/null +++ b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/test/HalloWeltTask.java @@ -0,0 +1,26 @@ +/******************************************************************************* + *******************************************************************************/ +package at.gv.egiz.eaaf.core.impl.idp.process.test; + +import org.springframework.stereotype.Service; + +import at.gv.egiz.eaaf.core.api.IRequest; +import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext; +import at.gv.egiz.eaaf.core.api.idp.process.Task; + +/** + * Simple task that just outputs a "Hallo World" text to the console. + *  + * @author tknall + *  + */ +@Service("HalloWeltTask") +public class HalloWeltTask implements Task { +  +	@Override +	public IRequest execute(IRequest pendingReq, ExecutionContext executionContext) { +		System.out.println("Hallo Welt"); +		return null; +	} + +} diff --git a/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/test/HelloWorldTask.java b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/test/HelloWorldTask.java new file mode 100644 index 00000000..1338ca50 --- /dev/null +++ b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/test/HelloWorldTask.java @@ -0,0 +1,26 @@ +/******************************************************************************* + *******************************************************************************/ +package at.gv.egiz.eaaf.core.impl.idp.process.test; + +import org.springframework.stereotype.Service; + +import at.gv.egiz.eaaf.core.api.IRequest; +import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext; +import at.gv.egiz.eaaf.core.api.idp.process.Task; + +/** + * Simple task that just outputs a "Hello World" text to the console. + *  + * @author tknall + *  + */ +@Service("HelloWorldTask") +public class HelloWorldTask implements Task { +  +	@Override +	public IRequest execute(IRequest pendingReq, ExecutionContext executionContext) { +		System.out.println("Hello World"); +		return null; +	} + +} diff --git a/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/test/ProcessDefinitionParserTest.java b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/test/ProcessDefinitionParserTest.java new file mode 100644 index 00000000..47b52ce7 --- /dev/null +++ b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/test/ProcessDefinitionParserTest.java @@ -0,0 +1,139 @@ +/******************************************************************************* + *******************************************************************************/ +package at.gv.egiz.eaaf.core.impl.idp.process.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.io.InputStream; + +import org.junit.Test; + +import at.gv.egiz.eaaf.core.impl.idp.process.ProcessDefinitionParser; +import at.gv.egiz.eaaf.core.impl.idp.process.ProcessDefinitionParserException; +import at.gv.egiz.eaaf.core.impl.idp.process.model.EndEvent; +import at.gv.egiz.eaaf.core.impl.idp.process.model.ProcessDefinition; +import at.gv.egiz.eaaf.core.impl.idp.process.model.ProcessNode; +import at.gv.egiz.eaaf.core.impl.idp.process.model.StartEvent; +import at.gv.egiz.eaaf.core.impl.idp.process.model.TaskInfo; +import at.gv.egiz.eaaf.core.impl.idp.process.model.Transition; + +public class ProcessDefinitionParserTest { +	  +	@Test(expected = ProcessDefinitionParserException.class) +	public void testParseInvalidProcessDefinition_MultipleStartEvents() throws IOException, ProcessDefinitionParserException { +		try (InputStream in = getClass().getResourceAsStream("InvalidProcessDefinition_MultipleStartEvents.xml")) { +			new ProcessDefinitionParser().parse(in); +		} +	} +	 +	@Test(expected = ProcessDefinitionParserException.class) +	public void testParseInvalidProcessDefinition_TransitionLoop() throws IOException, ProcessDefinitionParserException { +		try (InputStream in = getClass().getResourceAsStream("InvalidProcessDefinition_TransitionLoop.xml")) { +			new ProcessDefinitionParser().parse(in); +		} +	} +	 +	@Test(expected = ProcessDefinitionParserException.class) +	public void testParseInvalidProcessDefinition_TransitionStartsFromEndEvent() throws IOException, ProcessDefinitionParserException { +		try (InputStream in = getClass().getResourceAsStream("InvalidProcessDefinition_TransitionStartsFromEndEvent.xml")) { +			new ProcessDefinitionParser().parse(in); +		} +	} +	 +	@Test(expected = ProcessDefinitionParserException.class) +	public void testParseInvalidProcessDefinition_TransitionRefsTransition() throws IOException, ProcessDefinitionParserException { +		try (InputStream in = getClass().getResourceAsStream("InvalidProcessDefinition_TransitionRefsTransition.xml")) { +			new ProcessDefinitionParser().parse(in); +		} +	} +	 +	@Test(expected = ProcessDefinitionParserException.class) +	public void testParseInvalidProcessDefinition_NoStartEvents() throws IOException, ProcessDefinitionParserException { +		try (InputStream in = getClass().getResourceAsStream("InvalidProcessDefinition_NoStartEvents.xml")) { +			new ProcessDefinitionParser().parse(in); +		} +	} +	 +	@Test +	public void testParseSampleProcessDefinition() throws IOException, ProcessDefinitionParserException { +		try (InputStream in = getClass().getResourceAsStream("/process/test/SampleProcessDefinition1.xml")) { +			 +			ProcessDefinitionParser parser = new ProcessDefinitionParser(); +			ProcessDefinition pd = parser.parse(in); +			 +			assertNotNull(pd); +			assertEquals("SampleProcess1", pd.getId()); +			 +			// first assert tasks then transitions +			// start event +			StartEvent startEvent = pd.getStartEvent(); +			assertNotNull(startEvent); +			assertEquals("start", startEvent.getId()); +			assertEquals(startEvent, pd.getProcessNode("start")); +			// task1 +			ProcessNode processNode = pd.getProcessNode("task1"); +			assertNotNull(processNode); +			assertTrue(processNode instanceof TaskInfo); +			TaskInfo task1 = (TaskInfo) processNode; +			assertEquals("task1", task1.getId()); +			assertFalse(task1.isAsync()); +			// task2  +			processNode = pd.getProcessNode("task2"); +			assertNotNull(processNode); +			assertTrue(processNode instanceof TaskInfo); +			TaskInfo task2 = (TaskInfo) processNode; +			assertEquals("task2", task2.getId()); +			assertTrue(task2.isAsync()); +			// end event +			processNode = pd.getProcessNode("end"); +			assertNotNull(processNode); +			assertTrue(processNode instanceof EndEvent); +			EndEvent endEvent = (EndEvent) processNode; +			assertEquals("end", endEvent.getId()); +			 +			// assert transitions +			// start event +			assertNotNull(startEvent.getIncomingTransitions()); +			assertTrue(startEvent.getIncomingTransitions().isEmpty()); +			assertNotNull(startEvent.getOutgoingTransitions()); +			assertEquals(1, startEvent.getOutgoingTransitions().size()); +			// transition from start to task1 +			Transition startToTask1 = startEvent.getOutgoingTransitions().get(0); +			assertEquals("fromStart", startToTask1.getId()); +			assertEquals(startEvent, startToTask1.getFrom()); +			assertEquals(task1, startToTask1.getTo()); +			assertEquals("true", startToTask1.getConditionExpression()); +			// task1 +			assertNotNull(task1.getIncomingTransitions()); +			assertEquals(1, task1.getIncomingTransitions().size()); +			assertEquals(startToTask1, task1.getIncomingTransitions().get(0)); +			assertNotNull(task1.getOutgoingTransitions()); +			assertEquals(1, task1.getOutgoingTransitions().size()); +			// transition from task1 to task2 +			Transition task1ToTask2 = task1.getOutgoingTransitions().get(0); +			assertNull(task1ToTask2.getId()); +			assertEquals(task1, task1ToTask2.getFrom()); +			assertEquals(task2, task1ToTask2.getTo()); +			assertNull(task1ToTask2.getConditionExpression()); +			// task2 +			assertNotNull(task2.getIncomingTransitions()); +			assertEquals(1, task2.getIncomingTransitions().size()); +			assertEquals(task1ToTask2, task2.getIncomingTransitions().get(0)); +			assertNotNull(task2.getOutgoingTransitions()); +			assertEquals(1, task2.getOutgoingTransitions().size()); +			// transition from task2 to end +			Transition task2ToEnd = task2.getOutgoingTransitions().get(0); +			assertNull(task2ToEnd.getId()); +			assertEquals(task2, task2ToEnd.getFrom()); +			assertEquals(endEvent, task2ToEnd.getTo()); +			assertNull(task2ToEnd.getConditionExpression()); +			 +		} +	} + +} diff --git a/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/test/ProcessEngineTest.java b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/test/ProcessEngineTest.java new file mode 100644 index 00000000..fe07f74d --- /dev/null +++ b/eaaf_core/src/test/java/at/gv/egiz/eaaf/core/impl/idp/process/test/ProcessEngineTest.java @@ -0,0 +1,145 @@ +/******************************************************************************* + *******************************************************************************/ +package at.gv.egiz.eaaf.core.impl.idp.process.test; + +import static at.gv.egiz.eaaf.core.impl.idp.process.ProcessInstanceState.NOT_STARTED; +import static at.gv.egiz.eaaf.core.impl.idp.process.ProcessInstanceState.SUSPENDED; +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.io.InputStream; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import at.gv.egiz.eaaf.core.api.idp.process.ProcessEngine; +import at.gv.egiz.eaaf.core.exceptions.ProcessExecutionException; +import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl; +import at.gv.egiz.eaaf.core.impl.idp.process.ProcessDefinitionParser; +import at.gv.egiz.eaaf.core.impl.idp.process.ProcessDefinitionParserException; +import at.gv.egiz.eaaf.core.impl.idp.process.ProcessEngineImpl; +import at.gv.egiz.eaaf.core.impl.idp.process.ProcessInstance; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("/process/spring/test/SpringExpressionAwareProcessEngineTest-context.xml") +public class ProcessEngineTest { +	 +	@Autowired private static ProcessEngine pe; +  +	@Autowired private ApplicationContext applicationContext; +	 +	private boolean isInitialized = false; +	 +	@Before +	public void init() throws IOException, ProcessDefinitionParserException { +		 +		if (!isInitialized) { +			ProcessDefinitionParser pdp = new ProcessDefinitionParser(); + +			if (pe == null) { +				pe = applicationContext.getBean("processEngine", ProcessEngine.class); +				 +			} +			 +			((ProcessEngineImpl) pe).setTransitionConditionExpressionEvaluator(new BooleanStringExpressionEvaluator()); +			try (InputStream in = ProcessEngineTest.class.getResourceAsStream("/process/test/SampleProcessDefinition1.xml")) { +				((ProcessEngineImpl) pe).registerProcessDefinition(pdp.parse(in)); +			} +			try (InputStream in = ProcessEngineTest.class.getResourceAsStream("/process/test/SampleProcessDefinition2.xml")) { +				((ProcessEngineImpl) pe).registerProcessDefinition(pdp.parse(in)); +			} + +			//initHibernateForTesting(); +			isInitialized = true; +		} +	} +	 +	private static void initHibernateForTesting() throws IOException{ + +//		InputStream in = ProcessEngineTest.class.getResourceAsStream("/at/gv/egovernment/moa/id/process/hibernate.configuration.test.properties"); +//		Properties props = new Properties(); +//		props.load(in); +// +//		try { +//			//ConfigurationDBUtils.initHibernate(props); +//			Configuration config = new Configuration(); +//			config.addProperties(props); +//			//config.addAnnotatedClass(ProcessInstanceStore.class); +//			config.addAnnotatedClass(AssertionStore.class); +//			//MOASessionDBUtils.initHibernate(config, props); +//		} catch (Exception e) { +//			e.printStackTrace(); +//		} +	} +	 +	@Test +	public void testSampleProcess1() throws IOException, ProcessDefinitionParserException, ProcessExecutionException { +		 +		TestRequestImpl testReq = new TestRequestImpl(); +		 +		String piId = pe.createProcessInstance("SampleProcess1"); +		ProcessInstance pi = pe.getProcessInstance(piId); +		assertEquals(NOT_STARTED, pi.getState()); + +		// start process +		testReq.setProcessInstanceID(piId); +		pe.start(testReq); +		pi = pe.getProcessInstance(piId); +		assertEquals(SUSPENDED, pi.getState()); + +		System.out.println("Do something asynchronously"); +		testReq.setProcessInstanceID(piId); +		pe.signal(testReq); +		try { +			pi = pe.getProcessInstance(piId); +			throw new ProcessExecutionException("ProcessInstance should be removed already, but it was found."); +			//assertEquals(ENDED, pi.getState()); +			 +		} catch (IllegalArgumentException e) { +			// do nothing because processInstance should be already removed  +			 +		} +	} +	 +	@Test +	public void testSampleProcess2() throws IOException, ProcessDefinitionParserException, ProcessExecutionException { + +		TestRequestImpl testReq = new TestRequestImpl(); +		 +		String piId = pe.createProcessInstance("SampleProcess2"); +		ProcessInstance pi = pe.getProcessInstance(piId); +		assertEquals(NOT_STARTED, pi.getState()); + +		// start process +		testReq.setProcessInstanceID(piId); +		pe.start(testReq); +		pi = pe.getProcessInstance(piId); +		assertEquals(SUSPENDED, pi.getState()); + +		System.out.println("Do something asynchronously"); +		testReq.setProcessInstanceID(piId); +		pe.signal(testReq); +		try { +			pi = pe.getProcessInstance(piId); +			throw new ProcessExecutionException("ProcessInstance should be removed already, but it was found."); +			//assertEquals(ENDED, pi.getState()); +			 +		} catch (IllegalArgumentException e) { +			// do nothing because processInstance should be already removed  +			 +		} +		 +		 +	} + +	@Test(expected = IllegalArgumentException.class) +	public void testProcessInstanceDoesNotExist() { +		pe.getProcessInstance("does not exist"); +	} + +} | 
