1515
1616import java .util .ArrayList ;
1717import java .util .Arrays ;
18+ import java .util .Collections ;
1819import java .util .List ;
1920import java .util .Optional ;
20- import java .util .concurrent .atomic .AtomicReference ;
2121import java .util .function .Predicate ;
2222import java .util .stream .Collectors ;
2323import 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