diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java index 11273fb9ac8..55f2dbfcc95 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java @@ -25,7 +25,6 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexBinding; -import org.eclipse.cdt.core.index.IIndexFile; import org.eclipse.cdt.core.index.IIndexName; import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.core.model.ICProject; @@ -81,28 +80,6 @@ public class IndexBugsTests extends BaseTestCase { return TestSourceReader.createFile(container, new Path(fileName), contents); } - protected void waitForIndexer(IFile file, int maxmillis) throws Exception { - long endTime= System.currentTimeMillis() + maxmillis; - int timeLeft= maxmillis; - while (timeLeft >= 0) { - assertTrue(CCorePlugin.getIndexManager().joinIndexer(timeLeft, NPM)); - fIndex.acquireReadLock(); - try { - IIndexFile pfile= fIndex.getFile(file.getLocation()); - if (pfile != null && pfile.getTimestamp() >= file.getLocalTimeStamp()) { - return; - } - } - finally { - fIndex.releaseReadLock(); - } - - Thread.sleep(50); - timeLeft= (int) (endTime-System.currentTimeMillis()); - } - throw new Exception("Indexer did not complete in time!"); - } - protected Pattern[] getPattern(String qname) { String[] parts= qname.split("::"); Pattern[] result= new Pattern[parts.length]; @@ -112,6 +89,10 @@ public class IndexBugsTests extends BaseTestCase { return result; } + protected void waitUntilFileIsIndexed(IFile file, int time) throws Exception { + TestSourceReader.waitUntilFileIsIndexed(fIndex, file, time); + } + // {bug162011} // namespace ns162011 { // class Class162011 { @@ -128,7 +109,7 @@ public class IndexBugsTests extends BaseTestCase { int indexOfDecl = content.indexOf(funcName); int indexOfDef = content.indexOf(funcName, indexOfDecl+1); IFile file= createFile(getProject(), fileName, content); - waitForIndexer(file, 1000); + waitUntilFileIsIndexed(file, 1000); // make sure the ast is correct ITranslationUnit tu= (ITranslationUnit) fCProject.findElement(new Path(fileName)); diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexIncludeTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexIncludeTest.java index a63a77a921d..18b6d871941 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexIncludeTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexIncludeTest.java @@ -24,9 +24,9 @@ import org.eclipse.cdt.core.index.IIndexFile; import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.testplugin.CProjectHelper; +import org.eclipse.cdt.core.testplugin.util.TestSourceReader; import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; @@ -111,14 +111,16 @@ public class IndexIncludeTest extends IndexTestBase { private void checkContext() throws Exception { final long timestamp= System.currentTimeMillis(); - final IResource file= fProject.getProject().findMember(new Path("included.h")); + final IFile file= (IFile) fProject.getProject().findMember(new Path("included.h")); assertNotNull(file); + waitForIndexer(); + ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { - ((IFile) file).setContents(new ByteArrayInputStream( "int included; int CONTEXT;\n".getBytes()), false, false, NPM); + file.setContents(new ByteArrayInputStream( "int included; int CONTEXT;\n".getBytes()), false, false, NPM); } }, NPM); - waitForIndexer(); + TestSourceReader.waitUntilFileIsIndexed(fIndex, file, 1000); fIndex.acquireReadLock(); try { IIndexFile ifile= fIndex.getFile(file.getLocation()); diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexListenerTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexListenerTest.java index 00e88f01d8f..14778ac6d62 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexListenerTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexListenerTest.java @@ -18,7 +18,6 @@ import junit.framework.Test; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IPDOMManager; -import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexChangeEvent; import org.eclipse.cdt.core.index.IIndexChangeListener; import org.eclipse.cdt.core.index.IIndexManager; @@ -28,10 +27,12 @@ import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.testplugin.CProjectHelper; import org.eclipse.cdt.core.testplugin.util.BaseTestCase; import org.eclipse.cdt.core.testplugin.util.TestSourceReader; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; public class IndexListenerTest extends BaseTestCase { - protected IIndex fIndex; + private static final IProgressMonitor NPM = new NullProgressMonitor(); private ICProject fProject1; private ICProject fProject2; @@ -51,54 +52,88 @@ public class IndexListenerTest extends BaseTestCase { } public void testIdleListener() throws Exception { + final Object mutex= new Object(); final int[] state= new int[] {0, 0, 0}; IIndexManager im= CCorePlugin.getIndexManager(); + assertTrue(im.joinIndexer(10000, NPM)); - im.addIndexerStateListener(new IIndexerStateListener() { + IIndexerStateListener listener = new IIndexerStateListener() { public void indexChanged(IIndexerStateEvent event) { - if (event.indexerIsIdle()) { - state[0]++; - state[2]= 0; - } - else { - state[1]++; - state[2]= 1; + synchronized (mutex) { + if (event.indexerIsIdle()) { + state[0]++; + state[2]= 0; + } + else { + state[1]++; + state[2]= 1; + } + mutex.notify(); } } - }); + }; - TestSourceReader.createFile(fProject1.getProject(), "test.cpp", "int a;"); - Thread.sleep(200); - assertTrue(im.joinIndexer(10000, new NullProgressMonitor())); - Thread.sleep(200); - assertEquals(1, state[0]); - assertEquals(1, state[1]); - assertEquals(0, state[2]); + im.addIndexerStateListener(listener); + try { + IFile file= TestSourceReader.createFile(fProject1.getProject(), "test.cpp", "int a;"); + synchronized (mutex) { + mutex.wait(1000); + if (state[0]+state[1] < 2) { + mutex.wait(1000); + } + } + assertEquals(1, state[0]); + assertEquals(1, state[1]); + assertEquals(0, state[2]); + } + finally { + im.removeIndexerStateListener(listener); + } } + public void testChangeListener() throws Exception { + final Object mutex= new Object(); final List projects= new ArrayList(); IIndexManager im= CCorePlugin.getIndexManager(); - im.addIndexChangeListener(new IIndexChangeListener() { + assertTrue(im.joinIndexer(10000, NPM)); + IIndexChangeListener listener = new IIndexChangeListener() { public void indexChanged(IIndexChangeEvent event) { - projects.add(event.getAffectedProject()); + synchronized (mutex) { + projects.add(event.getAffectedProject()); + mutex.notify(); + } } - }); - - TestSourceReader.createFile(fProject1.getProject(), "test.cpp", "int a;"); - Thread.sleep(200); - assertEquals(1, projects.size()); - assertTrue(projects.contains(fProject1)); - projects.clear(); - + }; + + im.addIndexChangeListener(listener); + try { + IFile file= TestSourceReader.createFile(fProject1.getProject(), "test.cpp", "int a;"); + + synchronized (mutex) { + mutex.wait(1000); + } + assertEquals(1, projects.size()); + assertTrue(projects.contains(fProject1)); + projects.clear(); - TestSourceReader.createFile(fProject1.getProject(), "test.cpp", "int a;"); - TestSourceReader.createFile(fProject2.getProject(), "test.cpp", "int b;"); - Thread.sleep(200); - assertEquals(2, projects.size()); - assertTrue(projects.contains(fProject1)); - assertTrue(projects.contains(fProject2)); - projects.clear(); + + IFile file1= TestSourceReader.createFile(fProject1.getProject(), "test.cpp", "int a;"); + IFile file2= TestSourceReader.createFile(fProject2.getProject(), "test.cpp", "int b;"); + synchronized (mutex) { + mutex.wait(1000); + if (projects.size() < 2) { + mutex.wait(1000); + } + } + assertEquals(2, projects.size()); + assertTrue(projects.contains(fProject1)); + assertTrue(projects.contains(fProject2)); + projects.clear(); + } + finally { + im.removeIndexChangeListener(listener); + } } } diff --git a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/TestSourceReader.java b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/TestSourceReader.java index a75dbb0a4de..4de98fcfa2c 100644 --- a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/TestSourceReader.java +++ b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/TestSourceReader.java @@ -19,6 +19,9 @@ import java.io.LineNumberReader; import junit.framework.Assert; +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.index.IIndexFile; import org.eclipse.core.filebuffers.FileBuffers; import org.eclipse.core.filebuffers.ITextFileBuffer; import org.eclipse.core.filebuffers.ITextFileBufferManager; @@ -143,4 +146,35 @@ public class TestSourceReader { public static IFile createFile(IContainer container, String filePath, String contents) throws CoreException { return createFile(container, new Path(filePath), contents); } + + /** + * Waits until the given file is indexed. Fails if this does not happen within the + * given time. + * @param file + * @param maxmillis + * @throws Exception + * @since 4.0 + */ + public static void waitUntilFileIsIndexed(IIndex index, IFile file, int maxmillis) throws Exception { + long endTime= System.currentTimeMillis() + maxmillis; + int timeLeft= maxmillis; + while (timeLeft >= 0) { + Assert.assertTrue(CCorePlugin.getIndexManager().joinIndexer(timeLeft, new NullProgressMonitor())); + index.acquireReadLock(); + try { + IIndexFile pfile= index.getFile(file.getLocation()); + if (pfile != null && pfile.getTimestamp() >= file.getLocalTimeStamp()) { + return; + } + } + finally { + index.releaseReadLock(); + } + + Thread.sleep(50); + timeLeft= (int) (endTime-System.currentTimeMillis()); + } + Assert.fail("Indexing " + file.getFullPath() + " did not complete in time!"); + } + }