From 1e517e23e45c19d5601d62d6b66d26b5cae4665d Mon Sep 17 00:00:00 2001
From: Alena Laskavaia <elaskavaia.cdt@gmail.com>
Date: Mon, 1 Dec 2014 11:21:03 -0500
Subject: [PATCH] another attempt to fix race condition in Qt tests

after tests were fixed found funny bug that was there forever test was
creating incorrect header file because our comment extractor takes
comment from first occurence of function name, it is not actual java
parser. Because indexer was not running test was passing.

Change-Id: Ib0cea722e6c9766949d07b629ef7a9197529ef45
Signed-off-by: Alena Laskavaia <elaskavaia.cdt@gmail.com>
Reviewed-on: https://git.eclipse.org/r/37410
Tested-by: Hudson CI
---
 .../eclipse/cdt/qt/tests/BaseQtTestCase.java  | 32 ++++++++++++++++---
 .../cdt/qt/tests/QmlRegistrationTests.java    |  1 -
 .../eclipse/cdt/qt/tests/QtIndexTests.java    | 20 ++++++------
 3 files changed, 38 insertions(+), 15 deletions(-)

diff --git a/qt/org.eclipse.cdt.qt.tests/src/org/eclipse/cdt/qt/tests/BaseQtTestCase.java b/qt/org.eclipse.cdt.qt.tests/src/org/eclipse/cdt/qt/tests/BaseQtTestCase.java
index fd7210bf176..1eff2090694 100644
--- a/qt/org.eclipse.cdt.qt.tests/src/org/eclipse/cdt/qt/tests/BaseQtTestCase.java
+++ b/qt/org.eclipse.cdt.qt.tests/src/org/eclipse/cdt/qt/tests/BaseQtTestCase.java
@@ -7,6 +7,7 @@
  */
 package org.eclipse.cdt.qt.tests;
 
+import org.eclipse.cdt.core.CCProjectNature;
 import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.dom.IPDOMManager;
 import org.eclipse.cdt.core.index.IIndex;
@@ -18,6 +19,11 @@ import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
 import org.eclipse.cdt.qt.core.QtNature;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.NullProgressMonitor;
 
 public class BaseQtTestCase extends BaseTestCase {
@@ -39,15 +45,31 @@ public class BaseQtTestCase extends BaseTestCase {
 	protected ICProject fCProject;
 	protected IIndex fIndex;
 
+	public static ICProject createQtProject(final String projectName, final String binFolderName) throws CoreException {
+		final IWorkspace ws = ResourcesPlugin.getWorkspace();
+		final ICProject newProject[] = new ICProject[1];
+		ws.run(new IWorkspaceRunnable() {
+			@Override
+			public void run(IProgressMonitor monitor) throws CoreException {
+				ICProject cproject = CProjectHelper.createCProject(projectName, binFolderName, IPDOMManager.ID_FAST_INDEXER);
+				if (!cproject.getProject().hasNature(CCProjectNature.CC_NATURE_ID)) {
+					CProjectHelper.addNatureToProject(cproject.getProject(), CCProjectNature.CC_NATURE_ID, null);
+					QtNature.addNature(cproject.getProject(), new NullProgressMonitor());
+				}
+				newProject[0] = cproject;
+			}
+		}, null);
+		return newProject[0];
+	}
+
 	@Override
 	protected void setUp() throws Exception {
 		super.setUp();
 
 		String projectName = "__" + getClass().getSimpleName() + "__";
 
-		fCProject = CProjectHelper.createCCProject(projectName, "bin", IPDOMManager.ID_FAST_INDEXER);
+		fCProject = createQtProject(projectName, "bin");
 		fProject = fCProject.getProject();
-		QtNature.addNature(fProject, new NullProgressMonitor());
 		fIndex = CCorePlugin.getIndexManager().getIndex(fCProject);
 
 		indexQObject_h();
@@ -150,15 +172,17 @@ public class BaseQtTestCase extends BaseTestCase {
 		// add the new content
 		fFile = TestSourceReader.createFile(fProject, filename, contents[0]);
 
+		CCorePlugin.getIndexManager().reindex(fCProject);// just make sure we re-indexing here
 		// wait for the index to change
 		Thread.yield();
+		waitForIndexer(fCProject);
 		for(long stopAt = System.currentTimeMillis() + 3000;
 			System.currentTimeMillis() < stopAt && timestamp == indexManager.getIndex(fCProject).getLastWriteAccess();
 			Thread.sleep(100)) {
-			/* intentionally empty*/
+			waitForIndexer(fCProject);
 		}
-
 		assertNotSame(timestamp, indexManager.getIndex(fCProject).getLastWriteAccess());
+
     }
 
     /**
diff --git a/qt/org.eclipse.cdt.qt.tests/src/org/eclipse/cdt/qt/tests/QmlRegistrationTests.java b/qt/org.eclipse.cdt.qt.tests/src/org/eclipse/cdt/qt/tests/QmlRegistrationTests.java
index f75212ff788..bd39de5511c 100644
--- a/qt/org.eclipse.cdt.qt.tests/src/org/eclipse/cdt/qt/tests/QmlRegistrationTests.java
+++ b/qt/org.eclipse.cdt.qt.tests/src/org/eclipse/cdt/qt/tests/QmlRegistrationTests.java
@@ -100,7 +100,6 @@ public class QmlRegistrationTests extends BaseQtTestCase {
 	// }
 	public void testQmlRegisterFwdDecl() throws Exception {
 		loadComment("qmlregistertype.hh");
-		waitForIndexer(fCProject);
 
 		QtIndex qtIndex = QtIndex.getIndex(fProject);
 		assertNotNull(qtIndex);
diff --git a/qt/org.eclipse.cdt.qt.tests/src/org/eclipse/cdt/qt/tests/QtIndexTests.java b/qt/org.eclipse.cdt.qt.tests/src/org/eclipse/cdt/qt/tests/QtIndexTests.java
index e4fd1852588..41a9576f63b 100644
--- a/qt/org.eclipse.cdt.qt.tests/src/org/eclipse/cdt/qt/tests/QtIndexTests.java
+++ b/qt/org.eclipse.cdt.qt.tests/src/org/eclipse/cdt/qt/tests/QtIndexTests.java
@@ -14,6 +14,16 @@ public class QtIndexTests extends BaseQtTestCase {
 
 	private static final String Filename_testCache = "testCache.hh";
 
+	// #include "junit-QObject.hh"
+	// class B : public QObject
+	// {
+	// Q_OBJECT
+	// Q_PROPERTY(bool allowed READ isAllowed)
+	// };
+	public void changeBDecl() throws Exception {
+		loadComment(Filename_testCache);
+	}
+
 	// #include "junit-QObject.hh"
 	// class B : public QObject
 	// {
@@ -36,14 +46,4 @@ public class QtIndexTests extends BaseQtTestCase {
 		assertNotNull(qobj2);
 		assertEquals("B", qobj2.getName());
 	}
-
-	// #include "junit-QObject.hh"
-	// class B : public QObject
-	// {
-	// Q_OBJECT
-	// Q_PROPERTY(bool allowed READ isAllowed())
-	// };
-	public void changeBDecl() throws Exception {
-		loadComment(Filename_testCache);
-	}
 }