001package org.nuxeo.runtime.test.runner;
002
003import java.io.File;
004import java.io.IOException;
005import java.nio.file.Path;
006import java.util.HashSet;
007import java.util.Set;
008
009import org.hamcrest.CoreMatchers;
010import org.junit.Assert;
011import org.junit.runners.model.FrameworkMethod;
012import org.nuxeo.common.Environment;
013import org.nuxeo.runtime.trackers.concurrent.ThreadEvent;
014import org.nuxeo.runtime.trackers.files.FileEvent;
015import org.nuxeo.runtime.trackers.files.FileEventHandler;
016import org.nuxeo.runtime.trackers.files.FileEventListener;
017
018@Features(RuntimeFeature.class)
019public class FileEventsTrackingFeature extends SimpleFeature {
020
021    protected class Tracker implements FileEventHandler {
022
023        @Override
024        public void onFile(File file, Object marker) {
025            tracked.add(file);
026        }
027
028    }
029
030    protected final Set<File> tracked = new HashSet<>();
031
032    protected Tracker tracker = new Tracker();
033
034    protected FileEventListener listener = new FileEventListener(tracker);
035
036    protected Path tempPath;
037
038    protected Set<File> created = new HashSet<File>();
039
040    @Override
041    public void beforeMethodRun(FeaturesRunner runner, FrameworkMethod method, Object test) throws Exception {
042        File temp = Environment.getDefault().getTemp();
043        temp.mkdirs();
044        tempPath = temp.toPath();
045        tracked.clear();
046        created.clear();
047        listener.install();
048    }
049
050    @Override
051    public void afterMethodRun(FeaturesRunner runner, FrameworkMethod method, Object test) throws Exception {
052        listener.uninstall();
053        try {
054            Assert.assertThat(tracked, CoreMatchers.is(created)); // replace
055                                                                  // with
056                                                                  // contains
057            for (File each : created) {
058                Assert.assertThat(each.exists(), CoreMatchers.is(false));
059            }
060        } finally {
061            tracked.clear();
062            created.clear();
063        }
064    }
065
066    public ThreadEvent onThreadEnter(boolean isLongRunning) {
067        return ThreadEvent.onEnter(this, isLongRunning);
068    }
069
070    public FileEvent onFile(File aFile, Object aMarker) {
071        return FileEvent.onFile(this, resolveAndCreate(aFile), aMarker);
072    }
073
074    public File resolveAndCreate(File aFile) {
075        File temp = Environment.getDefault().getTemp();
076        File actual = temp.toPath().resolve(aFile.toPath()).toFile();
077        try {
078            actual.createNewFile();
079        } catch (IOException e) {
080            throw new RuntimeException("Cannot create temp file " + actual);
081        }
082        created.add(actual);
083        return actual;
084    }
085}