alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

ActiveMQ example source code file (AutoFailTestSupport.java)

This example ActiveMQ source code file (AutoFailTestSupport.java) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Java - ActiveMQ tags/keywords

atomicboolean, atomicboolean, autofailthread, exception, exit_success, logger, stacktraceelement, starting, starting, stopping, stopping, testcase, thread, thread, util

The ActiveMQ AutoFailTestSupport.java source code

/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.activemq;

import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.atomic.AtomicBoolean;

import junit.framework.TestCase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Enforces a test case to run for only an allotted time to prevent them from
 * hanging and breaking the whole testing.
 * 
 * 
 */

public abstract class AutoFailTestSupport extends TestCase {
    public static final int EXIT_SUCCESS = 0;
    public static final int EXIT_ERROR = 1;
    private static final Logger LOG = LoggerFactory.getLogger(AutoFailTestSupport.class);

    private long maxTestTime = 5 * 60 * 1000; // 5 mins by default
    private Thread autoFailThread;

    private boolean verbose = true;
    private boolean useAutoFail; // Disable auto fail by default
    private AtomicBoolean isTestSuccess;

    protected void setUp() throws Exception {
        // Runs the auto fail thread before performing any setup
        if (isAutoFail()) {
            startAutoFailThread();
        }
        super.setUp();
    }

    protected void tearDown() throws Exception {
        super.tearDown();

        // Stops the auto fail thread only after performing any clean up
        stopAutoFailThread();
    }

    /**
     * Manually start the auto fail thread. To start it automatically, just set
     * the auto fail to true before calling any setup methods. As a rule, this
     * method is used only when you are not sure, if the setUp and tearDown
     * method is propagated correctly.
     */
    public void startAutoFailThread() {
        setAutoFail(true);
        isTestSuccess = new AtomicBoolean(false);
        autoFailThread = new Thread(new Runnable() {
            public void run() {
                try {
                    // Wait for test to finish succesfully
                    Thread.sleep(getMaxTestTime());
                } catch (InterruptedException e) {
                    // This usually means the test was successful
                } finally {
                    // Check if the test was able to tear down succesfully,
                    // which usually means, it has finished its run.
                    if (!isTestSuccess.get()) {
                        LOG.error("Test case has exceeded the maximum allotted time to run of: " + getMaxTestTime() + " ms.");
                        dumpAllThreads(getName());
                        System.exit(EXIT_ERROR);
                    }
                }
            }
        }, "AutoFailThread");

        if (verbose) {
            LOG.info("Starting auto fail thread...");
        }

        LOG.info("Starting auto fail thread...");
        autoFailThread.start();
    }

    /**
     * Manually stops the auto fail thread. As a rule, this method is used only
     * when you are not sure, if the setUp and tearDown method is propagated
     * correctly.
     */
    public void stopAutoFailThread() {
        if (isAutoFail() && autoFailThread != null && autoFailThread.isAlive()) {
            isTestSuccess.set(true);

            if (verbose) {
                LOG.info("Stopping auto fail thread...");
            }

            LOG.info("Stopping auto fail thread...");
            autoFailThread.interrupt();
        }
    }

    /**
     * Sets the auto fail value. As a rule, this should be used only before any
     * setup methods is called to automatically enable the auto fail thread in
     * the setup method of the test case.
     * 
     * @param val
     */
    public void setAutoFail(boolean val) {
        this.useAutoFail = val;
    }

    public boolean isAutoFail() {
        return this.useAutoFail;
    }

    /**
     * The assigned value will only be reflected when the auto fail thread has
     * started its run. Value is in milliseconds.
     * 
     * @param val
     */
    public void setMaxTestTime(long val) {
        this.maxTestTime = val;
    }

    public long getMaxTestTime() {
        return this.maxTestTime;
    }
    
    
    public static void dumpAllThreads(String prefix) {
        Map<Thread, StackTraceElement[]> stacks = Thread.getAllStackTraces();
        for (Entry<Thread, StackTraceElement[]> stackEntry : stacks.entrySet()) {
            System.err.println(prefix + " " + stackEntry.getKey());
            for(StackTraceElement element : stackEntry.getValue()) {
                System.err.println("     " + element);
            }
        }
    }
}

Other ActiveMQ examples (source code examples)

Here is a short list of links related to this ActiveMQ AutoFailTestSupport.java source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.