package org.marketcetera.util.ws.stateless; import java.util.Iterator; import java.util.Locale; import org.apache.commons.lang.math.NumberUtils; import org.apache.log4j.Level; import org.apache.log4j.spi.LoggingEvent; import org.junit.Before; import org.marketcetera.util.except.I18NException; import org.marketcetera.util.log.ActiveLocale; import org.marketcetera.util.log.I18NBoundMessage2P; import org.marketcetera.util.test.TestCaseBase; import org.marketcetera.util.ws.tags.AppId; import org.marketcetera.util.ws.tags.EqualsTagFilter; import org.marketcetera.util.ws.tags.NodeId; import org.marketcetera.util.ws.tags.VersionId; import org.marketcetera.util.ws.tags.VersionIdTest; import org.marketcetera.util.ws.wrappers.LocaleWrapper; import org.marketcetera.util.ws.wrappers.RemoteException; import static org.junit.Assert.*; /** * @author tlerios@marketcetera.com * @since 1.0.0 * @version $Id: StatelessRemoteCallTestBase.java 16841 2014-02-20 19:59:04Z colin $ */ /* $License$ */ public class StatelessRemoteCallTestBase extends TestCaseBase { protected static final EqualsTagFilter TEST_VERSION_FILTER= new EqualsTagFilter(null,TestMessages.MESSAGE); protected static final EqualsTagFilter TEST_APP_FILTER= new EqualsTagFilter(null,TestMessages.MESSAGE); protected static final EqualsTagFilter TEST_CLIENT_FILTER= new EqualsTagFilter(null,TestMessages.MESSAGE); private static final VersionId TEST_VERSION= VersionId.SELF; protected static final VersionId TEST_VERSION_D= VersionIdTest.TEST_VERSION_D; private static final AppId TEST_APP= new AppId("testApp"); private static final NodeId TEST_CLIENT= NodeId.generate(); protected static final Locale TEST_LOCALE= new Locale("la","CO","va"); protected static final Integer TEST_INT= NumberUtils.INTEGER_ONE; protected static final RuntimeException TEST_EXCEPTION= new IllegalArgumentException(); private static final String TEST_LOCATION= StatelessRemoteCall.class.getName(); protected static Object sSetByRunner; @Before public void setupStatelessRemoteCallTestBase() { ActiveLocale.setProcessLocale(Locale.ROOT); } protected static void single (StatelessRemoteCall call, StatelessRemoteCall empty, StatelessRemoteCall defaults) { assertEquals(TEST_VERSION_FILTER,call.getVersionIdFilter()); assertEquals(TEST_APP_FILTER,call.getAppIdFilter()); assertEquals(TEST_CLIENT_FILTER,call.getClientIdFilter()); assertNull(empty.getVersionIdFilter()); assertNull(empty.getAppIdFilter()); assertNull(empty.getClientIdFilter()); assertEquals(StatelessRemoteCall.DEFAULT_VERSION_FILTER, defaults.getVersionIdFilter()); assertNull(defaults.getAppIdFilter()); assertNull(defaults.getClientIdFilter()); } protected static void fillContext (StatelessClientContext context) { context.setVersionId(TEST_VERSION); context.setAppId(TEST_APP); context.setClientId(TEST_CLIENT); context.setLocale(new LocaleWrapper(TEST_LOCALE)); } protected void checkEvents(StatelessClientContext context, StatelessRemoteCall call, boolean success) { String contextStr=context.toString(); Iterator<LoggingEvent> events=getAppender().getEvents().iterator(); assertEvent (events.next(),Level.DEBUG,call.getClass().getName(), "Remote call is starting; context: "+contextStr, TEST_LOCATION); if (success) { assertEvent (events.next(),Level.DEBUG,call.getClass().getName(), "Remote call ended successfully; context: "+contextStr, TEST_LOCATION); } else { assertEvent (events.next(),Level.DEBUG,call.getClass().getName(), "Remote call ended with failure; context: "+contextStr, TEST_LOCATION); events.next(); } assertFalse(events.hasNext()); getAppender().clear(); } private <T> void singleSuccess (StatelessClientContext context, StatelessRemoteCaller<T> caller, T value) throws Exception { setLevel(caller.getClass().getName(),Level.DEBUG); assertEquals(value,caller.execute(context)); checkEvents(context,caller,true); } private void singleFailure (StatelessClientContext context, StatelessRemoteCaller<?> caller, Class<?> exceptionClass) { setLevel(caller.getClass().getName(),Level.DEBUG); setRunnerData(null); try { caller.execute(context); fail(); } catch (RemoteException ex) { assertNull(sSetByRunner); assertEquals(exceptionClass,ex.getCause().getClass()); } checkEvents(context,caller,false); } protected static void setRunnerData (Object value) { sSetByRunner=value; } private void singleSuccess (StatelessClientContext context, StatelessRemoteRunner runner, Object value) throws Exception { setLevel(runner.getClass().getName(),Level.DEBUG); setRunnerData(null); runner.execute(context); assertEquals(value,sSetByRunner); checkEvents(context,runner,true); } private void singleFailure (StatelessClientContext context, StatelessRemoteRunner runner, Class<?> exceptionClass) { setLevel(runner.getClass().getName(),Level.DEBUG); setRunnerData(null); try { runner.execute(context); fail(); } catch (RemoteException ex) { assertNull(sSetByRunner); assertEquals(exceptionClass,ex.getCause().getClass()); } checkEvents(context,runner,false); } protected void calls (StatelessClientContext context, StatelessRemoteCaller<Integer> intCall, StatelessRemoteCaller<Locale> localeCall, StatelessRemoteCaller<?> throwCall, StatelessRemoteCaller<?> throwVersionIdCall, StatelessRemoteCaller<?> throwAppIdCall, StatelessRemoteCaller<?> throwClientIdCall) throws Exception { fillContext(context); singleSuccess(context,intCall,TEST_INT); singleSuccess(context,localeCall,TEST_LOCALE); singleFailure(context,throwCall,TEST_EXCEPTION.getClass()); singleFailure(context,throwVersionIdCall,I18NException.class); singleFailure(context,throwAppIdCall,I18NException.class); singleFailure(context,throwClientIdCall,I18NException.class); context.setVersionId(TEST_VERSION_D); try { intCall.execute(context); fail(); } catch (RemoteException ex) { assertEquals (new I18NBoundMessage2P (Messages.VERSION_MISMATCH,VersionId.SELF,TEST_VERSION_D), ((I18NException)(ex.getCause())).getI18NBoundMessage()); } } protected void calls (StatelessClientContext context, StatelessRemoteRunner intRun, StatelessRemoteRunner localeRun, StatelessRemoteRunner throwRun, StatelessRemoteRunner throwVersionIdRun, StatelessRemoteRunner throwAppIdRun, StatelessRemoteRunner throwClientIdRun) throws Exception { fillContext(context); singleSuccess(context,intRun,TEST_INT); singleSuccess(context,localeRun,TEST_LOCALE); singleFailure(context,throwRun,TEST_EXCEPTION.getClass()); singleFailure(context,throwVersionIdRun,I18NException.class); singleFailure(context,throwAppIdRun,I18NException.class); singleFailure(context,throwClientIdRun,I18NException.class); context.setVersionId(TEST_VERSION_D); try { intRun.execute(context); fail(); } catch (RemoteException ex) { assertEquals (new I18NBoundMessage2P (Messages.VERSION_MISMATCH,VersionId.SELF,TEST_VERSION_D), ((I18NException)(ex.getCause())).getI18NBoundMessage()); } } }