package org.threadly.util; import static org.junit.Assert.*; import java.util.concurrent.atomic.AtomicBoolean; import org.junit.After; import org.junit.Before; import org.junit.Test; @SuppressWarnings("javadoc") public class AbstractServiceTest { private TestService service; @Before public void setup() { service = new TestService(); } @After public void cleanup() { service = null; } @Test public void startAndIsRunningTest() { assertFalse(service.isRunning()); service.start(); assertTrue(service.isRunning()); } @Test public void hasStoppedTest() { assertFalse(service.hasStopped()); service.start(); assertFalse(service.hasStopped()); service.stop(); assertTrue(service.hasStopped()); } @Test (expected = IllegalStateException.class) public void startFail() { service.start(); service.start(); } @Test public void startIfNotStartedTest() { assertFalse(service.isRunning()); assertTrue(service.startIfNotStarted()); assertTrue(service.isRunning()); assertFalse(service.startIfNotStarted()); assertTrue(service.isRunning()); } @Test public void stopTest() { assertFalse(service.isRunning()); service.start(); assertTrue(service.isRunning()); service.stop(); assertFalse(service.isRunning()); } @Test (expected = IllegalStateException.class) public void stopNotStartedFail() { service.stop(); } @Test (expected = IllegalStateException.class) public void stopTwiceFail() { service.start(); service.stop(); service.stop(); } @Test public void stopIfRunningTest() { assertFalse(service.isRunning()); assertFalse(service.stopIfRunning()); service.start(); assertTrue(service.isRunning()); assertTrue(service.stopIfRunning()); assertFalse(service.isRunning()); assertFalse(service.stopIfRunning()); } private static class TestService extends AbstractService { private final AtomicBoolean startCalled = new AtomicBoolean(false); private final AtomicBoolean stopCalled = new AtomicBoolean(false); @Override protected void startupService() { if (! startCalled.compareAndSet(false, true)) { throw new SuppressedStackRuntimeException(); } } @Override protected void shutdownService() { if (! stopCalled.compareAndSet(false, true)) { throw new SuppressedStackRuntimeException(); } } } }