Package com.google.code.tempusfugit.concurrency

Source Code of com.google.code.tempusfugit.concurrency.ConcurrentTestRunner

/*
* Copyright (c) 2009-2014, toby weston & tempus-fugit committers
*
* Licensed 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 com.google.code.tempusfugit.concurrency;

import static java.util.concurrent.Executors.newCachedThreadPool;
import static java.util.concurrent.Executors.newFixedThreadPool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicLong;

import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.InitializationError;

import com.google.code.tempusfugit.concurrency.annotations.Concurrent;

public class ConcurrentTestRunner extends BlockJUnit4ClassRunner {

    public ConcurrentTestRunner(Class<?> type) throws InitializationError {
        super(type);
        setScheduler(new ConcurrentScheduler(createExecutor(type)));
    }

    private static ExecutorService createExecutor(Class<?> type) {
        Concurrent concurrent = findConcurrentClass(type);
        if (concurrent != null)
            return newFixedThreadPool(concurrent.count(), new ConcurrentTestRunnerThreadFactory());
        return newCachedThreadPool(new ConcurrentTestRunnerThreadFactory());
    }

    private static Concurrent findConcurrentClass(Class<?> type) {
        Concurrent concurrent = null;
        while (concurrent == null && type.getSuperclass() != null) {
            concurrent = type.getAnnotation(Concurrent.class);
            type = type.getSuperclass();
        }
        return concurrent;
    }

    private static class ConcurrentTestRunnerThreadFactory implements ThreadFactory {
        private AtomicLong count = new AtomicLong();

        public Thread newThread(Runnable runnable) {
            return new Thread(runnable, ConcurrentTestRunner.class.getSimpleName() + "-Thread-" + count.getAndIncrement());
        }
    }
}
TOP

Related Classes of com.google.code.tempusfugit.concurrency.ConcurrentTestRunner

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.