eclipse.platform.swt icon indicating copy to clipboard operation
eclipse.platform.swt copied to clipboard

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

Open laeubi opened this issue 3 years ago • 3 comments
trafficstars

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

laeubi avatar May 09 '22 07:05 laeubi

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.

SyntevoAlex avatar Jul 04 '23 21:07 SyntevoAlex

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)

basilevs avatar Jan 27 '24 00:01 basilevs

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

fedejeanne avatar Jun 18 '24 08:06 fedejeanne

Can this also be closed? As i see the tests pass now

<testcase classname="org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text" name="test_cut" time="0.015"/>
<testcase classname="org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text" name="test_consistency_Segments" time="0.073"/>
<testcase classname="org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text" name="test_copy" time="0.016"/>
<testcase classname="org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Text" name="test_paste" time="0.022"/>
<testcase classname="org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo" name="test_consistency_Segments" time="0.053"/>
<testcase classname="org.eclipse.swt.tests.junit.Test_org_eclipse_swt_widgets_Combo" name="test_copy" time="0.006"/>
<testcase classname="org.eclipse.swt.tests.junit.Test_org_eclipse_swt_custom_CCombo" name="test_cut" time="0.006"/>

From -> https://download.eclipse.org/eclipse/downloads/drops4/I20250108-1800/testresults/xml/org.eclipse.swt.tests_ep435I-unit-win32-x86_64-java21_win32.win32.x86_64_21.xml

deepika-u avatar Jan 09 '25 11:01 deepika-u

The problem seems to be there still:

image

Or do you know of any fix @deepika-u ?

To reproduce

Let the test class run hundreds of times by making it parameterized

@RunWith(Parameterized.class)
public class Test_org_eclipse_swt_widgets_Text extends Test_org_eclipse_swt_widgets_Scrollable {

...

@Parameters
public static Collection<Integer> params() {
	return  IntStream.range(1, 301).boxed().collect(Collectors.toList());
}

public Test_org_eclipse_swt_widgets_Text(Integer i) { }
...
}

fedejeanne avatar Jan 13 '25 08:01 fedejeanne