package org.junit.tests.experimental.parallel;

import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNot.not;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.ParallelComputer;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;

public class ParallelMethodTest {
    private static final long TIMEOUT = 15;
    private static volatile Thread fOne = null;
    private static volatile Thread fTwo = null;

    public static class Example {
        private static volatile CountDownLatch fSynchronizer;

        @BeforeClass
        public static void init() {
            fSynchronizer = new CountDownLatch(2);
        }

        @Test
        public void one() throws InterruptedException {
            fSynchronizer.countDown();
            assertTrue(fSynchronizer.await(TIMEOUT, TimeUnit.SECONDS));
            fOne = Thread.currentThread();
        }

        @Test
        public void two() throws InterruptedException {
            fSynchronizer.countDown();
            assertTrue(fSynchronizer.await(TIMEOUT, TimeUnit.SECONDS));
            fTwo = Thread.currentThread();
        }
    }

    @Before
    public void init() {
        fOne = null;
        fTwo = null;
    }

    @Test
    public void testsRunInParallel() {
        Result result = JUnitCore.runClasses(ParallelComputer.methods(), Example.class);
        assertTrue(result.wasSuccessful());
        assertNotNull(fOne);
        assertNotNull(fTwo);
        assertThat(fOne, is(not(fTwo)));
    }
}
