/*
* JBoss, Home of Professional Open Source.
* Copyright 2007, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.test.cluster.invokerha;
import java.rmi.ServerException;
import org.jboss.ha.framework.interfaces.GenericClusteringException;
import org.jboss.invocation.ServiceUnavailableException;
import org.jboss.logging.Logger;
import junit.framework.TestCase;
/**
* InvokerHaFailureType.
*
* @author <a href="mailto:galder.zamarreno@jboss.com">Galder Zamarreno</a>
*/
public enum InvokerHaFailureType
{
BEFORE_SERVER,
AFTER_SERVER_NOT_COMPLETED_BUT_SUCCESS_AFTER,
AFTER_SERVER_NOT_COMPLETED_BOTH_SERVERS,
AFTER_SERVER_COMPLETED;
private static final Logger log = Logger.getLogger(InvokerHaFailureType.class);
public boolean isRecoverable(boolean injectFailureIn1stCall)
{
switch(this)
{
case BEFORE_SERVER:
/* a failure before even getting to the invocation call itself is
* never recoverable */
return false;
case AFTER_SERVER_NOT_COMPLETED_BUT_SUCCESS_AFTER:
/* it is not recoverable because UserTransaction.begin() already
* reached a server.*/
return false;
case AFTER_SERVER_NOT_COMPLETED_BOTH_SERVERS:
/* if failure happens after reaching the server but didn't complete when
* trying to call either server, neither in the 1st or Nth call is
* recoverable.*/
return false;
case AFTER_SERVER_COMPLETED:
/* if failure happens after reaching the server and completed, neither
* 1st or Nth call are recoverable. */
return false;
default:
return false;
}
}
public void injectFailureIfExistsBeforeServer() throws IllegalStateException
{
switch(this)
{
case BEFORE_SERVER:
log.debug("failing because of " + this);
throw new IllegalStateException("see how you handle this!!");
default:
break;
}
}
public void injectFailureIfExistsAfterServer(Integer failoverCounter) throws GenericClusteringException
{
switch(this)
{
case AFTER_SERVER_NOT_COMPLETED_BUT_SUCCESS_AFTER:
if (failoverCounter.equals(new Integer(0)))
{
log.debug("failing because of " + this);
throw new GenericClusteringException(GenericClusteringException.COMPLETED_NO, this.toString());
}
break;
case AFTER_SERVER_NOT_COMPLETED_BOTH_SERVERS:
log.debug("failing because of " + this);
throw new GenericClusteringException(GenericClusteringException.COMPLETED_NO, this.toString());
case AFTER_SERVER_COMPLETED:
log.debug("failing because of " + this);
throw new GenericClusteringException(GenericClusteringException.COMPLETED_YES, this.toString());
default:
break;
}
}
public void assertFailoverCounter(boolean injectFailureIn1stCall, Object failoverCounter)
{
switch(this)
{
case BEFORE_SERVER:
TestCase.assertNull(failoverCounter);
break;
case AFTER_SERVER_NOT_COMPLETED_BUT_SUCCESS_AFTER:
TestCase.assertEquals(Integer.valueOf(1), failoverCounter);
break;
case AFTER_SERVER_NOT_COMPLETED_BOTH_SERVERS:
/* Only one attempted failover because it won't be available to
* failover due to UserTransaction.begin() having already hit the
* server and hence, txFailoverAuthorization maps contains that tpc. */
TestCase.assertEquals(1, failoverCounter);
break;
case AFTER_SERVER_COMPLETED:
/* failover counters are always 0 because there's no chance of
* calculating failover at all */
TestCase.assertEquals(Integer.valueOf(0), failoverCounter);
break;
default:
break;
}
}
public void assertException(Throwable t)
{
switch(this)
{
case BEFORE_SERVER:
TestCase.assertTrue(t instanceof IllegalStateException);
break;
case AFTER_SERVER_NOT_COMPLETED_BUT_SUCCESS_AFTER:
case AFTER_SERVER_NOT_COMPLETED_BOTH_SERVERS:
TestCase.assertTrue(t instanceof ServiceUnavailableException);
TestCase.assertTrue(t.getCause() instanceof GenericClusteringException);
break;
case AFTER_SERVER_COMPLETED:
TestCase.assertTrue(t instanceof ServerException);
TestCase.assertTrue(t.getCause() instanceof GenericClusteringException);
break;
}
}
}