/*
 * 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.sling.commons.threads.impl;

import org.apache.sling.commons.threads.ThreadPoolConfig;
import org.junit.Test;

import java.util.concurrent.Executors;

import static org.apache.sling.commons.threads.ThreadPoolConfig.ThreadPriority.MAX;
import static org.apache.sling.commons.threads.ThreadPoolConfig.ThreadPriority.MIN;
import static org.apache.sling.commons.threads.ThreadPoolConfig.ThreadPriority.NORM;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class ExtendedThreadFactoryTest {

    @Test
    public void informativeThreadNames() {
        final ExtendedThreadFactory tf = factory("Test Pool");
        assertEquals("Thread name", "Sling - Test Pool #1", tf.newThread(null).getName());
        assertEquals("Thread name", "Sling - Test Pool #2", tf.newThread(null).getName());
    }

    @Test
    public void shouldStripSlingPrefixFromThreadNames() {
        final Thread thread = thread("Sling Test Pool");
        assertEquals("Thread name", "Sling - Test Pool #1", thread.getName());
    }

    @Test
    public void shouldStripApacheSlingPrefixFromThreadNames() {
        final Thread thread = thread("Apache Sling Test Pool");
        assertEquals("Thread name", "Sling - Test Pool #1", thread.getName());
    }

    @Test
    public void shouldSetCorrectPriority() {
        assertEquals("Thread min priority", Thread.MIN_PRIORITY, thread("Pool", MIN, false).getPriority());
        assertEquals("Thread normnal priority", Thread.NORM_PRIORITY, thread("Pool", NORM, false).getPriority());
        assertEquals("Thread max priority", Thread.MAX_PRIORITY, thread("Pool", MAX, false).getPriority());
    }

    @Test
    public void shouldSetDaemonStatusCorrectly() {
        assertFalse("Non-daemon thread", thread("Pool", NORM, false).isDaemon());
        assertTrue("Daemon thread", thread("Pool", NORM, true).isDaemon());
    }

    private Thread thread(final String poolName) {
        return factory(poolName).newThread(null);
    }

    private Thread thread(final String poolName,
                          final ThreadPoolConfig.ThreadPriority priority,
                          final boolean isDaemon) {
        return factory(poolName, priority, isDaemon).newThread(null);
    }

    private ExtendedThreadFactory factory(final String poolName) {
        return factory(poolName, NORM, false);
    }

    private ExtendedThreadFactory factory(final String poolName,
                                          final ThreadPoolConfig.ThreadPriority priority,
                                          final boolean isDaemon) {
        return new ExtendedThreadFactory(Executors.defaultThreadFactory(), poolName, priority, isDaemon);
    }
}
