package org.marketcetera.util.ws.stateful;
import java.util.Locale;
import org.apache.log4j.Level;
import org.marketcetera.util.except.I18NException;
import org.marketcetera.util.log.I18NBoundMessage1P;
import org.marketcetera.util.log.I18NBoundMessage2P;
import org.marketcetera.util.ws.stateless.StatelessClientContext;
import org.marketcetera.util.ws.stateless.StatelessRemoteCall;
import org.marketcetera.util.ws.stateless.StatelessRemoteCallTestBase;
import org.marketcetera.util.ws.tags.EqualsTagFilter;
import org.marketcetera.util.ws.tags.SessionId;
import org.marketcetera.util.ws.tags.ValidSessionTagFilter;
import org.marketcetera.util.ws.tags.VersionId;
import org.marketcetera.util.ws.wrappers.RemoteException;
import static org.junit.Assert.*;
/**
* @author tlerios@marketcetera.com
* @since 1.0.0
* @version $Id: RemoteCallTestBase.java 16154 2012-07-14 16:34:05Z colin $
*/
/* $License$ */
public class RemoteCallTestBase
extends StatelessRemoteCallTestBase
{
protected static final EqualsTagFilter TEST_SESSION_FILTER=
new EqualsTagFilter(null,TestMessages.MESSAGE);
protected static final SessionManager<Object> TEST_MANAGER=
new SessionManager<Object>();
private static final SessionId TEST_SESSION=
SessionId.generate();
private static final SessionId TEST_SESSION_D=
SessionId.generate();
private static final String TEST_USER=
"metc";
private static final StatelessClientContext TEST_CONTEXT=
new StatelessClientContext();
protected static final SessionHolder<Object> TEST_HOLDER=
new SessionHolder<Object>(TEST_USER,TEST_CONTEXT);
static
{
TEST_MANAGER.put(TEST_SESSION,TEST_HOLDER);
}
protected static void single
(RemoteCall<?> call,
RemoteCall<?> empty,
RemoteCall<?> defaults)
{
single((StatelessRemoteCall)call,
(StatelessRemoteCall)empty,
(StatelessRemoteCall)defaults);
assertEquals(TEST_SESSION_FILTER,call.getSessionIdFilter());
assertEquals(TEST_MANAGER,call.getSessionManager());
assertNull(empty.getSessionIdFilter());
assertNull(empty.getSessionManager());
assertEquals(TEST_MANAGER,
(((ValidSessionTagFilter<?>)
(defaults.getSessionIdFilter())).getSessionManager()));
assertEquals(TEST_MANAGER,defaults.getSessionManager());
}
private static void fillContext
(ClientContext context)
{
fillContext((StatelessClientContext)context);
context.setSessionId(TEST_SESSION);
}
private <T> void singleSuccess
(ClientContext context,
RemoteCaller<?,T> caller,
T value)
throws Exception
{
setLevel(caller.getClass().getName(),Level.DEBUG);
assertEquals(value,caller.execute(context));
checkEvents(context,caller,true);
}
private void singleFailure
(ClientContext context,
RemoteCaller<?,?> 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
(ClientContext context,
RemoteRunner<?> 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
(ClientContext context,
RemoteRunner<?> 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
(ClientContext context,
RemoteCaller<?,Integer> intCall,
RemoteCaller<?,Locale> localeCall,
RemoteCaller<?,?> throwCall,
RemoteCaller<?,?> throwVersionIdCall,
RemoteCaller<?,?> throwAppIdCall,
RemoteCaller<?,?> throwClientIdCall,
RemoteCaller<?,?> throwSessionIdCall)
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);
singleFailure(context,throwSessionIdCall,I18NException.class);
context.setVersionId(TEST_VERSION_D);
try {
intCall.execute(context);
fail();
} catch (RemoteException ex) {
assertEquals
(new I18NBoundMessage2P
(org.marketcetera.util.ws.stateless.Messages.VERSION_MISMATCH,
VersionId.SELF,TEST_VERSION_D),
((I18NException)(ex.getCause())).getI18NBoundMessage());
}
fillContext(context);
context.setSessionId(TEST_SESSION_D);
try {
intCall.execute(context);
fail();
} catch (RemoteException ex) {
assertEquals
(new I18NBoundMessage1P
(org.marketcetera.util.ws.tags.Messages.SESSION_EXPIRED,
TEST_SESSION_D),
((I18NException)(ex.getCause())).getI18NBoundMessage());
}
// Null sessions can go through.
context.setSessionId(null);
setRunnerData(null);
throwSessionIdCall.execute(context);
assertEquals(TEST_INT,sSetByRunner);
}
protected void calls
(ClientContext context,
RemoteRunner<?> intRun,
RemoteRunner<?> localeRun,
RemoteRunner<?> throwRun,
RemoteRunner<?> throwVersionIdRun,
RemoteRunner<?> throwAppIdRun,
RemoteRunner<?> throwClientIdRun,
RemoteRunner<?> throwSessionIdRun)
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);
singleFailure(context,throwSessionIdRun,I18NException.class);
context.setVersionId(TEST_VERSION_D);
try {
intRun.execute(context);
fail();
} catch (RemoteException ex) {
assertEquals
(new I18NBoundMessage2P
(org.marketcetera.util.ws.stateless.Messages.VERSION_MISMATCH,
VersionId.SELF,TEST_VERSION_D),
((I18NException)(ex.getCause())).getI18NBoundMessage());
}
fillContext(context);
context.setSessionId(TEST_SESSION_D);
try {
intRun.execute(context);
fail();
} catch (RemoteException ex) {
assertEquals
(new I18NBoundMessage1P
(org.marketcetera.util.ws.tags.Messages.SESSION_EXPIRED,
TEST_SESSION_D),
((I18NException)(ex.getCause())).getI18NBoundMessage());
}
// Null sessions can go through.
context.setSessionId(null);
setRunnerData(null);
throwSessionIdRun.execute(context);
assertEquals(TEST_INT,sSetByRunner);
}
}