/* * Copyright 2012-2016 the original author or authors. * * 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 org.springframework.boot.devtools.restart; import java.net.URL; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.Matchers.nullValue; /** * Tests for {@link DefaultRestartInitializer}. * * @author Phillip Webb * @author Andy Wilkinson */ public class DefaultRestartInitializerTests { @Test public void nullForTests() throws Exception { MockRestartInitializer initializer = new MockRestartInitializer(true); assertThat(initializer.getInitialUrls(Thread.currentThread())).isNull(); } @Test public void validMainThread() throws Exception { MockRestartInitializer initializer = new MockRestartInitializer(false); ClassLoader classLoader = new MockAppClassLoader(getClass().getClassLoader()); Thread thread = new Thread(); thread.setName("main"); thread.setContextClassLoader(classLoader); assertThat(initializer.isMain(thread)).isTrue(); assertThat(initializer.getInitialUrls(thread)).isNotEqualTo(nullValue()); } @Test public void threadNotNamedMain() throws Exception { MockRestartInitializer initializer = new MockRestartInitializer(false); ClassLoader classLoader = new MockAppClassLoader(getClass().getClassLoader()); Thread thread = new Thread(); thread.setName("buscuit"); thread.setContextClassLoader(classLoader); assertThat(initializer.isMain(thread)).isFalse(); assertThat(initializer.getInitialUrls(thread)).isNull(); } @Test public void threadNotUsingAppClassLoader() throws Exception { MockRestartInitializer initializer = new MockRestartInitializer(false); ClassLoader classLoader = new MockLauncherClassLoader( getClass().getClassLoader()); Thread thread = new Thread(); thread.setName("main"); thread.setContextClassLoader(classLoader); assertThat(initializer.isMain(thread)).isFalse(); assertThat(initializer.getInitialUrls(thread)).isNull(); } @Test public void skipsDueToJUnitStacks() throws Exception { testSkipStack("org.junit.runners.Something", true); } @Test public void skipsDueToSpringTest() throws Exception { testSkipStack("org.springframework.boot.test.Something", true); } @Test public void skipsDueToCucumber() throws Exception { testSkipStack("cucumber.runtime.Runtime.run", true); } private void testSkipStack(String className, boolean expected) { MockRestartInitializer initializer = new MockRestartInitializer(true); StackTraceElement element = new StackTraceElement(className, "someMethod", "someFile", 123); assertThat(initializer.isSkippedStackElement(element)).isEqualTo(expected); } private static class MockAppClassLoader extends ClassLoader { MockAppClassLoader(ClassLoader parent) { super(parent); } } private static class MockLauncherClassLoader extends ClassLoader { MockLauncherClassLoader(ClassLoader parent) { super(parent); } } private static class MockRestartInitializer extends DefaultRestartInitializer { private final boolean considerStackElements; MockRestartInitializer(boolean considerStackElements) { this.considerStackElements = considerStackElements; } @Override protected boolean isSkippedStackElement(StackTraceElement element) { if (!this.considerStackElements) { return false; } return true; } @Override protected URL[] getUrls(Thread thread) { return new URL[0]; } } }