/* * #%L * Wisdom-Framework * %% * Copyright (C) 2013 - 2014 Wisdom Framework * %% * 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. * #L% */ package org.wisdom.maven.pipeline; import org.apache.commons.io.FileUtils; import org.apache.maven.plugin.Mojo; import org.apache.maven.plugin.logging.Log; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.wisdom.maven.Watcher; import org.wisdom.maven.WatchingException; import org.wisdom.maven.utils.WatcherUtils; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * Check pipeline behavior. */ public class PipelineTest { public static final File FAKE = new File("target/fake-source"); public static final File SOURCES = new File(FAKE, "src/main"); Pipeline pipeline; private SpyWatcher textWatcher; private SpyWatcher mdWatcher; private Mojo mojo; @Before public void setUp() throws IOException { FileUtils.forceMkdir(SOURCES); textWatcher = new SpyWatcher(SOURCES, "txt"); mdWatcher = new SpyWatcher(SOURCES, "md"); mojo = mock(Mojo.class); Log log = mock(Log.class); when(mojo.getLog()).thenReturn(log); pipeline = new Pipeline(mojo, FAKE, Arrays.asList(textWatcher, mdWatcher), false); pipeline.watch(); } @After public void tearDown() { pipeline.shutdown(); FileUtils.deleteQuietly(FAKE); } @Test public void testAdditionUpdateAndDeleteOfFile() throws IOException { File txt = new File(SOURCES, "touch.txt"); txt.createNewFile(); assertThat(txt.isFile()).isTrue(); waitPullPeriod(); assertThat(textWatcher.added).containsExactly("touch.txt"); assertThat(mdWatcher.added).isEmpty(); FileUtils.touch(txt); waitPullPeriod(); assertThat(textWatcher.added).containsExactly("touch.txt"); assertThat(textWatcher.updated).containsExactly("touch.txt"); FileUtils.deleteQuietly(txt); waitPullPeriod(); assertThat(textWatcher.added).containsExactly("touch.txt"); assertThat(textWatcher.updated).containsExactly("touch.txt"); assertThat(textWatcher.deleted).containsExactly("touch.txt"); } @Test public void testAdditionUpdateAndDeleteOfSubFiles() throws IOException { File dir = new File(SOURCES, "foo"); dir.mkdirs(); File md = new File(SOURCES, "foo/touch.md"); md.createNewFile(); assertThat(md.isFile()).isTrue(); waitPullPeriod(); assertThat(mdWatcher.added).containsExactly("touch.md"); FileUtils.touch(md); waitPullPeriod(); assertThat(mdWatcher.added).containsExactly("touch.md"); assertThat(mdWatcher.updated).containsExactly("touch.md"); FileUtils.deleteQuietly(md); waitPullPeriod(); assertThat(mdWatcher.added).containsExactly("touch.md"); assertThat(mdWatcher.updated).containsExactly("touch.md"); assertThat(mdWatcher.deleted).containsExactly("touch.md"); } @Test public void testWatchingException() throws IOException { pipeline.shutdown(); BadWatcher bad = new BadWatcher(SOURCES, "md"); pipeline = new Pipeline(mojo, FAKE, Collections.singletonList(bad), true); pipeline.watch(); File dir = new File(SOURCES, "foo"); dir.mkdirs(); File md = new File(SOURCES, "foo/touch.md"); md.createNewFile(); assertThat(md.isFile()).isTrue(); waitPullPeriod(); // Check that the error file was created. File error = new File(FAKE, "target/pipeline/" + bad + ".json"); assertThat(error).exists(); assertThat(FileUtils.readFileToString(error)).contains("10").contains("11").contains("touch.md").contains ("bad"); } private void waitPullPeriod() { try { Thread.sleep(2500); } catch (InterruptedException e) { e.printStackTrace(); } } private class SpyWatcher implements Watcher { private final String extension; private final File root; List<String> added = new ArrayList<>(); List<String> updated = new ArrayList<>(); List<String> deleted = new ArrayList<>(); public SpyWatcher(File root, String extension) { this.extension = extension; this.root = root; } @Override public boolean accept(File file) { return WatcherUtils.isInDirectory(file, root) && file.getName().endsWith("." + extension); } @Override public boolean fileCreated(File file) throws WatchingException { added.add(file.getName()); return true; } @Override public boolean fileUpdated(File file) throws WatchingException { updated.add(file.getName()); return true; } @Override public boolean fileDeleted(File file) throws WatchingException { deleted.add(file.getName()); return true; } } private class BadWatcher extends SpyWatcher { public BadWatcher(File root, String extension) { super(root, extension); } @Override public boolean fileCreated(File file) throws WatchingException { throw new WatchingException("BAD_TITLE", "Bad bad bad", file, 10, 11, null); } @Override public boolean fileUpdated(File file) throws WatchingException { throw new WatchingException("BAD_TITLE", "Bad bad bad", file, 10, 11, null); } } }