mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-07 17:56:01 +02:00
fix race conditions in unit tests
e.g. see failure in: http://download.eclipse.org/tools/cdt/builds/4.0.0/I.I200704230500/junits.html
This commit is contained in:
parent
b9d0c01c06
commit
325c59736a
2 changed files with 90 additions and 35 deletions
|
@ -78,28 +78,68 @@ public class TeamSharedIndexTest extends IndexTestBase {
|
||||||
}
|
}
|
||||||
|
|
||||||
private ICProject createProject(String name) throws CoreException {
|
private ICProject createProject(String name) throws CoreException {
|
||||||
ICProject project= CProjectHelper.createCCProject(name, null, IPDOMManager.ID_NO_INDEXER);
|
ModelJoiner mj= new ModelJoiner();
|
||||||
registerProject(project);
|
try {
|
||||||
TestSourceReader.createFile(project.getProject(), "a.cpp", "int a;");
|
ICProject project= CProjectHelper.createCCProject(name, null, IPDOMManager.ID_NO_INDEXER);
|
||||||
TestSourceReader.createFile(project.getProject(), "b.cpp", "int b;");
|
registerProject(project);
|
||||||
TestSourceReader.createFile(project.getProject(), "c.cpp", "int c;");
|
TestSourceReader.createFile(project.getProject(), "a.cpp", "int a;");
|
||||||
fPDOMManager.setIndexerId(project, IPDOMManager.ID_FAST_INDEXER);
|
TestSourceReader.createFile(project.getProject(), "b.cpp", "int b;");
|
||||||
assertTrue(fPDOMManager.joinIndexer(INDEXER_WAIT_TIME, NPM));
|
TestSourceReader.createFile(project.getProject(), "c.cpp", "int c;");
|
||||||
return project;
|
mj.join(); // in order we are sure the indexer task has been scheduled before joining the indexer
|
||||||
|
|
||||||
|
fPDOMManager.setIndexerId(project, IPDOMManager.ID_FAST_INDEXER);
|
||||||
|
assertTrue(fPDOMManager.joinIndexer(INDEXER_WAIT_TIME, NPM));
|
||||||
|
return project;
|
||||||
|
} finally {
|
||||||
|
mj.dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ICProject recreateProject(final String prjName) throws Exception {
|
static class ModelJoiner implements IElementChangedListener {
|
||||||
final boolean[] changed= {false};
|
private boolean[] changed= new boolean[1];
|
||||||
final IElementChangedListener listener = new IElementChangedListener() {
|
|
||||||
public void elementChanged(ElementChangedEvent event) {
|
public ModelJoiner() {
|
||||||
synchronized (changed) {
|
CoreModel.getDefault().addElementChangedListener(this);
|
||||||
changed[0]= true;
|
}
|
||||||
changed.notifyAll();
|
|
||||||
}
|
public void clear() {
|
||||||
|
synchronized (changed) {
|
||||||
|
changed[0]= false;
|
||||||
|
changed.notifyAll();
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
public void join() throws CoreException {
|
||||||
|
try {
|
||||||
|
synchronized(changed) {
|
||||||
|
while(!changed[0]) {
|
||||||
|
changed.wait();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch(InterruptedException ie) {
|
||||||
|
throw new CoreException(CCorePlugin.createStatus("Interrupted", ie));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void dispose() {
|
||||||
|
CoreModel.getDefault().removeElementChangedListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void elementChanged(ElementChangedEvent event) {
|
||||||
|
// Only respond to post change events
|
||||||
|
if (event.getType() != ElementChangedEvent.POST_CHANGE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
synchronized (changed) {
|
||||||
|
changed[0]= true;
|
||||||
|
changed.notifyAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ICProject recreateProject(final String prjName) throws Exception {
|
||||||
final IWorkspace workspace = ResourcesPlugin.getWorkspace();
|
final IWorkspace workspace = ResourcesPlugin.getWorkspace();
|
||||||
CoreModel.getDefault().addElementChangedListener(listener);
|
ModelJoiner pj= new ModelJoiner();
|
||||||
try {
|
try {
|
||||||
final IProject prjHandle= workspace.getRoot().getProject(prjName);
|
final IProject prjHandle= workspace.getRoot().getProject(prjName);
|
||||||
workspace.run(new IWorkspaceRunnable() {
|
workspace.run(new IWorkspaceRunnable() {
|
||||||
|
@ -109,15 +149,9 @@ public class TeamSharedIndexTest extends IndexTestBase {
|
||||||
prjHandle.open(0, NPM);
|
prjHandle.open(0, NPM);
|
||||||
}
|
}
|
||||||
}, null);
|
}, null);
|
||||||
synchronized(changed) {
|
pj.join(); // in order we are sure the indexer task has been scheduled before joining the indexer
|
||||||
if (!changed[0]) {
|
} finally {
|
||||||
changed.wait(INDEXER_WAIT_TIME);
|
pj.dispose();
|
||||||
assertTrue(changed[0]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
CoreModel.getDefault().removeElementChangedListener(listener);
|
|
||||||
}
|
}
|
||||||
fPDOMManager.joinIndexer(INDEXER_WAIT_TIME, NPM);
|
fPDOMManager.joinIndexer(INDEXER_WAIT_TIME, NPM);
|
||||||
return CoreModel.getDefault().create(workspace.getRoot().getProject(prjName));
|
return CoreModel.getDefault().create(workspace.getRoot().getProject(prjName));
|
||||||
|
@ -163,7 +197,7 @@ public class TeamSharedIndexTest extends IndexTestBase {
|
||||||
checkVariable(prj, "c", 0);
|
checkVariable(prj, "c", 0);
|
||||||
|
|
||||||
// delete project
|
// delete project
|
||||||
prj.getProject().delete(false, true, NPM);
|
deleteAndWait(prj);
|
||||||
unregisterProject(prj);
|
unregisterProject(prj);
|
||||||
|
|
||||||
// import project
|
// import project
|
||||||
|
@ -192,7 +226,7 @@ public class TeamSharedIndexTest extends IndexTestBase {
|
||||||
|
|
||||||
// change file
|
// change file
|
||||||
prj.getProject().getFile("a.cpp").setContents(new ByteArrayInputStream("int d;".getBytes()), true, false, NPM);
|
prj.getProject().getFile("a.cpp").setContents(new ByteArrayInputStream("int d;".getBytes()), true, false, NPM);
|
||||||
prj.getProject().delete(false, true, NPM);
|
deleteAndWait(prj);
|
||||||
unregisterProject(prj);
|
unregisterProject(prj);
|
||||||
|
|
||||||
// import project
|
// import project
|
||||||
|
@ -203,6 +237,16 @@ public class TeamSharedIndexTest extends IndexTestBase {
|
||||||
checkVariable(prj, "c", 1);
|
checkVariable(prj, "c", 1);
|
||||||
checkVariable(prj, "d", 1);
|
checkVariable(prj, "d", 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void deleteAndWait(ICProject prj) throws CoreException {
|
||||||
|
ModelJoiner dj= new ModelJoiner();
|
||||||
|
try {
|
||||||
|
prj.getProject().delete(false, true, NPM);
|
||||||
|
dj.join();
|
||||||
|
} finally {
|
||||||
|
dj.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void testExportWithFileChangeFake() throws Exception {
|
public void testExportWithFileChangeFake() throws Exception {
|
||||||
String prjName= "__testExportWithChangeFake__";
|
String prjName= "__testExportWithChangeFake__";
|
||||||
|
@ -220,13 +264,14 @@ public class TeamSharedIndexTest extends IndexTestBase {
|
||||||
fPDOMManager.setIndexerId(prj, FakeIndexer.ID);
|
fPDOMManager.setIndexerId(prj, FakeIndexer.ID);
|
||||||
IndexerPreferences.setScope(prj.getProject(), IndexerPreferences.SCOPE_PROJECT_SHARED);
|
IndexerPreferences.setScope(prj.getProject(), IndexerPreferences.SCOPE_PROJECT_SHARED);
|
||||||
new ProjectScope(prj.getProject()).getNode(CCorePlugin.PLUGIN_ID).flush();
|
new ProjectScope(prj.getProject()).getNode(CCorePlugin.PLUGIN_ID).flush();
|
||||||
|
fPDOMManager.joinIndexer(INDEXER_WAIT_TIME, NPM);
|
||||||
checkVariable(prj, "a", 0);
|
checkVariable(prj, "a", 0);
|
||||||
checkVariable(prj, "b", 0);
|
checkVariable(prj, "b", 0);
|
||||||
checkVariable(prj, "c", 0);
|
checkVariable(prj, "c", 0);
|
||||||
|
|
||||||
// change file
|
// change file
|
||||||
prj.getProject().getFile("a.cpp").setContents(new ByteArrayInputStream("int d;".getBytes()), true, false, NPM);
|
prj.getProject().getFile("a.cpp").setContents(new ByteArrayInputStream("int d;".getBytes()), true, false, NPM);
|
||||||
prj.getProject().delete(false, true, NPM);
|
deleteAndWait(prj);
|
||||||
unregisterProject(prj);
|
unregisterProject(prj);
|
||||||
|
|
||||||
// import project
|
// import project
|
||||||
|
@ -254,7 +299,7 @@ public class TeamSharedIndexTest extends IndexTestBase {
|
||||||
|
|
||||||
// add file
|
// add file
|
||||||
TestSourceReader.createFile(prj.getProject(), "d.cpp", "int d;");
|
TestSourceReader.createFile(prj.getProject(), "d.cpp", "int d;");
|
||||||
prj.getProject().delete(false, true, NPM);
|
deleteAndWait(prj);
|
||||||
unregisterProject(prj);
|
unregisterProject(prj);
|
||||||
|
|
||||||
// import project
|
// import project
|
||||||
|
@ -282,13 +327,14 @@ public class TeamSharedIndexTest extends IndexTestBase {
|
||||||
fPDOMManager.setIndexerId(prj, FakeIndexer.ID);
|
fPDOMManager.setIndexerId(prj, FakeIndexer.ID);
|
||||||
IndexerPreferences.setScope(prj.getProject(), IndexerPreferences.SCOPE_PROJECT_SHARED);
|
IndexerPreferences.setScope(prj.getProject(), IndexerPreferences.SCOPE_PROJECT_SHARED);
|
||||||
new ProjectScope(prj.getProject()).getNode(CCorePlugin.PLUGIN_ID).flush();
|
new ProjectScope(prj.getProject()).getNode(CCorePlugin.PLUGIN_ID).flush();
|
||||||
|
fPDOMManager.joinIndexer(INDEXER_WAIT_TIME, NPM);
|
||||||
checkVariable(prj, "a", 0);
|
checkVariable(prj, "a", 0);
|
||||||
checkVariable(prj, "b", 0);
|
checkVariable(prj, "b", 0);
|
||||||
checkVariable(prj, "c", 0);
|
checkVariable(prj, "c", 0);
|
||||||
|
|
||||||
// add file
|
// add file
|
||||||
TestSourceReader.createFile(prj.getProject(), "d.cpp", "int d;");
|
TestSourceReader.createFile(prj.getProject(), "d.cpp", "int d;");
|
||||||
prj.getProject().delete(false, true, NPM);
|
deleteAndWait(prj);
|
||||||
unregisterProject(prj);
|
unregisterProject(prj);
|
||||||
|
|
||||||
// import project
|
// import project
|
||||||
|
@ -316,7 +362,7 @@ public class TeamSharedIndexTest extends IndexTestBase {
|
||||||
|
|
||||||
// delete file
|
// delete file
|
||||||
prj.getProject().getFile("a.cpp").delete(true, NPM);
|
prj.getProject().getFile("a.cpp").delete(true, NPM);
|
||||||
prj.getProject().delete(false, true, NPM);
|
deleteAndWait(prj);
|
||||||
unregisterProject(prj);
|
unregisterProject(prj);
|
||||||
|
|
||||||
// import project
|
// import project
|
||||||
|
@ -343,13 +389,14 @@ public class TeamSharedIndexTest extends IndexTestBase {
|
||||||
fPDOMManager.setIndexerId(prj, FakeIndexer.ID);
|
fPDOMManager.setIndexerId(prj, FakeIndexer.ID);
|
||||||
IndexerPreferences.setScope(prj.getProject(), IndexerPreferences.SCOPE_PROJECT_SHARED);
|
IndexerPreferences.setScope(prj.getProject(), IndexerPreferences.SCOPE_PROJECT_SHARED);
|
||||||
new ProjectScope(prj.getProject()).getNode(CCorePlugin.PLUGIN_ID).flush();
|
new ProjectScope(prj.getProject()).getNode(CCorePlugin.PLUGIN_ID).flush();
|
||||||
|
fPDOMManager.joinIndexer(INDEXER_WAIT_TIME, NPM);
|
||||||
checkVariable(prj, "a", 0);
|
checkVariable(prj, "a", 0);
|
||||||
checkVariable(prj, "b", 0);
|
checkVariable(prj, "b", 0);
|
||||||
checkVariable(prj, "c", 0);
|
checkVariable(prj, "c", 0);
|
||||||
|
|
||||||
// delete file
|
// delete file
|
||||||
prj.getProject().getFile("a.cpp").delete(true, NPM);
|
prj.getProject().getFile("a.cpp").delete(true, NPM);
|
||||||
prj.getProject().delete(false, true, NPM);
|
deleteAndWait(prj);
|
||||||
unregisterProject(prj);
|
unregisterProject(prj);
|
||||||
|
|
||||||
// import project
|
// import project
|
||||||
|
|
|
@ -108,8 +108,13 @@ public class BaseTestCase extends TestCase {
|
||||||
};
|
};
|
||||||
CCorePlugin.getDefault().getLog().addLogListener(logListener);
|
CCorePlugin.getDefault().getLog().addLogListener(logListener);
|
||||||
|
|
||||||
|
Throwable testThrowable= null;
|
||||||
try {
|
try {
|
||||||
super.runBare();
|
try {
|
||||||
|
super.runBare();
|
||||||
|
} catch(Throwable e) {
|
||||||
|
testThrowable=e;
|
||||||
|
}
|
||||||
|
|
||||||
if(statusLog.size()!=fExpectedLoggedNonOK) {
|
if(statusLog.size()!=fExpectedLoggedNonOK) {
|
||||||
StringBuffer msg= new StringBuffer("Expected number ("+fExpectedLoggedNonOK+") of ");
|
StringBuffer msg= new StringBuffer("Expected number ("+fExpectedLoggedNonOK+") of ");
|
||||||
|
@ -132,6 +137,9 @@ public class BaseTestCase extends TestCase {
|
||||||
} finally {
|
} finally {
|
||||||
CCorePlugin.getDefault().getLog().removeLogListener(logListener);
|
CCorePlugin.getDefault().getLog().removeLogListener(logListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(testThrowable!=null)
|
||||||
|
throw testThrowable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void run( TestResult result ) {
|
public void run( TestResult result ) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue