blob: c98ea4fa4eccea23bec71f8ecbdb83ff22f475fe [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2007 Oracle Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Oracle Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.core.tests.resource;
import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener;
import org.eclipse.jst.jsf.common.internal.resource.LifecycleListener;
import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent;
import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType;
import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.ReasonType;
import org.eclipse.jst.jsf.core.tests.TestsPlugin;
import org.eclipse.jst.jsf.test.util.JSFTestUtil;
import org.eclipse.jst.jsf.test.util.WebProjectTestEnvironment;
public class TestLifecycleListener extends TestCase
{
private WebProjectTestEnvironment _webProjectTestEnv;
private IResource _res1;
private IResource _res2;
@Override
protected void setUp() throws Exception
{
super.setUp();
JSFTestUtil.setValidationEnabled(false);
_webProjectTestEnv = new WebProjectTestEnvironment(
getClass().getName()+"_" + getName());
_webProjectTestEnv.createProject(false);
assertNotNull(_webProjectTestEnv);
assertNotNull(_webProjectTestEnv.getTestProject());
assertTrue(_webProjectTestEnv.getTestProject().isAccessible());
_res1 = _webProjectTestEnv.loadResourceInWebRoot(TestsPlugin.getDefault().getBundle()
, "/testfiles/jsps/testdata1.jsp.data", "/testdata1.jsp");
_res2 = _webProjectTestEnv.loadResourceInWebRoot(TestsPlugin.getDefault().getBundle()
, "/testfiles/jsps/testdata1.jsp.data", "/testdata2.jsp");
}
private void testInaccessibleCondition(IResource res, Runnable runnable, ReasonType reason)
{
assertTrue(res.isAccessible());
LifecycleListener testListener = new LifecycleListener(res);
MockListener mockListener = new MockListener();
testListener.addListener(mockListener);
runnable.run();
mockListener.assertAcceptedResourceInaccessible(res, reason);
assertFalse(res.isAccessible());
testListener.removeListener(mockListener);
testListener.dispose();
}
private void testInaccessibleConditionMultiple(List<IResource> resources, Runnable runnable, List<ReasonType> reasons)
{
assertEquals(resources.size(), reasons.size());
for (IResource res : resources)
{
assertTrue(res.isAccessible());
}
LifecycleListener testListener = new LifecycleListener(resources);
MockListener mockListener = new MockListener();
testListener.addListener(mockListener);
runnable.run();
for (int i = 0; i < resources.size(); i++)
{
final IResource res = resources.get(i);
final ReasonType reason = reasons.get(i);
mockListener.assertAcceptedResourceInaccessible(res,reason);
assertFalse(res.isAccessible());
}
testListener.removeListener(mockListener);
testListener.dispose();
}
public void testProjectClosedForProject() throws Exception
{
final Runnable runnable = new Runnable()
{
public void run()
{
// now close the project
try {
_webProjectTestEnv.getTestProject().close(null);
} catch (CoreException e) {
throw new RuntimeException(e);
}
}
};
testInaccessibleCondition(_webProjectTestEnv.getTestProject(), runnable, ReasonType.RESOURCE_PROJECT_CLOSED);
}
public void testProjectClosedForContainedResource() throws Exception
{
final Runnable runnable = new Runnable()
{
public void run()
{
// now close the project
try {
_webProjectTestEnv.getTestProject().close(null);
} catch (CoreException e) {
throw new RuntimeException(e);
}
}
};
testInaccessibleCondition(_res1, runnable, ReasonType.RESOURCE_PROJECT_CLOSED);
}
public void testProjectDeletedForProject() throws Exception
{
final Runnable runnable = new Runnable()
{
public void run()
{
// now delete the project
try {
_webProjectTestEnv.getTestProject().delete(true, null);
} catch (CoreException e) {
throw new RuntimeException(e);
}
}
};
testInaccessibleCondition(_webProjectTestEnv.getTestProject(), runnable, ReasonType.RESOURCE_DELETED);
}
public void testProjectDeletedForContainedResource() throws Exception
{
final Runnable runnable = new Runnable()
{
public void run()
{
// now delete the project
try
{
_webProjectTestEnv.getTestProject().delete(true, null);
} catch (CoreException e)
{
throw new RuntimeException(e);
}
}
};
testInaccessibleCondition(_res1, runnable, ReasonType.RESOURCE_PROJECT_DELETED);
}
public void testResourceDeleted() throws Exception
{
final Runnable runnable = new Runnable()
{
public void run()
{
// now delete the resource
try {
_res1.delete(true, null);
} catch (CoreException e) {
throw new RuntimeException(e);
}
}
};
testInaccessibleCondition(_res1, runnable, ReasonType.RESOURCE_DELETED);
}
public void testMultipleResourcesDeleted() throws Exception
{
final Runnable runnable = new Runnable()
{
public void run()
{
// now delete the resource
try {
_res1.delete(true, null);
_res2.delete(true, null);
} catch (CoreException e) {
throw new RuntimeException(e);
}
}
};
List<IResource> resources = new ArrayList<IResource>();
resources.add(_res1);
resources.add(_res2);
List<ReasonType> reasons = new ArrayList<ReasonType>();
reasons.add(ReasonType.RESOURCE_DELETED);
reasons.add(ReasonType.RESOURCE_DELETED);
testInaccessibleConditionMultiple(resources, runnable, reasons);
}
public void testMultipleResourcesProjectClosed() throws Exception
{
final Runnable runnable = new Runnable()
{
public void run()
{
// now delete the resource
try {
_res1.getProject().close(null);
} catch (CoreException e) {
throw new RuntimeException(e);
}
}
};
List<IResource> resources = new ArrayList<IResource>();
resources.add(_res1);
resources.add(_res2);
List<ReasonType> reasons = new ArrayList<ReasonType>();
reasons.add(ReasonType.RESOURCE_PROJECT_CLOSED);
reasons.add(ReasonType.RESOURCE_PROJECT_CLOSED);
testInaccessibleConditionMultiple(resources, runnable, reasons);
}
public void testAddResource() throws Exception
{
assertTrue(_res1.isAccessible());
assertTrue(_res2.isAccessible());
LifecycleListener testListener = new LifecycleListener(_res1);
MockListener mockListener = new MockListener();
testListener.addListener(mockListener);
testListener.addResource(_res2);
_res1.getProject().close(null);
mockListener.assertAcceptedResourceInaccessible(_res1, ReasonType.RESOURCE_PROJECT_CLOSED);
mockListener.assertAcceptedResourceInaccessible(_res2, ReasonType.RESOURCE_PROJECT_CLOSED);
assertFalse(_res1.isAccessible());
assertFalse(_res2.isAccessible());
testListener.removeListener(mockListener);
testListener.dispose();
}
public void testAddRemoveResource() throws Exception
{
assertTrue(_res1.isAccessible());
assertTrue(_res2.isAccessible());
LifecycleListener testListener = new LifecycleListener(_res1);
MockListener mockListener = new MockListener();
testListener.addListener(mockListener);
testListener.addResource(_res2);
testListener.removeResource(_res1);
_res1.getProject().close(null);
// we removed res1, so should find an event for it
mockListener.assertNoAcceptedResourceInaccessible(_res1, ReasonType.RESOURCE_PROJECT_CLOSED);
mockListener.assertAcceptedResourceInaccessible(_res2, ReasonType.RESOURCE_PROJECT_CLOSED);
assertFalse(_res1.isAccessible());
assertFalse(_res2.isAccessible());
testListener.removeListener(mockListener);
testListener.dispose();
}
public void testRemoveListenerResource() throws Exception
{
assertTrue(_res1.isAccessible());
assertTrue(_res2.isAccessible());
LifecycleListener testListener = new LifecycleListener(_res1);
testListener.addResource(_res2);
MockListener mockListener = new MockListener();
MockListener mockListener2 = new MockListener();
testListener.addListener(mockListener);
testListener.addListener(mockListener2);
_res1.delete(true, null);
// both listeners should get the event on res1
mockListener.assertAcceptedResourceInaccessible(_res1, ReasonType.RESOURCE_DELETED);
mockListener2.assertAcceptedResourceInaccessible(_res1, ReasonType.RESOURCE_DELETED);
assertFalse(_res1.isAccessible());
// remove the listener for mock2
testListener.removeListener(mockListener2);
_res2.delete(true, null);
// the first mockListener should get it
mockListener.assertAcceptedResourceInaccessible(_res2, ReasonType.RESOURCE_DELETED);
// the second one was removed before the delete
// so it should not have accepted an event
mockListener2.assertNoAcceptedResourceInaccessible(_res2, ReasonType.RESOURCE_DELETED);
assertFalse(_res2.isAccessible());
testListener.removeListener(mockListener);
testListener.dispose();
}
public void testResourceChangedEvent() throws Exception
{
assertTrue(_res1.isAccessible());
assertTrue(_res2.isAccessible());
LifecycleListener testListener = new LifecycleListener(_res1);
testListener.addResource(_res2);
MockListener mockListener = new MockListener();
testListener.addListener(mockListener);
// simulate a content change
_res1.touch(null);
mockListener.assertAcceptedEvent(_res1, EventType.RESOURCE_CHANGED, ReasonType.RESOURCE_CHANGED_CONTENTS);
testListener.removeListener(mockListener);
testListener.dispose();
}
public void testDisposeAfterEvent() throws Exception
{
LifecycleListener testListener = new LifecycleListener(_res1);
MockListenerThatDoesDispose mockListener = new MockListenerThatDoesDispose();
testListener.addListener(mockListener);
_res1.delete(true, null);
assertTrue(testListener.isDisposed());
boolean caughtAssertion = false;
try
{
testListener.addListener(mockListener);
}
catch (IllegalStateException ae)
{
caughtAssertion = true;
}
assertTrue(caughtAssertion);
}
/**
* A mock object that tests the disposeAfterEvent flag.
* @author cbateman
*
*/
private class MockListenerThatDoesDispose implements IResourceLifecycleListener
{
public EventResult acceptEvent(ResourceLifecycleEvent event)
{
EventResult result = EventResult.getDisposeAfterEventResult();
return result;
}
}
}