diff options
author | Pawel Piech | 2010-02-26 19:09:04 +0000 |
---|---|---|
committer | Pawel Piech | 2010-02-26 19:09:04 +0000 |
commit | af98c3645fb2064df6e6c8a517989c2c54ef92c6 (patch) | |
tree | 95284b524808eadf5a03d1cf1caffa8affe13bc2 /org.eclipse.debug.tests | |
parent | 6ca8251c8c4154667f4d4ece629896788019a666 (diff) | |
download | eclipse.platform.debug-af98c3645fb2064df6e6c8a517989c2c54ef92c6.tar.gz eclipse.platform.debug-af98c3645fb2064df6e6c8a517989c2c54ef92c6.tar.xz eclipse.platform.debug-af98c3645fb2064df6e6c8a517989c2c54ef92c6.zip |
[304066] Added more failure reporting to tests.
Diffstat (limited to 'org.eclipse.debug.tests')
8 files changed, 242 insertions, 77 deletions
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/CheckTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/CheckTests.java index 13b56003c..c6bef8d6a 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/CheckTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/CheckTests.java @@ -13,6 +13,7 @@ package org.eclipe.debug.tests.viewer.model; import junit.framework.TestCase; import org.eclipe.debug.tests.viewer.model.TestModel.TestElement; +import org.eclipse.core.commands.ExecutionException; import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; @@ -70,6 +71,14 @@ abstract public class CheckTests extends TestCase { while (!fShell.isDisposed()) if (!fDisplay.readAndDispatch ()) fDisplay.sleep (); } + protected void runTest() throws Throwable { + try { + super.runTest(); + } catch (Throwable t) { + throw new ExecutionException("Test failed: " + t.getMessage() + "\n fListener = " + fListener.toString(), t); + } + } + public void testSimpleSingleLevel() { // Create the model with test data TestModel model = TestModel.simpleSingleLevel(); diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ContentTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ContentTests.java index 3c1ded4f3..1c1fcca1b 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ContentTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ContentTests.java @@ -12,6 +12,7 @@ package org.eclipe.debug.tests.viewer.model; import junit.framework.TestCase; +import org.eclipse.core.commands.ExecutionException; import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; import org.eclipse.jface.viewers.TreePath; @@ -67,6 +68,14 @@ abstract public class ContentTests extends TestCase { while (!fShell.isDisposed()) if (!fDisplay.readAndDispatch ()) fDisplay.sleep (); } + protected void runTest() throws Throwable { + try { + super.runTest(); + } catch (Throwable t) { + throw new ExecutionException("Test failed: " + t.getMessage() + "\n fListener = " + fListener.toString(), t); + } + } + public void testSimpleSingleLevel() { // Create the model with test data TestModel model = TestModel.simpleSingleLevel(); diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/DeltaTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/DeltaTests.java index 63d1ca7bc..f71982d79 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/DeltaTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/DeltaTests.java @@ -17,6 +17,7 @@ import junit.framework.Assert; import junit.framework.TestCase; import org.eclipe.debug.tests.viewer.model.TestModel.TestElement; +import org.eclipse.core.commands.ExecutionException; import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; @@ -73,6 +74,14 @@ abstract public class DeltaTests extends TestCase { while (!fShell.isDisposed()) if (!fDisplay.readAndDispatch ()) fDisplay.sleep (); } + protected void runTest() throws Throwable { + try { + super.runTest(); + } catch (Throwable t) { + throw new ExecutionException("Test failed: " + t.getMessage() + "\n fListener = " + fListener.toString(), t); + } + } + public void testUpdateLabel() { //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ITestModelUpdatesListenerConstants.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ITestModelUpdatesListenerConstants.java index 10aa25c03..af922ef60 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ITestModelUpdatesListenerConstants.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ITestModelUpdatesListenerConstants.java @@ -17,24 +17,31 @@ package org.eclipe.debug.tests.viewer.model; */ public interface ITestModelUpdatesListenerConstants { - public static final int LABEL_UPDATES_COMPLETE = 0X0001; - public static final int CONTENT_UPDATES_COMPLETE = 0X0002; - public static final int LABEL_UPDATES = 0X0004; - public static final int HAS_CHILDREN_UPDATES = 0X0008; - public static final int CHILDREN_COUNT_UPDATES = 0X0010; - public static final int CHILDREN_UPDATES = 0X0020; - public static final int MODEL_CHANGED_COMPLETE = 0X0040; - public static final int MODEL_PROXIES_INSTALLED = 0X0080; - public static final int STATE_SAVE_COMPLETE = 0X0100; - public static final int STATE_RESTORE_COMPLETE = 0X0200; - public static final int STATE_UPDATES = 0X0400; + public static final int LABEL_UPDATES_COMPLETE = 0X00000001; + public static final int CONTENT_UPDATES_COMPLETE = 0X00000002; + public static final int LABEL_UPDATES = 0X00000004; + public static final int LABEL_UPDATES_STARTED = 0X00040000; + public static final int HAS_CHILDREN_UPDATES = 0X00000008; + public static final int HAS_CHILDREN_UPDATES_STARTED = 0X00080000; + public static final int CHILD_COUNT_UPDATES = 0X00000010; + public static final int CHILD_COUNT_UPDATES_STARTED = 0X00100000; + public static final int CHILDREN_UPDATES = 0X00000020; + public static final int CHILDREN_UPDATES_STARTED = 0X00200000; + public static final int MODEL_CHANGED_COMPLETE = 0X00000040; + public static final int MODEL_PROXIES_INSTALLED = 0X00000080; + public static final int STATE_SAVE_COMPLETE = 0X00000100; + public static final int STATE_RESTORE_COMPLETE = 0X00000200; + public static final int STATE_UPDATES = 0X00000400; + public static final int STATE_UPDATES_STARTED = 0X04000000; - public static final int VIEWER_UPDATES_RUNNING = 0X0800; - public static final int LABEL_UPDATES_RUNNING = 0X1000; - - public static final int LABEL_COMPLETE = LABEL_UPDATES_COMPLETE | LABEL_UPDATES; + public static final int VIEWER_UPDATES_RUNNING = 0X00001000; + public static final int LABEL_UPDATES_RUNNING = 0X00002000; + + public static final int VIEWER_UPDATES_STARTED = HAS_CHILDREN_UPDATES_STARTED | CHILD_COUNT_UPDATES_STARTED | CHILDREN_UPDATES_STARTED; + + public static final int LABEL_COMPLETE = LABEL_UPDATES_COMPLETE | LABEL_UPDATES | LABEL_UPDATES_RUNNING; public static final int CONTENT_COMPLETE = - CONTENT_UPDATES_COMPLETE | HAS_CHILDREN_UPDATES | CHILDREN_COUNT_UPDATES | CHILDREN_UPDATES; + CONTENT_UPDATES_COMPLETE | HAS_CHILDREN_UPDATES | CHILD_COUNT_UPDATES | CHILDREN_UPDATES | VIEWER_UPDATES_RUNNING; public static final int ALL_UPDATES_COMPLETE = LABEL_COMPLETE | CONTENT_COMPLETE | MODEL_PROXIES_INSTALLED | LABEL_UPDATES_RUNNING | VIEWER_UPDATES_RUNNING; } diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PerformanceTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PerformanceTests.java index 46c33bda5..b8d47d390 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PerformanceTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PerformanceTests.java @@ -13,6 +13,7 @@ package org.eclipe.debug.tests.viewer.model; import junit.framework.TestCase; import org.eclipe.debug.tests.viewer.model.TestModel.TestElement; +import org.eclipse.core.commands.ExecutionException; import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; @@ -67,6 +68,14 @@ abstract public class PerformanceTests extends TestCase implements ITestModelUpd fShell.close(); while (!fShell.isDisposed()) if (!fDisplay.readAndDispatch ()) fDisplay.sleep (); } + + protected void runTest() throws Throwable { + try { + super.runTest(); + } catch (Throwable t) { + throw new ExecutionException("Test failed: " + t.getMessage() + "\n fListener = " + fListener.toString(), t); + } + } /** * Depth (size) of the test model to be used in the tests. This number allows diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java index 1e52875e2..f1c79cb2f 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java @@ -18,6 +18,7 @@ import junit.framework.Assert; import junit.framework.TestCase; import org.eclipe.debug.tests.viewer.model.TestModel.TestElement; +import org.eclipse.core.commands.ExecutionException; import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; @@ -76,6 +77,14 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi while (!fShell.isDisposed()) if (!fDisplay.readAndDispatch ()) fDisplay.sleep (); } + protected void runTest() throws Throwable { + try { + super.runTest(); + } catch (Throwable t) { + throw new ExecutionException("Test failed: " + t.getMessage() + "\n fListener = " + fListener.toString(), t); + } + } + protected ITreeModelContentProviderTarget getCTargetViewer() { return (ITreeModelContentProviderTarget)fViewer; } @@ -226,7 +235,7 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi TreePath elementPath = model.findElement(element.getLabel()); fListener.addUpdates( elementPath, element, 1, - CHILDREN_COUNT_UPDATES | (waitForAllUpdates ? CHILDREN_UPDATES : 0) ); + CHILD_COUNT_UPDATES | (waitForAllUpdates ? CHILDREN_UPDATES : 0) ); delta = delta.addNode(element, index, IModelDelta.EXPAND, element.getChildren().length); element = element.getChildren()[0]; index = 0; diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/TestModelUpdatesListener.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/TestModelUpdatesListener.java index 75b4ef81a..fdca40864 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/TestModelUpdatesListener.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/TestModelUpdatesListener.java @@ -42,13 +42,25 @@ public class TestModelUpdatesListener private final ITreeModelViewer fViewer; private boolean fFailOnRedundantUpdates; + private Set fRedundantUpdates = new HashSet(); + private boolean fFailOnMultipleModelUpdateSequences; + private boolean fMultipleModelUpdateSequencesObserved; private boolean fFailOnMultipleLabelUpdateSequences; + private boolean fMultipleLabelUpdateSequencesObserved; - private Set fHasChildrenUpdates = new HashSet(); - private Map fChildrenUpdates = new HashMap(); - private Set fChildCountUpdates = new HashSet(); + private Set fHasChildrenUpdatesScheduled = new HashSet(); + private Set fHasChildrenUpdatesRunning = new HashSet(); + private Set fHasChildrenUpdatesCompleted = new HashSet(); + private Map fChildrenUpdatesScheduled = new HashMap(); + private Set fChildrenUpdatesRunning = new HashSet(); + private Set fChildrenUpdatesCompleted = new HashSet(); + private Set fChildCountUpdatesScheduled = new HashSet(); + private Set fChildCountUpdatesRunning = new HashSet(); + private Set fChildCountUpdatesCompleted = new HashSet(); private Set fLabelUpdates = new HashSet(); + private Set fLabelUpdatesRunning = new HashSet(); + private Set fLabelUpdatesCompleted = new HashSet(); private Set fProxyModels = new HashSet(); private Set fStateUpdates = new HashSet(); private boolean fViewerUpdatesComplete; @@ -56,9 +68,9 @@ public class TestModelUpdatesListener private boolean fModelChangedComplete; private boolean fStateSaveComplete; private boolean fStateRestoreComplete; - private int fViewerUpdatesRunning; - private int fLabelUpdatesRunning; - private int fTimeoutInterval = 600000; + private int fViewerUpdatesCounter; + private int fLabelUpdatesCounter; + private int fTimeoutInterval = 60000; private long fTimeoutTime; @@ -121,10 +133,21 @@ public class TestModelUpdatesListener } public void reset() { - fHasChildrenUpdates.clear(); - fChildrenUpdates.clear(); - fChildCountUpdates.clear(); + fRedundantUpdates.clear(); + fMultipleLabelUpdateSequencesObserved = false; + fMultipleModelUpdateSequencesObserved = false; + fHasChildrenUpdatesScheduled.clear(); + fHasChildrenUpdatesRunning.clear(); + fHasChildrenUpdatesCompleted.clear(); + fChildrenUpdatesScheduled.clear(); + fChildrenUpdatesRunning.clear(); + fChildrenUpdatesCompleted.clear(); + fChildCountUpdatesScheduled.clear(); + fChildCountUpdatesRunning.clear(); + fChildCountUpdatesCompleted.clear(); fLabelUpdates.clear(); + fLabelUpdatesRunning.clear(); + fLabelUpdatesCompleted.clear(); fProxyModels.clear(); fViewerUpdatesComplete = false; fLabelUpdatesComplete = false; @@ -139,36 +162,36 @@ public class TestModelUpdatesListener } public void addHasChildrenUpdate(TreePath path) { - fHasChildrenUpdates.add(path); + fHasChildrenUpdatesScheduled.add(path); } public void removeHasChildrenUpdate(TreePath path) { - fHasChildrenUpdates.remove(path); + fHasChildrenUpdatesScheduled.remove(path); } public void addChildreCountUpdate(TreePath path) { - fChildCountUpdates.add(path); + fChildCountUpdatesScheduled.add(path); } public void removeChildreCountUpdate(TreePath path) { - fChildCountUpdates.remove(path); + fChildCountUpdatesScheduled.remove(path); } public void addChildreUpdate(TreePath path, int index) { - Set childrenIndexes = (Set)fChildrenUpdates.get(path); + Set childrenIndexes = (Set)fChildrenUpdatesScheduled.get(path); if (childrenIndexes == null) { childrenIndexes = new TreeSet(); - fChildrenUpdates.put(path, childrenIndexes); + fChildrenUpdatesScheduled.put(path, childrenIndexes); } childrenIndexes.add(new Integer(index)); } public void removeChildrenUpdate(TreePath path, int index) { - Set childrenIndexes = (Set)fChildrenUpdates.get(path); + Set childrenIndexes = (Set)fChildrenUpdatesScheduled.get(path); if (childrenIndexes != null) { childrenIndexes.remove(new Integer(index)); if (childrenIndexes.isEmpty()) { - fChildrenUpdates.remove(path); + fChildrenUpdatesScheduled.remove(path); } } } @@ -199,22 +222,22 @@ public class TestModelUpdatesListener fLabelUpdates.add(path); } if ((flags & HAS_CHILDREN_UPDATES) != 0) { - fHasChildrenUpdates.add(path); + fHasChildrenUpdatesScheduled.add(path); } } if (levels-- != 0) { TestElement[] children = element.getChildren(); if (children.length > 0 && (viewer == null || path.getSegmentCount() == 0 || viewer.getExpandedState(path))) { - if ((flags & CHILDREN_COUNT_UPDATES) != 0) { - fChildCountUpdates.add(path); + if ((flags & CHILD_COUNT_UPDATES) != 0) { + fChildCountUpdatesScheduled.add(path); } if ((flags & CHILDREN_UPDATES) != 0) { Set childrenIndexes = new HashSet(); for (int i = 0; i < children.length; i++) { childrenIndexes.add(new Integer(i)); } - fChildrenUpdates.put(path, childrenIndexes); + fChildrenUpdatesScheduled.put(path, childrenIndexes); } if ((flags & STATE_UPDATES) != 0 && viewer != null) { @@ -253,23 +276,45 @@ public class TestModelUpdatesListener throw new RuntimeException("Timed Out: " + toString(flags)); } + if (fFailOnRedundantUpdates && !fRedundantUpdates.isEmpty()) { + Assert.fail("Redundant Updates: " + fRedundantUpdates.toString()); + } + if (fFailOnMultipleLabelUpdateSequences && !fMultipleLabelUpdateSequencesObserved) { + Assert.fail("Multiple label update sequences detected"); + } + if (fFailOnMultipleModelUpdateSequences && fMultipleModelUpdateSequencesObserved) { + Assert.fail("Multiple viewer update sequences detected"); + } + if ( (flags & LABEL_UPDATES_COMPLETE) != 0) { if (!fLabelUpdatesComplete) return false; } + if ( (flags & LABEL_UPDATES_STARTED) != 0) { + if (fLabelUpdatesRunning.isEmpty() && fLabelUpdatesCompleted.isEmpty()) return false; + } if ( (flags & LABEL_UPDATES) != 0) { if (!fLabelUpdates.isEmpty()) return false; } if ( (flags & CONTENT_UPDATES_COMPLETE) != 0) { if (!fViewerUpdatesComplete) return false; } + if ( (flags & HAS_CHILDREN_UPDATES_STARTED) != 0) { + if (fHasChildrenUpdatesRunning.isEmpty() && fHasChildrenUpdatesCompleted.isEmpty()) return false; + } if ( (flags & HAS_CHILDREN_UPDATES) != 0) { - if (!fHasChildrenUpdates.isEmpty()) return false; + if (!fHasChildrenUpdatesScheduled.isEmpty()) return false; + } + if ( (flags & CHILD_COUNT_UPDATES_STARTED) != 0) { + if (fChildCountUpdatesRunning.isEmpty() && fChildCountUpdatesCompleted.isEmpty()) return false; } - if ( (flags & CHILDREN_COUNT_UPDATES) != 0) { - if (!fChildCountUpdates.isEmpty()) return false; + if ( (flags & CHILD_COUNT_UPDATES) != 0) { + if (!fChildCountUpdatesScheduled.isEmpty()) return false; + } + if ( (flags & CHILDREN_UPDATES_STARTED) != 0) { + if (fChildrenUpdatesRunning.isEmpty() && fChildrenUpdatesCompleted.isEmpty()) return false; } if ( (flags & CHILDREN_UPDATES) != 0) { - if (!fChildrenUpdates.isEmpty()) return false; + if (!fChildrenUpdatesScheduled.isEmpty()) return false; } if ( (flags & MODEL_CHANGED_COMPLETE) != 0) { if (!fModelChangedComplete) return false; @@ -284,53 +329,68 @@ public class TestModelUpdatesListener if (fProxyModels.size() != 0) return false; } if ( (flags & VIEWER_UPDATES_RUNNING) != 0) { - if (fViewerUpdatesRunning != 0) { + if (fViewerUpdatesCounter != 0) { return false; } } if ( (flags & LABEL_UPDATES_RUNNING) != 0) { - if (fLabelUpdatesRunning != 0) { + if (fLabelUpdatesCounter != 0) { return false; } } + return true; } public void updateStarted(IViewerUpdate update) { synchronized (this) { - fViewerUpdatesRunning++; + fViewerUpdatesCounter++; + if (update instanceof IHasChildrenUpdate) { + fHasChildrenUpdatesRunning.add(update); + } if (update instanceof IChildrenCountUpdate) { + fChildCountUpdatesRunning.add(update); + } else if (update instanceof IChildrenUpdate) { + fChildCountUpdatesRunning.add(update); + } } } public void updateComplete(IViewerUpdate update) { synchronized (this) { - fViewerUpdatesRunning--; + fViewerUpdatesCounter--; } if (!update.isCanceled()) { if (update instanceof IHasChildrenUpdate) { - if (!fHasChildrenUpdates.remove(update.getElementPath()) && fFailOnRedundantUpdates) { - Assert.fail("Redundant update: " + update); + fHasChildrenUpdatesRunning.remove(update); + fHasChildrenUpdatesCompleted.add(update); + if (!fHasChildrenUpdatesScheduled.remove(update.getElementPath()) && fFailOnRedundantUpdates) { + fRedundantUpdates.add(update); } } if (update instanceof IChildrenCountUpdate) { - if (!fChildCountUpdates.remove(update.getElementPath()) && fFailOnRedundantUpdates) { - Assert.fail("Redundant update: " + update); + fChildCountUpdatesRunning.remove(update); + fChildCountUpdatesCompleted.add(update); + if (!fChildCountUpdatesScheduled.remove(update.getElementPath()) && fFailOnRedundantUpdates) { + fRedundantUpdates.add(update); } } else if (update instanceof IChildrenUpdate) { + fChildrenUpdatesRunning.remove(update); + fChildrenUpdatesCompleted.add(update); + int start = ((IChildrenUpdate)update).getOffset(); int end = start + ((IChildrenUpdate)update).getLength(); - Set childrenIndexes = (Set)fChildrenUpdates.get(update.getElementPath()); + Set childrenIndexes = (Set)fChildrenUpdatesScheduled.get(update.getElementPath()); if (childrenIndexes != null) { for (int i = start; i < end; i++) { childrenIndexes.remove(new Integer(i)); } if (childrenIndexes.isEmpty()) { - fChildrenUpdates.remove(update.getElementPath()); + fChildrenUpdatesScheduled.remove(update.getElementPath()); } } else if (fFailOnRedundantUpdates) { - Assert.fail("Redundant update: " + update); + fRedundantUpdates.add(update); } } } @@ -342,14 +402,16 @@ public class TestModelUpdatesListener public void viewerUpdatesComplete() { if (fFailOnMultipleModelUpdateSequences && fViewerUpdatesComplete) { - Assert.fail("Multiple viewer update sequences detected"); + fMultipleModelUpdateSequencesObserved = true; } fViewerUpdatesComplete = true; } public void labelUpdateComplete(ILabelUpdate update) { synchronized (this) { - fLabelUpdatesRunning--; + fLabelUpdatesRunning.remove(update); + fLabelUpdatesCompleted.add(update); + fLabelUpdatesCounter--; } if (!fLabelUpdates.remove(update.getElementPath()) && fFailOnRedundantUpdates) { Assert.fail("Redundant update: " + update); @@ -358,7 +420,8 @@ public class TestModelUpdatesListener public void labelUpdateStarted(ILabelUpdate update) { synchronized (this) { - fLabelUpdatesRunning++; + fLabelUpdatesRunning.add(update); + fLabelUpdatesCounter++; } } @@ -367,7 +430,7 @@ public class TestModelUpdatesListener public void labelUpdatesComplete() { if (fFailOnMultipleLabelUpdateSequences && fLabelUpdatesComplete) { - Assert.fail("Multiple label update sequences detected"); + fMultipleLabelUpdateSequencesObserved = true; } fLabelUpdatesComplete = true; } @@ -406,14 +469,34 @@ public class TestModelUpdatesListener private String toString(int flags) { StringBuffer buf = new StringBuffer("Viewer Update Listener"); - + + if (fFailOnRedundantUpdates) { + buf.append("\n\t"); + buf.append("fRedundantUpdates = " + fRedundantUpdates); + } + if (fFailOnMultipleLabelUpdateSequences) { + buf.append("\n\t"); + buf.append("fMultipleLabelUpdateSequencesObserved = " + fMultipleLabelUpdateSequencesObserved); + } + if (fFailOnMultipleModelUpdateSequences) { + buf.append("\n\t"); + buf.append("fMultipleModelUpdateSequencesObserved = " + fMultipleModelUpdateSequencesObserved); + } if ( (flags & LABEL_UPDATES_COMPLETE) != 0) { buf.append("\n\t"); buf.append("fLabelUpdatesComplete = " + fLabelUpdatesComplete); } if ( (flags & LABEL_UPDATES_RUNNING) != 0) { buf.append("\n\t"); - buf.append("fLabelUpdatesRunning = " + fLabelUpdatesRunning); + buf.append("fLabelUpdatesRunning = " + fLabelUpdatesCounter); + } + if ( (flags & LABEL_UPDATES_STARTED) != 0) { + buf.append("\n\t"); + buf.append("fLabelUpdatesRunning = "); + buf.append( fLabelUpdatesRunning ); + buf.append("\n\t"); + buf.append("fLabelUpdatesCompleted = "); + buf.append( fLabelUpdatesCompleted ); } if ( (flags & LABEL_UPDATES) != 0) { buf.append("\n\t"); @@ -426,22 +509,46 @@ public class TestModelUpdatesListener } if ( (flags & VIEWER_UPDATES_RUNNING) != 0) { buf.append("\n\t"); - buf.append("fViewerUpdatesRunning = " + fViewerUpdatesRunning); + buf.append("fViewerUpdatesRunning = " + fViewerUpdatesCounter); + } + if ( (flags & HAS_CHILDREN_UPDATES_STARTED) != 0) { + buf.append("\n\t"); + buf.append("fHasChildrenUpdatesRunning = "); + buf.append( fHasChildrenUpdatesRunning ); + buf.append("\n\t"); + buf.append("fHasChildrenUpdatesCompleted = "); + buf.append( fHasChildrenUpdatesCompleted ); } if ( (flags & HAS_CHILDREN_UPDATES) != 0) { buf.append("\n\t"); buf.append("fHasChildrenUpdates = "); - buf.append( toString(fHasChildrenUpdates) ); + buf.append( toString(fHasChildrenUpdatesScheduled) ); } - if ( (flags & CHILDREN_COUNT_UPDATES) != 0) { + if ( (flags & CHILD_COUNT_UPDATES_STARTED) != 0) { + buf.append("\n\t"); + buf.append("fChildCountUpdatesRunning = "); + buf.append( fChildCountUpdatesRunning ); + buf.append("\n\t"); + buf.append("fChildCountUpdatesCompleted = "); + buf.append( fChildCountUpdatesCompleted ); + } + if ( (flags & CHILD_COUNT_UPDATES) != 0) { buf.append("\n\t"); buf.append("fChildCountUpdates = "); - buf.append( toString(fChildCountUpdates) ); + buf.append( toString(fChildCountUpdatesScheduled) ); + } + if ( (flags & CHILDREN_UPDATES_STARTED) != 0) { + buf.append("\n\t"); + buf.append("fChildrenUpdatesRunning = "); + buf.append( fChildrenUpdatesRunning ); + buf.append("\n\t"); + buf.append("fChildrenUpdatesCompleted = "); + buf.append( fChildrenUpdatesCompleted ); } if ( (flags & CHILDREN_UPDATES) != 0) { buf.append("\n\t"); buf.append("fChildrenUpdates = "); - buf.append( toString(fChildrenUpdates) ); + buf.append( toString(fChildrenUpdatesScheduled) ); } if ( (flags & MODEL_CHANGED_COMPLETE) != 0) { buf.append("\n\t"); @@ -507,7 +614,7 @@ public class TestModelUpdatesListener } public String toString() { - return toString(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE | STATE_RESTORE_COMPLETE); + return toString(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE | STATE_RESTORE_COMPLETE | VIEWER_UPDATES_STARTED | LABEL_UPDATES_STARTED); } } diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java index eed6f61cb..2380ce8f9 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java @@ -13,6 +13,7 @@ package org.eclipe.debug.tests.viewer.model; import junit.framework.TestCase; import org.eclipe.debug.tests.viewer.model.TestModel.TestElement; +import org.eclipse.core.commands.ExecutionException; import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; @@ -68,6 +69,14 @@ abstract public class UpdateTests extends TestCase implements ITestModelUpdatesL while (!fShell.isDisposed()) if (!fDisplay.readAndDispatch ()) fDisplay.sleep (); } + protected void runTest() throws Throwable { + try { + super.runTest(); + } catch (Throwable t) { + throw new ExecutionException("Test failed: " + t.getMessage() + "\n fListener = " + fListener.toString(), t); + } + } + /** * This test: * - creates a simple model @@ -213,19 +222,21 @@ abstract public class UpdateTests extends TestCase implements ITestModelUpdatesL // Update the model removeElement(model, 2, true); - insertElement(model, "3-new", 3, true); + addElement(model, "3-new", 3, true); removeElement(model, 4, true); - insertElement(model, "5-new", 5, true); + addElement(model, "5-new", 5, true); removeElement(model, 1, true); - insertElement(model, "1-new", 1, true); + addElement(model, "1-new", 1, true); removeElement(model, 3, true); - insertElement(model, "4-new", 4, true); + addElement(model, "4-new", 4, true); } /** * This test case attempts to create a race condition between processing * of the content updates and processing of add/remove model deltas. + * <br> + * See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=304066">bug 304066</a> */ public void _X_testContentPlusAddRemoveUpdateRaceConditionsElement() { TestModel model = TestModel.simpleSingleLevel(); @@ -251,8 +262,6 @@ abstract public class UpdateTests extends TestCase implements ITestModelUpdatesL model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); // Wait until the delta is processed while (!fListener.isFinished(MODEL_CHANGED_COMPLETE)) if (!fDisplay.readAndDispatch ()) fDisplay.sleep (); - // And then wait for the viewer updates to start. - while (fListener.isFinished(VIEWER_UPDATES_RUNNING)) if (!fDisplay.readAndDispatch ()) fDisplay.sleep (); removeElement(model, 5, false); removeElement(model, 4, false); @@ -263,7 +272,7 @@ abstract public class UpdateTests extends TestCase implements ITestModelUpdatesL // Wait until the children count update is completed using the count from // before elements were removed. - while (!childrenCountUpdateListener.isFinished(CHILDREN_COUNT_UPDATES)) + while (!childrenCountUpdateListener.isFinished(CHILD_COUNT_UPDATES)) if (!fDisplay.readAndDispatch ()) fDisplay.sleep (); insertElement(model, "1 - " + pass, 0, false); @@ -304,15 +313,12 @@ abstract public class UpdateTests extends TestCase implements ITestModelUpdatesL // Refresh the viewer so that updates are generated. TestElement rootElement = model.getRootElement(); fListener.reset(); - fListener.addUpdates(TreePath.EMPTY, model.getRootElement(), 1, CHILDREN_COUNT_UPDATES); + fListener.addUpdates(TreePath.EMPTY, model.getRootElement(), 1, CHILD_COUNT_UPDATES); model.postDelta(new ModelDelta(rootElement, IModelDelta.CONTENT)); // Wait for the delta to be processed. - while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | CHILDREN_COUNT_UPDATES)) if (!fDisplay.readAndDispatch ()) fDisplay.sleep (); + while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | CHILD_COUNT_UPDATES)) if (!fDisplay.readAndDispatch ()) fDisplay.sleep (); - // Wait until an update is started. - while (fListener.isFinished(VIEWER_UPDATES_RUNNING)) if (!fDisplay.readAndDispatch ()) fDisplay.sleep (); - // Update the model removeElement(model, 0, true); addElement(model, "1", 0, true); |