eclipse-platform / eclipse.platform.swt

Eclipse SWT
https://www.eclipse.org/swt/
Eclipse Public License 2.0
105 stars 125 forks source link

Several tests in "org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text" are flapping #106

Open laeubi opened 2 years ago

laeubi commented 2 years ago

The test fails from one build to the other without any SWT code changes.

SyntevoAlex commented 1 year 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.

basilevs commented 6 months ago

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)
fedejeanne commented 1 month ago

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)
...