package restx.classloader; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; import org.assertj.core.util.Files; import org.junit.Before; import org.junit.Test; import java.io.File; import java.io.IOException; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; /** * User: xavierhanin * Date: 7/26/13 * Time: 4:59 PM */ public class CompilationManagerTest { FileSystem fileSystem = FileSystems.getDefault(); Path testSourceRoot = fileSystem.getPath("src/test/test-classes-sources"); Path sourceRoot = fileSystem.getPath("target/tmp/src"); List<Path> sourceRoots = asList(sourceRoot); Path destination = fileSystem.getPath("target/tmp/classes"); EventBus eventBus = new EventBus(); List<Object> events = new ArrayList<>(); @Before public void setup() { Files.delete(destination.toFile()); Files.delete(sourceRoot.toFile()); eventBus.register(new Object() { @Subscribe public void onCompilationFinished(CompilationFinishedEvent event) { events.add(event); } @Subscribe public void onClasspathResource(ClasspathResourceEvent event) { events.add(event); } }); } @Test public void should_copy_resources() throws Exception { CompilationManager compilationManager = new CompilationManager(eventBus, sourceRoots, destination); File resource = destination.resolve("restx/classloader/test_resource.txt").toFile(); assertThat(resource).doesNotExist(); prepareSource("restx/classloader/test_resource.txt"); compilationManager.rebuild(); assertThat(resource).exists(); assertThat(events).hasSize(1); assertThat(events.get(0)).isInstanceOf(ClasspathResourceEvent.class); } @Test public void should_filter_resources() throws Exception { CompilationManager compilationManager = new CompilationManager(eventBus, sourceRoots, destination); File resource = destination.resolve("restx/classloader/test_resource.txt___jb_old___").toFile(); assertThat(resource).doesNotExist(); prepareSource("restx/classloader/test_resource.txt___jb_old___"); compilationManager.rebuild(); assertThat(resource).doesNotExist(); assertThat(events).isEmpty(); } @Test public void should_rebuild_build() throws Exception { CompilationManager compilationManager = new CompilationManager(eventBus, sourceRoots, destination); assertThat(compilationManager.getClassFile("restx.classloader.TestSimpleClass").isPresent()).isFalse(); prepareSource("restx/classloader/TestSimpleClass.java"); compilationManager.rebuild(); assertThat(compilationManager.getClassFile("restx.classloader.TestSimpleClass").isPresent()).isTrue(); assertThat(events).hasSize(1); // rebuild should trigger a new compilation compilationManager.rebuild(); assertThat(events).hasSize(2); } @Test public void should_incremental_build() throws Exception { CompilationManager compilationManager = new CompilationManager(eventBus, sourceRoots, destination); assertThat(compilationManager.getClassFile("restx.classloader.TestSimpleClass").isPresent()).isFalse(); prepareSource("restx/classloader/TestSimpleClass.java"); compilationManager.incrementalCompile(); assertThat(compilationManager.getClassFile("restx.classloader.TestSimpleClass").isPresent()).isTrue(); assertThat(events).hasSize(1); // incremental compile should do nothing compilationManager.incrementalCompile(); assertThat(compilationManager.getClassFile("restx.classloader.TestSimpleClass").isPresent()).isTrue(); assertThat(events).hasSize(1); } private void prepareSource(String path) throws IOException { File to = sourceRoot.resolve(path).toFile(); to.getParentFile().mkdirs(); com.google.common.io.Files.copy( testSourceRoot.resolve(path).toFile(), to); } }