mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-13 03:05:39 +02:00
Fix tests for cygwin
This commit is contained in:
parent
62117fa551
commit
4d3602121f
1 changed files with 79 additions and 31 deletions
|
@ -11,6 +11,11 @@
|
||||||
package org.eclipse.cdt.tests.dsf.gdb.tests;
|
package org.eclipse.cdt.tests.dsf.gdb.tests;
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
|
||||||
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
|
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
|
||||||
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
|
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
|
||||||
|
@ -57,7 +62,16 @@ import org.junit.runner.RunWith;
|
||||||
@RunWith(BackgroundRunner.class)
|
@RunWith(BackgroundRunner.class)
|
||||||
public class MIRunControlTest extends BaseTestCase {
|
public class MIRunControlTest extends BaseTestCase {
|
||||||
|
|
||||||
private DsfServicesTracker fServicesTracker;
|
/**
|
||||||
|
* The cygwin runtime/emulation spawns a thread, so even the most basic
|
||||||
|
* program has two threads. The tests have to take this into consideration
|
||||||
|
* since the same is not true in other environments (POSIX, MinGW). We
|
||||||
|
* examine the test program and set this flag to true if it uses the cygwin
|
||||||
|
* dll.
|
||||||
|
*/
|
||||||
|
private static boolean sProgramIsCygwin;
|
||||||
|
|
||||||
|
private DsfServicesTracker fServicesTracker;
|
||||||
|
|
||||||
private IGDBControl fGDBCtrl;
|
private IGDBControl fGDBCtrl;
|
||||||
private IMIRunControl fRunCtrl;
|
private IMIRunControl fRunCtrl;
|
||||||
|
@ -103,6 +117,52 @@ public class MIRunControlTest extends BaseTestCase {
|
||||||
public static void beforeClassMethod() {
|
public static void beforeClassMethod() {
|
||||||
setLaunchAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME,
|
setLaunchAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME,
|
||||||
EXEC_PATH + EXEC_NAME);
|
EXEC_PATH + EXEC_NAME);
|
||||||
|
|
||||||
|
// This is crude, but effective. We need to determine if the program was
|
||||||
|
// built with cygwin. The easiest way is to scan the binary file looking
|
||||||
|
// for 'cygwin1.dll'. In the real world, this wouldn't cut mustard, but
|
||||||
|
// since this is just testing code, and we control the programs, it's a
|
||||||
|
// no brainer.
|
||||||
|
if (Platform.getOS().equals(Platform.OS_WIN32)) {
|
||||||
|
|
||||||
|
// This is interesting. Our tests rely on the working directory.
|
||||||
|
// That is, we specify a program path in the launch configuration
|
||||||
|
// that is relative to the working directory.
|
||||||
|
File file = new File(EXEC_PATH + EXEC_NAME);
|
||||||
|
|
||||||
|
FileInputStream fis = null;
|
||||||
|
try {
|
||||||
|
fis = new FileInputStream(file);
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
Assert.fail(e.getLocalizedMessage());
|
||||||
|
return; // needed to avoid warning at fis usage below
|
||||||
|
}
|
||||||
|
|
||||||
|
final String MATCH = "cygwin1.dll";
|
||||||
|
final int MATCH_LEN = MATCH.length();
|
||||||
|
int i = 0;
|
||||||
|
int ch = 0;
|
||||||
|
while (true) {
|
||||||
|
try {
|
||||||
|
ch = fis.read();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Assert.fail("Problem inspecting file to see if it's a cygwin executable : " + e.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
if (ch == -1) { // EOF
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (ch == MATCH.charAt(i)) {
|
||||||
|
if (i == MATCH_LEN - 1) {
|
||||||
|
sProgramIsCygwin = true;
|
||||||
|
break; // found it!
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
i = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -145,24 +205,12 @@ public class MIRunControlTest extends BaseTestCase {
|
||||||
IExecutionDMContext[] ctxts = (IExecutionDMContext[])wait.getReturnInfo();
|
IExecutionDMContext[] ctxts = (IExecutionDMContext[])wait.getReturnInfo();
|
||||||
|
|
||||||
// Context can not be null
|
// Context can not be null
|
||||||
if (ctxts == null)
|
Assert.assertNotNull(ctxts);
|
||||||
Assert.fail("Context returned is null. At least one context should have been returned");
|
Assert.assertEquals("Unexpected number of threads for a simple program", ctxts.length, sProgramIsCygwin ? 2 : 1);
|
||||||
else {
|
|
||||||
if (Platform.getOS().equals(Platform.OS_WIN32)) {
|
|
||||||
// If the target app was built with cygwin, there will be two
|
|
||||||
// threads--even for the most simple program. Apparently,
|
|
||||||
// something the cygwin runtime/emulation needs.
|
|
||||||
Assert.assertTrue("Context returned should not be more than 2. This test case is for single context application.", 1 <= ctxts.length && ctxts.length <= 2);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Only one Context in this case
|
|
||||||
Assert.assertTrue("Context returned should not be more than 1. This test case is for single context application.", ctxts.length == 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
IMIExecutionDMContext dmc = (IMIExecutionDMContext) ctxts[0];
|
IMIExecutionDMContext dmc = (IMIExecutionDMContext) ctxts[0];
|
||||||
// Thread id for the main thread should be one
|
// Thread id for the main thread should be one
|
||||||
Assert.assertEquals(1, dmc.getThreadId());
|
Assert.assertEquals(1, dmc.getThreadId());
|
||||||
}
|
|
||||||
wait.waitReset();
|
wait.waitReset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -214,9 +262,7 @@ public class MIRunControlTest extends BaseTestCase {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((IMIExecutionDMContext)startedEvent.getDMContext()).getThreadId() != 2)
|
Assert.assertEquals("Thread created event is for wrong thread id", ((IMIExecutionDMContext)startedEvent.getDMContext()).getThreadId(), sProgramIsCygwin ? 3 : 2);
|
||||||
Assert.fail("Thread create event has failed expected thread id 2 but got " +
|
|
||||||
((IMIExecutionDMContext)startedEvent.getDMContext()).getThreadId());
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Test getExecutionContexts for a valid container DMC
|
* Test getExecutionContexts for a valid container DMC
|
||||||
|
@ -239,16 +285,18 @@ public class MIRunControlTest extends BaseTestCase {
|
||||||
/*
|
/*
|
||||||
* Contexts returned can not be null
|
* Contexts returned can not be null
|
||||||
*/
|
*/
|
||||||
if(data == null)
|
Assert.assertNotNull(data);
|
||||||
Assert.fail("No context returned. 2 Contexts with id 1 & 2 should have been returned");
|
|
||||||
else{
|
Assert.assertEquals("Unexpected number of threads", data.length, sProgramIsCygwin ? 3 : 2);
|
||||||
// 2 Contexts shd be returned
|
IMIExecutionDMContext dmc1 = (IMIExecutionDMContext)data[0];
|
||||||
Assert.assertTrue(data.length==2);
|
IMIExecutionDMContext dmc2 = (IMIExecutionDMContext)data[1];
|
||||||
IMIExecutionDMContext dmc1 = (IMIExecutionDMContext)data[0];
|
// Context ids should be 1 & 2
|
||||||
IMIExecutionDMContext dmc2 = (IMIExecutionDMContext)data[1];
|
Assert.assertTrue(dmc1.getThreadId()==1 && dmc2.getThreadId() == 2);
|
||||||
// Context ids should be 1 & 2
|
|
||||||
Assert.assertTrue(dmc1.getThreadId()==1 && dmc2.getThreadId() == 2);
|
if (sProgramIsCygwin) {
|
||||||
}
|
IMIExecutionDMContext dmc3 = (IMIExecutionDMContext)data[2];
|
||||||
|
Assert.assertTrue(dmc3.getThreadId()== 3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue