-
Notifications
You must be signed in to change notification settings - Fork 133
WIP: SWTBot test case: Debug flow Test #795
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,265 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /******************************************************************************* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Copyright 2025 Espressif Systems (Shanghai) PTE LTD. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * All rights reserved. Use is subject to license terms. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| *******************************************************************************/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| package com.espressif.idf.ui.test.executable.cases.project; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import static org.eclipse.swtbot.swt.finder.waits.Conditions.widgetIsEnabled; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import static org.junit.Assert.assertTrue; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.io.IOException; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.util.Arrays; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import java.util.Optional; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.apache.commons.lang3.SystemUtils; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.eclipse.swtbot.swt.finder.widgets.SWTBotCheckBox; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.junit.After; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.junit.BeforeClass; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.junit.FixMethodOrder; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.junit.Test; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.junit.runner.RunWith; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import org.junit.runners.MethodSorters; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import com.espressif.idf.ui.test.common.WorkBenchSWTBot; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import com.espressif.idf.ui.test.common.utility.TestWidgetWaitUtility; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import com.espressif.idf.ui.test.operations.EnvSetupOperations; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import com.espressif.idf.ui.test.operations.ProjectTestOperations; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import com.espressif.idf.ui.test.operations.selectors.LaunchBarConfigSelector; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import com.espressif.idf.ui.test.operations.selectors.LaunchBarTargetSelector; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Test class to test Debug Process | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * @author Andrii Filippov | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| */ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @SuppressWarnings("restriction") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @RunWith(SWTBotJunit4ClassRunner.class) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @FixMethodOrder(MethodSorters.NAME_ASCENDING) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public class IDFProjectDebugProcessTest | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @BeforeClass | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public static void beforeTestClass() throws Exception | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Fixture.loadEnv(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @After | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public void afterEachTest() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| try | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Fixture.cleanTestEnv(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| catch (Exception e) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| System.err.println("Error during cleanup: " + e.getMessage()); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| @Test | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public void givenNewProjectCreatedWhenFlashedAndDebuggedThenDebuggingWorks() throws Exception | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (SystemUtils.IS_OS_LINUX) // temporary solution until new ESP boards arrive for Windows | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Fixture.givenNewEspressifIDFProjectIsSelected("EspressIf", "Espressif IDF Project"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Fixture.givenProjectNameIs("NewProjecDebugTest"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Fixture.givenProjectNameIs("NewProjecDebugTest"); | |
| Fixture.givenProjectNameIs("NewProjectDebugTest"); |
🤖 Prompt for AI Agents
In
tests/com.espressif.idf.ui.test/src/com/espressif/idf/ui/test/executable/cases/project/IDFProjectDebugProcessTest.java
around line 69, the project name string has a typo "NewProjecDebugTest"; update
the string literal to "NewProjectDebugTest" so the fixture uses the correctly
spelled project name.
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Debug view item match is wrong (missing space before “Debug”)
The code looks for “NameDebug [...]” but the configuration is named “Name Debug”. This will never match.
- .filter(i -> i.getText().equals(projectName + "Debug [ESP-IDF GDB OpenOCD Debugging]")).findFirst();
+ .filter(i -> i.getText().contains(projectName + " Debug")
+ && i.getText().contains("[ESP-IDF GDB OpenOCD Debugging]"))
+ .findFirst();📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| Optional<SWTBotTreeItem> project = Arrays.asList(items).stream() | |
| .filter(i -> i.getText().equals(projectName + "Debug [ESP-IDF GDB OpenOCD Debugging]")).findFirst(); | |
| if (project.isPresent()) | |
| Optional<SWTBotTreeItem> project = Arrays.asList(items).stream() | |
| .filter(i -> i.getText().contains(projectName + " Debug") | |
| && i.getText().contains("[ESP-IDF GDB OpenOCD Debugging]")) | |
| .findFirst(); | |
| if (project.isPresent()) |
🤖 Prompt for AI Agents
In
tests/com.espressif.idf.ui.test/src/com/espressif/idf/ui/test/executable/cases/project/IDFProjectDebugProcessTest.java
around lines 216-218, the filter checks for projectName + "Debug [ESP-IDF GDB
OpenOCD Debugging]" which is missing a space and will never match the actual
item label; update the match to include the space (projectName + " Debug
[ESP-IDF GDB OpenOCD Debugging]") or alternatively use a more robust check such
as contains or startsWith with the projectName and "Debug" to avoid exact
spacing issues.
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Process presence check uses Windows “.exe” on a Linux‑only path and inverted logic
On Linux there’s no “.exe”. Also, using isFileAbsent and then negating only at the end obscures intent.
- boolean openOCDexe = ProjectTestOperations.isFileAbsent(projectItem, "openocd.exe");
- boolean GDBexe = ProjectTestOperations.isFileAbsent(projectItem, "riscv32-esp-elf-gdb.exe");
- if (openOCDexe || GDBexe)
- {
- return false;
- }
- return true;
+ final String openocdName = SystemUtils.IS_OS_WINDOWS ? "openocd.exe" : "openocd";
+ // Support both Xtensa and RISC‑V toolchains
+ final String[] gdbCandidates = SystemUtils.IS_OS_WINDOWS
+ ? new String[] {"xtensa-esp32-elf-gdb.exe", "xtensa-esp32s2-elf-gdb.exe",
+ "xtensa-esp32s3-elf-gdb.exe", "riscv32-esp-elf-gdb.exe"}
+ : new String[] {"xtensa-esp32-elf-gdb", "xtensa-esp32s2-elf-gdb",
+ "xtensa-esp32s3-elf-gdb", "riscv32-esp-elf-gdb"};
+
+ boolean openocdPresent = !ProjectTestOperations.isFileAbsent(projectItem, openocdName);
+ boolean gdbPresent = false;
+ for (String gdb : gdbCandidates) {
+ if (!ProjectTestOperations.isFileAbsent(projectItem, gdb)) {
+ gdbPresent = true;
+ break;
+ }
+ }
+ return openocdPresent && gdbPresent;📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| private static boolean checkifOpenOCDandGDBprocessesArePresent() | |
| { | |
| SWTBotTreeItem projectItem = fetchProjectFromDebugView(); | |
| if (projectItem != null) | |
| { | |
| projectItem.select(); | |
| boolean openOCDexe = ProjectTestOperations.isFileAbsent(projectItem, "openocd.exe"); | |
| boolean GDBexe = ProjectTestOperations.isFileAbsent(projectItem, "riscv32-esp-elf-gdb.exe"); | |
| if (openOCDexe || GDBexe) | |
| { | |
| return false; | |
| } | |
| return true; | |
| } | |
| return false; | |
| private static boolean checkifOpenOCDandGDBprocessesArePresent() | |
| { | |
| SWTBotTreeItem projectItem = fetchProjectFromDebugView(); | |
| if (projectItem != null) | |
| { | |
| projectItem.select(); | |
| final String openocdName = SystemUtils.IS_OS_WINDOWS ? "openocd.exe" : "openocd"; | |
| // Support both Xtensa and RISC-V toolchains | |
| final String[] gdbCandidates = SystemUtils.IS_OS_WINDOWS | |
| ? new String[] {"xtensa-esp32-elf-gdb.exe", "xtensa-esp32s2-elf-gdb.exe", | |
| "xtensa-esp32s3-elf-gdb.exe", "riscv32-esp-elf-gdb.exe"} | |
| : new String[] {"xtensa-esp32-elf-gdb", "xtensa-esp32s2-elf-gdb", | |
| "xtensa-esp32s3-elf-gdb", "riscv32-esp-elf-gdb"}; | |
| boolean openocdPresent = !ProjectTestOperations.isFileAbsent(projectItem, openocdName); | |
| boolean gdbPresent = false; | |
| for (String gdb : gdbCandidates) { | |
| if (!ProjectTestOperations.isFileAbsent(projectItem, gdb)) { | |
| gdbPresent = true; | |
| break; | |
| } | |
| } | |
| return openocdPresent && gdbPresent; | |
| } | |
| return false; | |
| } |
🤖 Prompt for AI Agents
In
tests/com.espressif.idf.ui.test/src/com/espressif/idf/ui/test/executable/cases/project/IDFProjectDebugProcessTest.java
around lines 226 to 241, the process presence check incorrectly looks for
Windows “.exe” filenames on a Linux-only path and uses inverted/obscured logic
by calling isFileAbsent then negating at the end; change the checks to use the
Linux binary names (remove “.exe”, e.g. "openocd" and "riscv32-esp-elf-gdb") and
simplify logic so you directly test presence (either call an isFilePresent
method or immediately return false if isFileAbsent(...) is true), returning true
only when both binaries are found. Ensure the method returns false early if
either file is missing and true otherwise.
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Terminate via Debug view, not Project Explorer context
The helper launches a Project Explorer context menu, which won’t target the active debug session. Use the Debug view’s toolbar or context menu on the session node.
- ProjectTestOperations.launchCommandUsingContextMenu(projectName + "Debug [ESP-IDF GDB OpenOCD Debugging]",
- bot, "Terminate/Disconnect All");
- bot.sleep(10000);
- ProjectTestOperations.findInConsole(bot, "IDF Process Console", "dropped 'gdb'");
+ SWTBotView debugView = bot.viewByTitle("Debug");
+ debugView.show();
+ debugView.setFocus();
+ SWTBotTreeItem item = fetchProjectFromDebugView();
+ if (item != null) {
+ item.select();
+ // Prefer toolbar; fallback to context menu label if needed
+ try {
+ debugView.toolbarButton("Terminate").click();
+ } catch (Exception e) {
+ item.contextMenu("Terminate/Disconnect All").click();
+ }
+ ProjectTestOperations.findInConsole(bot, "IDF Process Console", "dropped 'gdb'");
+ }
TestWidgetWaitUtility.waitForOperationsInProgressToFinishSync(bot);Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In
tests/com.espressif.idf.ui.test/src/com/espressif/idf/ui/test/executable/cases/project/IDFProjectDebugProcessTest.java
around lines 249-256, the test currently uses Project Explorer context menu
which doesn't target the active debug session; instead open the Debug view,
locate the running debug session node matching projectName + "Debug [ESP-IDF GDB
OpenOCD Debugging]" and invoke the "Terminate/Disconnect All" action via the
Debug view toolbar or the session node's context menu; keep the subsequent
bot.sleep, console check for "dropped 'gdb'", and wait-for-operations sync but
replace the ProjectTestOperations.launchCommandUsingContextMenu call with a
Debug-view-specific action (or add a helper that selects the Debug view, finds
the session node, and triggers the terminate action).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Category label typo will break the wizard selection
"EspressIf" should be "Espressif" to match the UI category and avoid widget lookup failures.
📝 Committable suggestion
🤖 Prompt for AI Agents