mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-22 22:22:11 +02:00
Make stand-alone debugger SWTBot test more robust
- Wait until binary file exists after building instead of sleep - Replace waiting loop with waitUntil methods with bigger timeouts - Replace menu detection with faster and more reliable method: - Find menu items in specific shell - Use waitUntil with small timeout to detect absent menu items Change-Id: I5239fa5dab9e091936addf6ceb9ef05095d23bd3 Signed-off-by: Marc-Andre Laperle <marc-andre.laperle@ericsson.com>
This commit is contained in:
parent
869801b95b
commit
6e98f402bd
2 changed files with 63 additions and 83 deletions
|
@ -10,17 +10,19 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.debug.application.tests;
|
||||
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
|
||||
import org.eclipse.swtbot.swt.finder.SWTBot;
|
||||
import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
|
||||
import org.eclipse.swtbot.swt.finder.waits.Conditions;
|
||||
import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
|
||||
import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
|
||||
import org.junit.After;
|
||||
|
||||
public abstract class StandaloneTest {
|
||||
|
||||
private static final String C_C_STAND_ALONE_DEBUGGER_TITLE = "Eclipse C/C++ Stand-alone Debugger";
|
||||
private static final String DEBUG_NEW_EXECUTABLE_TITLE = "Debug New Executable";
|
||||
protected static SWTBot bot;
|
||||
protected static String projectName;
|
||||
protected static SWTBotShell mainShell;
|
||||
|
@ -28,45 +30,22 @@ public abstract class StandaloneTest {
|
|||
|
||||
public static void init(String projectName) throws Exception {
|
||||
SWTBotPreferences.KEYBOARD_LAYOUT = "EN_US";
|
||||
SWTBotPreferences.TIMEOUT = 20000;
|
||||
|
||||
Utilities.getDefault().buildProject(projectName);
|
||||
bot = new SWTBot();
|
||||
Utilities.getDefault().buildProject(projectName);
|
||||
final IPath executablePath = Utilities.getDefault().getProjectPath(projectName).append("a.out"); // $NON-NLS-1$
|
||||
bot.waitUntil(new WaitForFileCondition(executablePath));
|
||||
|
||||
SWTBotShell executableShell = null;
|
||||
for (int i = 0, attempts = 100; i < attempts; i++) {
|
||||
for (SWTBotShell shell : bot.shells()) {
|
||||
if (shell.getText().contains("Debug New Executable")) {
|
||||
executableShell = shell;
|
||||
shell.setFocus();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (executableShell != null)
|
||||
break;
|
||||
bot.sleep(10);
|
||||
}
|
||||
|
||||
IPath executablePath = Utilities.getDefault().getProjectPath(projectName).append("a.out"); // $NON-NLS-1$
|
||||
bot.waitUntil(Conditions.shellIsActive(DEBUG_NEW_EXECUTABLE_TITLE));
|
||||
SWTBotShell executableShell = bot.shell(DEBUG_NEW_EXECUTABLE_TITLE);
|
||||
executableShell.setFocus();
|
||||
|
||||
executableShell.bot().textWithLabel("Binary: ").typeText(executablePath.toOSString());
|
||||
bot.sleep(2000);
|
||||
|
||||
executableShell.bot().button("OK").click();
|
||||
|
||||
mainShell = null;
|
||||
for (int i = 0, attempts = 100; i < attempts; i++) {
|
||||
for (SWTBotShell shell : bot.shells()) {
|
||||
if (shell.getText().contains("C/C++ Stand-alone Debugger")) {
|
||||
mainShell = shell;
|
||||
shell.setFocus();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (mainShell != null)
|
||||
break;
|
||||
bot.sleep(10);
|
||||
}
|
||||
assertNotNull(mainShell);
|
||||
bot.waitUntil(Conditions.shellIsActive(C_C_STAND_ALONE_DEBUGGER_TITLE));
|
||||
mainShell = bot.shell(C_C_STAND_ALONE_DEBUGGER_TITLE);
|
||||
}
|
||||
|
||||
@After
|
||||
|
@ -92,4 +71,21 @@ public abstract class StandaloneTest {
|
|||
// mainShell.activate();
|
||||
}
|
||||
|
||||
private static final class WaitForFileCondition extends DefaultCondition {
|
||||
private final IPath executablePath;
|
||||
|
||||
private WaitForFileCondition(IPath executablePath) {
|
||||
this.executablePath = executablePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean test() throws Exception {
|
||||
return executablePath.toFile().exists();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFailureMessage() {
|
||||
return "Could not find executable after build.";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,15 +10,20 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.debug.application.tests;
|
||||
|
||||
import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withMnemonic;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
|
||||
import org.eclipse.swt.widgets.MenuItem;
|
||||
import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
|
||||
import org.eclipse.swtbot.swt.finder.waits.Conditions;
|
||||
import org.eclipse.swtbot.swt.finder.waits.WaitForObjectCondition;
|
||||
import org.eclipse.swtbot.swt.finder.widgets.SWTBotMenu;
|
||||
import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
|
||||
import org.eclipse.swtbot.swt.finder.widgets.SWTBotText;
|
||||
import org.eclipse.swtbot.swt.finder.widgets.TimeoutException;
|
||||
import org.hamcrest.Matcher;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
@ -37,57 +42,25 @@ public class StandaloneTest1 extends StandaloneTest {
|
|||
@Test
|
||||
public void Test1() throws Exception {
|
||||
// Verify the top-level menus are there
|
||||
SWTBotMenu fileMenu = bot.menu("File");
|
||||
SWTBotMenu fileMenu = mainShell.menu().menu("File");
|
||||
assertNotNull(fileMenu);
|
||||
SWTBotMenu editMenu = bot.menu("Edit");
|
||||
SWTBotMenu editMenu = mainShell.menu().menu("Edit");
|
||||
assertNotNull(editMenu);
|
||||
SWTBotMenu searchMenu = bot.menu("Search");
|
||||
SWTBotMenu searchMenu = mainShell.menu().menu("Search");
|
||||
assertNotNull(searchMenu);
|
||||
SWTBotMenu runMenu = bot.menu("Run");
|
||||
SWTBotMenu runMenu = mainShell.menu().menu("Run");
|
||||
assertNotNull(runMenu);
|
||||
SWTBotMenu windowMenu = bot.menu("Window");
|
||||
SWTBotMenu windowMenu = mainShell.menu().menu("Window");
|
||||
assertNotNull(windowMenu);
|
||||
SWTBotMenu helpMenu = bot.menu("Help");
|
||||
SWTBotMenu helpMenu = mainShell.menu().menu("Help");
|
||||
assertNotNull(helpMenu);
|
||||
|
||||
// Verify other common top-level menus are not there
|
||||
SWTBotMenu notThere = null;
|
||||
try {
|
||||
notThere = bot.menu("Navigate");
|
||||
} catch (WidgetNotFoundException e) {
|
||||
// correct
|
||||
}
|
||||
assertNull(notThere);
|
||||
try {
|
||||
notThere = bot.menu("Refactor");
|
||||
} catch (WidgetNotFoundException e) {
|
||||
// correct
|
||||
}
|
||||
assertNull(notThere);
|
||||
try {
|
||||
notThere = bot.menu("Source");
|
||||
} catch (WidgetNotFoundException e) {
|
||||
// correct
|
||||
}
|
||||
assertNull(notThere);
|
||||
try {
|
||||
notThere = bot.menu("Target");
|
||||
} catch (WidgetNotFoundException e) {
|
||||
// correct
|
||||
}
|
||||
assertNull(notThere);
|
||||
try {
|
||||
// We want to prove there isn't a top-level Project menu
|
||||
// There happens to be a lower-level Project menu from the Text menu
|
||||
// Verify we find it, but no other menus named Project
|
||||
SWTBotMenu textMenu = bot.menu("Text");
|
||||
@SuppressWarnings("unused")
|
||||
SWTBotMenu projectMenu = textMenu.menu("Project");
|
||||
notThere = bot.menu("Project", 1);
|
||||
} catch (WidgetNotFoundException e) {
|
||||
// correct
|
||||
}
|
||||
assertNull(notThere);
|
||||
assertMenuAbsent(mainShell, "Navigate");
|
||||
assertMenuAbsent(mainShell, "Refactor");
|
||||
assertMenuAbsent(mainShell, "Source");
|
||||
assertMenuAbsent(mainShell, "Target");
|
||||
assertMenuAbsent(mainShell, "Project");
|
||||
|
||||
SWTBotMenu attachExecutableDialog = fileMenu.menu("Debug Attached Executable...");
|
||||
assertNotNull(attachExecutableDialog);
|
||||
|
@ -104,7 +77,7 @@ public class StandaloneTest1 extends StandaloneTest {
|
|||
shell.bot().textWithLabel("Arguments: ").setText("1 2 3");
|
||||
bot.sleep(2000);
|
||||
|
||||
bot.button("OK").click();
|
||||
shell.bot().button("OK").click();
|
||||
|
||||
bot.sleep(1000);
|
||||
|
||||
|
@ -121,10 +94,10 @@ public class StandaloneTest1 extends StandaloneTest {
|
|||
|
||||
bot.sleep(2000);
|
||||
|
||||
bot.button("Cancel").click();
|
||||
shell.bot().button("Cancel").click();
|
||||
|
||||
bot.sleep(2000);
|
||||
|
||||
|
||||
SWTBotMenu exitMenu = fileMenu.menu("Exit");
|
||||
assertNotNull(exitMenu);
|
||||
exitMenu.click();
|
||||
|
@ -135,5 +108,16 @@ public class StandaloneTest1 extends StandaloneTest {
|
|||
bot.sleep(1000);
|
||||
}
|
||||
|
||||
|
||||
private void assertMenuAbsent(SWTBotShell shell, String menuText) {
|
||||
boolean found = false;
|
||||
try {
|
||||
final Matcher<MenuItem> matcher = withMnemonic(menuText);
|
||||
WaitForObjectCondition<MenuItem> waitForMenuItem = Conditions.waitForMenuItem(shell.menu(), matcher, false, 0);
|
||||
bot.waitUntil(waitForMenuItem, 50);
|
||||
found = true;
|
||||
} catch (TimeoutException e) {
|
||||
// correct
|
||||
}
|
||||
assertFalse(found);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue