001/**
002 * Copyright 2005-2014 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.rice.ksb.messaging.exceptionhandling;
017
018import static org.junit.Assert.assertEquals;
019import static org.junit.Assert.assertFalse;
020import static org.junit.Assert.assertNull;
021import static org.junit.Assert.assertTrue;
022
023import org.junit.Test;
024import org.kuali.rice.core.api.config.property.ConfigContext;
025import org.kuali.rice.ksb.api.bus.support.JavaServiceConfiguration;
026import org.kuali.rice.ksb.api.messaging.AsynchronousCall;
027import org.kuali.rice.ksb.messaging.PersistedMessageBO;
028import org.kuali.rice.ksb.messaging.PersistedMessagePayload;
029import org.kuali.rice.ksb.test.KSBTestCase;
030import org.kuali.rice.ksb.util.KSBConstants;
031
032
033public class DefaultMessageExceptionHandlerTest extends KSBTestCase {
034    
035    private PersistedMessageBO setupMessage(Integer retriesAttempted, Integer serviceMaxRetries) throws Exception {
036        PersistedMessageBO message = new PersistedMessageBO();
037        message.setRetryCount(retriesAttempted);
038        //ServiceInfo serviceInfo = new ServiceInfo();
039        //serviceInfo.setServiceDefinition(new JavaServiceDefinition());
040        //serviceInfo.getServiceDefinition().setRetryAttempts(serviceMaxRetries);
041        JavaServiceConfiguration.Builder builder = JavaServiceConfiguration.Builder.create();
042        builder.setRetryAttempts(serviceMaxRetries);
043        AsynchronousCall methodCall = new AsynchronousCall(new Class[0], new Object[0], builder.build(), "", null, null);
044        message.setPayload(new PersistedMessagePayload(methodCall, message));
045        message.setMethodCall(methodCall);
046        return message;
047    }
048    
049    private void setMaxRetries(String maxRetries) {
050        ConfigContext.getCurrentContextConfig().putProperty(KSBConstants.Config.ROUTE_QUEUE_MAX_RETRY_ATTEMPTS_OVERRIDE_KEY, maxRetries);
051    }
052    
053    @Test public void testGetGlobalMaxRetryAttempts() throws Exception {
054        DefaultMessageExceptionHandler exceptionHandler = new DefaultMessageExceptionHandler();
055        
056        this.setMaxRetries("0");
057        
058        
059        //  test non-numeric
060        this.setMaxRetries("B");
061        assertNull("Method should return null if app constant is non-numeric.", exceptionHandler.getGlobalMaxRetryAttempts());
062        
063        //  test large negative number
064        this.setMaxRetries("-10");
065        assertNull("Method should return null if app constant is negative number.", exceptionHandler.getGlobalMaxRetryAttempts());
066        
067        //  test -1
068        this.setMaxRetries("-1");
069        assertNull("Method should return null if app constant is negative number.", exceptionHandler.getGlobalMaxRetryAttempts());
070        
071        //  test 0
072        this.setMaxRetries("0");
073        assertEquals("Method should return app constant value if app constant is numeric and greater than or equal to zero.", new Integer(0), exceptionHandler.getGlobalMaxRetryAttempts());
074        
075        //  test 1
076        this.setMaxRetries("1");
077        assertEquals("Method should return app constant value if app constant is numeric and greater than or equal to zero.", new Integer(1), exceptionHandler.getGlobalMaxRetryAttempts());
078        
079        //  test 5
080        this.setMaxRetries("5");
081        assertEquals("Method should return app constant value if app constant is numeric and greater than or equal to zero.", new Integer(5), exceptionHandler.getGlobalMaxRetryAttempts());
082    }
083    
084    @Test public void testIsInException() throws Exception {
085        DefaultMessageExceptionHandler exceptionHandler = new DefaultMessageExceptionHandler();
086        PersistedMessageBO message = null;
087        
088        this.setMaxRetries("-10");
089
090        message = setupMessage(0, 1);
091        assertFalse(exceptionHandler.isInException(message));
092        
093        message.setRetryCount(1);
094        assertTrue(exceptionHandler.isInException(message));
095        
096        message.setRetryCount(2);
097        assertTrue(exceptionHandler.isInException(message));
098        
099        this.setMaxRetries("5");
100        
101        message.setRetryCount(4);
102        assertFalse(exceptionHandler.isInException(message));
103        
104        message.setRetryCount(5);
105        assertTrue(exceptionHandler.isInException(message));
106        
107        message.setRetryCount(6);
108        assertTrue(exceptionHandler.isInException(message));
109        
110        this.setMaxRetries("0");
111        
112        message.setRetryCount(0);
113        assertTrue(exceptionHandler.isInException(message));
114        
115        message.setRetryCount(1);
116        assertTrue(exceptionHandler.isInException(message));
117        
118        this.setMaxRetries("-1");
119        
120        message.setRetryCount(0);
121        assertFalse(exceptionHandler.isInException(message));
122        
123        message = setupMessage(1, 5);
124        assertFalse(exceptionHandler.isInException(message));
125        
126        this.setMaxRetries("B");
127        
128        message.setRetryCount(0);
129        assertFalse(exceptionHandler.isInException(message));
130    }
131
132}