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}