Skip to content

Commit ed223f2

Browse files
committed
Add test to ensure afterDisconnect is called only once
1 parent 01fe1fd commit ed223f2

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

test/src/test/java/hudson/slaves/SlaveComputerTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
import hudson.security.ACLContext;
4646
import java.io.IOError;
4747
import java.io.IOException;
48+
import java.util.concurrent.atomic.AtomicInteger;
49+
4850
import jenkins.model.Jenkins;
4951
import net.sf.json.JSONNull;
5052
import net.sf.json.JSONObject;
@@ -201,6 +203,45 @@ public void onOnline(Computer c, TaskListener listener) {
201203
}
202204
}
203205
}
206+
@Test
207+
@Issue("JENKINS-35272")
208+
void afterDisconnectShouldBeCalledOnlyOnce() throws Exception {
209+
DumbSlave node = j.createOnlineSlave();
210+
SlaveComputer computer = (SlaveComputer) node.getComputer();
211+
assertNotNull(computer);
212+
213+
// Reset counter before test
214+
AfterDisconnectListener.reset();
215+
216+
// Trigger disconnect twice
217+
computer.disconnect(null);
218+
computer.disconnect(null);
219+
220+
// Wait until Jenkins finishes processing
221+
j.waitUntilNoActivity();
222+
223+
assertEquals(1, AfterDisconnectListener.count.get(),
224+
"afterDisconnect should be called exactly once");
225+
}
226+
227+
@TestExtension
228+
public static class AfterDisconnectListener extends ComputerListener {
229+
230+
static final AtomicInteger count = new AtomicInteger();
231+
232+
static void reset() {
233+
count.set(0);
234+
}
235+
236+
@Override
237+
public void onOffline(Computer c, OfflineCause cause) {
238+
if (c instanceof SlaveComputer) {
239+
count.incrementAndGet();
240+
}
241+
}
242+
}
243+
244+
204245

205246

206247
/**

0 commit comments

Comments
 (0)