Skip to content

Commit d47098a

Browse files
committed
[GTK3] Test Tree crash in SetData event
The failure only happens in Ubuntu 24 (GTK 3.24.41)
1 parent e6588c2 commit d47098a

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_widgets_Tree.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
*******************************************************************************/
1414
package org.eclipse.swt.tests.junit;
1515

16+
import static java.lang.System.currentTimeMillis;
1617
import static org.junit.Assert.assertArrayEquals;
1718
import static org.junit.Assert.assertEquals;
1819
import static org.junit.Assert.assertFalse;
@@ -27,6 +28,7 @@
2728
import org.eclipse.swt.SWT;
2829
import org.eclipse.swt.events.TreeListener;
2930
import org.eclipse.swt.graphics.Color;
31+
import org.eclipse.swt.graphics.Image;
3032
import org.eclipse.swt.layout.FillLayout;
3133
import org.eclipse.swt.widgets.Display;
3234
import org.eclipse.swt.widgets.Event;
@@ -967,6 +969,56 @@ public void test_Virtual() {
967969
dataCounter[0] > visibleCount / 2 && dataCounter[0] <= visibleCount * 3);
968970
}
969971

972+
/** Ensure setText() and setImage() can be set from SetData handler.
973+
@see https://github.com/eclipse-platform/eclipse.platform.swt/issues/678
974+
**/
975+
@Test
976+
public void test_setData() {
977+
tree.dispose();
978+
Image image = new Image(Display.getCurrent(), 20, 20);
979+
try {
980+
shell.setSize(200, 200);
981+
shell.setLayout(new FillLayout());
982+
shell.open();
983+
waitUntilIdle();
984+
for (int i = 0; i < 200; i++) {
985+
Tree tree = new Tree(shell, SWT.VIRTUAL);
986+
tree.addListener(SWT.SetData, e -> {
987+
TreeItem item = (TreeItem) e.item;
988+
item.setText(0, "A");
989+
item.setImage(image); // <-- this is the critical line!
990+
});
991+
tree.setItemCount(1);
992+
993+
waitUntilIdle(); // may crash while processing asynchronous events
994+
995+
assertEquals("A", tree.getItem(0).getText(0));
996+
assertEquals(image, tree.getItem(0).getImage());
997+
tree.dispose();
998+
}
999+
} finally {
1000+
image.dispose();
1001+
}
1002+
}
1003+
1004+
private void waitUntilIdle() {
1005+
long lastActive = currentTimeMillis();
1006+
while (true) {
1007+
if (Thread.interrupted()) {
1008+
throw new AssertionError();
1009+
}
1010+
if (Display.getCurrent().readAndDispatch()) {
1011+
lastActive = currentTimeMillis();
1012+
} else {
1013+
if (lastActive + 10 < currentTimeMillis()) {
1014+
return;
1015+
}
1016+
Thread.yield();
1017+
}
1018+
}
1019+
}
1020+
1021+
9701022
@Test
9711023
public void test_emptinessChanged() {
9721024
int NOT_EMPTY = 0;
@@ -1182,4 +1234,6 @@ public void test_setItemCount_itemCount2() {
11821234
});
11831235
}
11841236

1237+
1238+
11851239
}

0 commit comments

Comments
 (0)