/* Copyright (c) 2015 OpenPlans - www.openplans.org. All rights reserved. * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.platform.resource; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.File; import java.util.List; import org.geoserver.platform.resource.ResourceNotification.Event; import org.geoserver.platform.resource.ResourceNotification.Kind; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; /** * * @author Niels Charlier * */ public abstract class AbstractResourceNotificationDispatcherTest { @Rule public TemporaryFolder folder = new TemporaryFolder(); protected FileSystemResourceStore store; protected ResourceNotificationDispatcher watcher; protected static class CheckingResourceListener implements ResourceListener { private boolean checked = false; private Kind kind; public CheckingResourceListener(Kind kind) { this.kind = kind; } @Override public void changed(ResourceNotification notify) { if (kind == notify.getKind()) { checked = true; } } public boolean isChecked() { return checked; } } @Before public void setup() throws Exception { File dirA = folder.newFolder("DirA"); File dirB = folder.newFolder("DirB"); File dirC = new File(dirA, "DirC"); dirC.mkdir(); (new File(dirA, "FileA1")).createNewFile(); (new File(dirA, "FileA2")).createNewFile(); (new File(dirB, "FileA2")).createNewFile(); (new File(dirB, "FileB1")).createNewFile(); (new File(dirB, "FileB2")).createNewFile(); (new File(dirC, "FileC1")).createNewFile(); (new File(dirC, "FileC2")).createNewFile(); store = new FileSystemResourceStore(folder.getRoot()); watcher = initWatcher(); } protected abstract ResourceNotificationDispatcher initWatcher() throws Exception; @Test public void testDeleteNotification() { Resource res = store.get("DirA"); final CheckingResourceListener chkDirA = new CheckingResourceListener(Kind.ENTRY_DELETE), chkDirC = new CheckingResourceListener(Kind.ENTRY_DELETE), chkFileA1 = new CheckingResourceListener(Kind.ENTRY_DELETE), chkFileA2 = new CheckingResourceListener(Kind.ENTRY_DELETE), chkFileC1 = new CheckingResourceListener(Kind.ENTRY_DELETE), chkFileC2 = new CheckingResourceListener(Kind.ENTRY_DELETE); watcher.addListener(res.path(), chkDirA); watcher.addListener(res.get("FileA1").path(), chkFileA1); watcher.addListener(res.get("FileA2").path(), chkFileA2); watcher.addListener(res.get("DirC").path(), chkDirC); watcher.addListener(res.get("DirC/FileC1").path(), chkFileC1); watcher.addListener(res.get("DirC/FileC2").path(), chkFileC2); List<Event> events = SimpleResourceNotificationDispatcher.createEvents(res, Kind.ENTRY_DELETE); watcher.changed(new ResourceNotification("DirA", Kind.ENTRY_DELETE, System.currentTimeMillis(), events)); //test that listeners received events assertTrue(chkDirA.isChecked()); assertTrue(chkFileA1.isChecked()); assertTrue(chkFileA2.isChecked()); assertTrue(chkDirC.isChecked()); assertTrue(chkFileC1.isChecked()); assertTrue(chkFileC2.isChecked()); //remove listeners assertTrue(watcher.removeListener(res.path(), chkDirA)); assertTrue(watcher.removeListener(res.get("FileA1").path(), chkFileA1)); assertTrue(watcher.removeListener(res.get("FileA2").path(), chkFileA2)); assertTrue(watcher.removeListener(res.get("DirC").path(), chkDirC)); assertTrue(watcher.removeListener(res.get("DirC/FileC1").path(), chkFileC1)); assertTrue(watcher.removeListener(res.get("DirC/FileC2").path(), chkFileC2)); } @Test public void testModifyNotification() { Resource res = store.get("DirA/DirC/FileC1"); final CheckingResourceListener chkDirA = new CheckingResourceListener(Kind.ENTRY_MODIFY), chkDirC = new CheckingResourceListener(Kind.ENTRY_MODIFY), chkFileC1 = new CheckingResourceListener(Kind.ENTRY_MODIFY); watcher.addListener(res.path(), chkFileC1); watcher.addListener(store.get("DirA/DirC").path(), chkDirC); watcher.addListener(store.get("DirA").path(), chkDirA); List<Event> events = SimpleResourceNotificationDispatcher.createEvents(res, Kind.ENTRY_MODIFY); watcher.changed(new ResourceNotification("DirA/DirC/FileC1", Kind.ENTRY_MODIFY, System.currentTimeMillis(), events)); //test that listeners received events assertFalse(chkDirA.isChecked()); assertTrue(chkDirC.isChecked()); assertTrue(chkFileC1.isChecked()); //remove listeners assertTrue(watcher.removeListener(res.path(), chkFileC1)); assertTrue(watcher.removeListener(store.get("DirA/DirC").path(), chkDirC)); assertTrue(watcher.removeListener(store.get("DirA").path(), chkDirA)); } @Test public void testCreateNotification() { Resource res = store.get("DirA/DirC/DirD/FileQ"); final CheckingResourceListener chkDirA = new CheckingResourceListener(Kind.ENTRY_MODIFY), chkDirC = new CheckingResourceListener(Kind.ENTRY_MODIFY), chkDirD = new CheckingResourceListener(Kind.ENTRY_CREATE), chkFileQ = new CheckingResourceListener(Kind.ENTRY_CREATE); watcher.addListener(res.path(), chkFileQ); watcher.addListener(store.get("DirA/DirC/DirD").path(), chkDirD); watcher.addListener(store.get("DirA/DirC").path(), chkDirC); watcher.addListener(store.get("DirA").path(), chkDirA); List<Event> events = SimpleResourceNotificationDispatcher.createEvents(res, Kind.ENTRY_CREATE); watcher.changed(new ResourceNotification("DirA/DirC/DirD/FileQ", Kind.ENTRY_CREATE, System.currentTimeMillis(), events)); //test that listeners received events assertFalse(chkDirA.isChecked()); assertTrue(chkDirC.isChecked()); assertTrue(chkDirD.isChecked()); assertTrue(chkFileQ.isChecked()); //remove listeners assertTrue(watcher.removeListener(res.path(), chkFileQ)); assertTrue(watcher.removeListener(store.get("DirA/DirC/DirD").path(), chkDirD)); assertTrue(watcher.removeListener(store.get("DirA/DirC").path(), chkDirC)); assertTrue(watcher.removeListener(store.get("DirA").path(), chkDirA)); } }