Skip to content

Commit 8b12c48

Browse files
trancexpressiloveeclipse
authored andcommitted
Wait for thread name job in ThreadNameChangeTests.testListenToThreadNameChange
Fixes: #719
1 parent 7a450bf commit 8b12c48

File tree

1 file changed

+41
-27
lines changed

1 file changed

+41
-27
lines changed

org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/breakpoints/ThreadNameChangeTests.java

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515

1616
import java.util.ArrayList;
1717
import java.util.Arrays;
18+
import java.util.Collections;
1819
import java.util.List;
1920
import java.util.Optional;
20-
import java.util.concurrent.atomic.AtomicReference;
2121
import java.util.function.Predicate;
2222
import java.util.stream.Collectors;
2323
import java.util.stream.Stream;
@@ -62,13 +62,8 @@ public void testListenToThreadNameChange() throws Exception {
6262
IJavaLineBreakpoint bp2 = createLineBreakpoint(bpLine2, "", typeName + ".java", typeName);
6363
bp1.setSuspendPolicy(IJavaBreakpoint.SUSPEND_THREAD);
6464
bp2.setSuspendPolicy(IJavaBreakpoint.SUSPEND_THREAD);
65-
AtomicReference<List<DebugEvent>> events = new AtomicReference<>(new ArrayList<>());
66-
IDebugEventSetListener listener = new IDebugEventSetListener() {
67-
@Override
68-
public void handleDebugEvents(DebugEvent[] e) {
69-
events.get().addAll(Arrays.asList(e));
70-
}
71-
};
65+
66+
DebugListener listener = new DebugListener();
7267
DebugPlugin.getDefault().addDebugEventListener(listener);
7368
IJavaThread thread = null;
7469
try {
@@ -78,13 +73,19 @@ public void handleDebugEvents(DebugEvent[] e) {
7873
// expect that thread with name "1" is started
7974
IThread second = findThread(thread, "1");
8075
assertNotNull(second);
81-
events.get().clear();
76+
listener.clearEvents();
8277

8378
resumeToLineBreakpoint(thread, bp2);
84-
TestUtil.waitForJobs(getName(), 1000, 3000);
79+
TestUtil.waitForJobs(getName(), 100, 3000);
8580

8681
// expect one single "CHANGE" event for second thread
87-
List<DebugEvent> changeEvents = getStateChangeEvents(events, second);
82+
List<DebugEvent> changeEvents = Collections.emptyList();
83+
long start = System.currentTimeMillis();
84+
while (changeEvents.isEmpty() && System.currentTimeMillis() - start <= DEFAULT_TIMEOUT) {
85+
changeEvents = listener.getStateChangeEvents(second);
86+
TestUtil.runEventLoop();
87+
Thread.sleep(50);
88+
}
8889
assertEquals("unexpected number of events: " + changeEvents, 1, changeEvents.size());
8990

9091
// expect that thread name is changed to "2"
@@ -111,13 +112,7 @@ public void testListenToThreadNameChangeDisabled() throws Exception {
111112
IJavaLineBreakpoint bp2 = createLineBreakpoint(bpLine2, "", typeName + ".java", typeName);
112113
bp1.setSuspendPolicy(IJavaBreakpoint.SUSPEND_THREAD);
113114
bp2.setSuspendPolicy(IJavaBreakpoint.SUSPEND_THREAD);
114-
AtomicReference<List<DebugEvent>> events = new AtomicReference<>(new ArrayList<>());
115-
IDebugEventSetListener listener = new IDebugEventSetListener() {
116-
@Override
117-
public void handleDebugEvents(DebugEvent[] e) {
118-
events.get().addAll(Arrays.asList(e));
119-
}
120-
};
115+
DebugListener listener = new DebugListener();
121116
DebugPlugin.getDefault().addDebugEventListener(listener);
122117
IJavaThread thread = null;
123118
try {
@@ -127,13 +122,13 @@ public void handleDebugEvents(DebugEvent[] e) {
127122
// expect that thread with name "1" is started
128123
IThread second = findThread(thread, "1");
129124
assertNotNull(second);
130-
events.get().clear();
125+
listener.clearEvents();
131126

132127
resumeToLineBreakpoint(thread, bp2);
133128
TestUtil.waitForJobs(getName(), 100, 3000);
134129

135130
// expect no "CHANGE" events
136-
List<DebugEvent> changeEvents = getStateChangeEvents(events, second);
131+
List<DebugEvent> changeEvents = listener.getStateChangeEvents(second);
137132
assertEquals("expected no events, instead got: " + changeEvents, 0, changeEvents.size());
138133

139134
// expect that thread name is changed to "2"
@@ -147,13 +142,6 @@ public void handleDebugEvents(DebugEvent[] e) {
147142
}
148143
}
149144

150-
private List<DebugEvent> getStateChangeEvents(AtomicReference<List<DebugEvent>> events, IThread second) {
151-
List<DebugEvent> list = events.get();
152-
Stream<DebugEvent> filtered = list.stream().filter(x -> x.getKind() == DebugEvent.CHANGE && x.getDetail() == DebugEvent.STATE
153-
&& x.getSource() == second);
154-
return filtered.collect(Collectors.toList());
155-
}
156-
157145
private IThread findThread(IJavaThread thread, String name) throws DebugException {
158146
return findThread(thread, name, 5_000);
159147
}
@@ -194,4 +182,30 @@ protected IPreferenceStore getPrefStore() {
194182
protected IJavaProject getProjectContext() {
195183
return super.get17Project();
196184
}
185+
186+
private static class DebugListener implements IDebugEventSetListener {
187+
188+
private final List<DebugEvent> events = new ArrayList<>();
189+
190+
@Override
191+
public void handleDebugEvents(DebugEvent[] e) {
192+
synchronized (events) {
193+
events.addAll(Arrays.asList(e));
194+
}
195+
}
196+
197+
private void clearEvents() {
198+
synchronized (events) {
199+
events.clear();
200+
}
201+
}
202+
203+
private List<DebugEvent> getStateChangeEvents(IThread second) {
204+
synchronized (events) {
205+
Stream<DebugEvent> filtered = events.stream().filter(x -> x.getKind() == DebugEvent.CHANGE && x.getDetail() == DebugEvent.STATE
206+
&& x.getSource() == second);
207+
return filtered.collect(Collectors.toList());
208+
}
209+
}
210+
}
197211
}

0 commit comments

Comments
 (0)