Open laeubi opened 2 years ago
I have investigated that.
All clipboard-related tests can fail, I myself seen these:
Test_org_eclipse_swt_widgets_Text.test_consistency_Segments
Test_org_eclipse_swt_widgets_Text.test_copy
Test_org_eclipse_swt_widgets_Text.test_paste
Test_org_eclipse_swt_widgets_Combo.test_consistency_Segments
Test_org_eclipse_swt_widgets_Combo.test_copy
Test_org_eclipse_swt_custom_CCombo.test_cut
The failure is chance based, with around 1% chance.
It's easy to reproduce by running this code:
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout (new GridLayout (1, true));
Text text = new Text(shell, 0);
System.out.format("%X = handle%n", text.handle);
shell.pack();
shell.open();
while (display.readAndDispatch()) {};
for (int i = 0; i < 10000; i++) {
text.setText("01234567890");
text.setSelection(2, 5);
text.cut();
if (!text.getText().equals("01567890")) {
System.out.println("Error!");
}
}
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
I have debugged, the problem is that OpenClipboard()
fails inside WINAPI handler for messages like WM_COPY
or WM_CUT
. Can be seen with WinDBG breakpoint: bp win32u!NtUserOpenClipboard+0x14 ".if (@rax == 1) {g}"
.
I'm not exactly sure what causes the failure. It doesn't make sense that some other app repeatedly claims ownership of clipboard, but maybe that is indeed the case. Maybe when SWT copies something to clipboard, some other app checks that, and if SWT tries to copy again while app is checking, it fails. Getting a definitive answer would require kernel debugging, and I don't think the Issue is important enough to spend time on that.
https://github.com/eclipse-platform/eclipse.platform.swt/actions/runs/7674714373/job/20919789301
org.junit.ComparisonFailure: expected:<[00000]> but was:<[]>
at org.junit.Assert.assertEquals(Assert.java:117)
at org.junit.Assert.assertEquals(Assert.java:146)
at org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text.test_copy(Test_org_eclipse_swt_widgets_Text.java:324)
Also failed in this run of #1265
expected:<[00000]> but was:<[]>
org.junit.ComparisonFailure: expected:<[00000]> but was:<[]>
at org.junit.Assert.assertEquals(Assert.java:117)
at org.junit.Assert.assertEquals(Assert.java:146)
at org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text.test_copy(Test_org_eclipse_swt_widgets_Text.java:343)
...
The test fails from one build to the other without any SWT code changes.