From 9dcd22c99dc9a23c60e55777f0e5419999989e58 Mon Sep 17 00:00:00 2001 From: riccardobl <4943530+riccardobl@users.noreply.github.com> Date: Fri, 12 Jun 2026 08:24:53 +0000 Subject: [PATCH] ci(reachability): extend reachability harness --- .../platform/jvm/JVMReachAllMain.java | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/nge-platform-jvm/src/test/java/org/ngengine/platform/jvm/JVMReachAllMain.java b/nge-platform-jvm/src/test/java/org/ngengine/platform/jvm/JVMReachAllMain.java index 0e1c640..74ced28 100644 --- a/nge-platform-jvm/src/test/java/org/ngengine/platform/jvm/JVMReachAllMain.java +++ b/nge-platform-jvm/src/test/java/org/ngengine/platform/jvm/JVMReachAllMain.java @@ -528,6 +528,92 @@ public void onRTCConnected() {} return null; } ); + + // If native libdatachannel is available, attempt an in-process RTC pair to exercise signaling and data channels end-to-end. + safeRun( + "rtc-local-pair", + () -> { + if (!INCLUDE_NATIVE_RTC) { + return null; + } + + try { + Duration p2pAttemptTimeout2 = Duration.ofSeconds(5); + Collection stun2 = new ArrayList<>(); + + RTCTransport a = platform.newRTCTransport(p2pAttemptTimeout2, "reach-a", stun2); + RTCTransport b = platform.newRTCTransport(p2pAttemptTimeout2, "reach-b", stun2); + + final java.util.concurrent.atomic.AtomicBoolean gotMessage = new java.util.concurrent.atomic.AtomicBoolean(false); + + b.addListener( + new org.ngengine.platform.transport.RTCTransportListener() { + @Override + public void onLocalRTCIceCandidate(org.ngengine.platform.transport.RTCTransportIceCandidate candidate) {} + + @Override + public void onRTCBinaryMessage(org.ngengine.platform.transport.RTCDataChannel channel, java.nio.ByteBuffer msg) { + gotMessage.set(true); + } + + @Override + public void onRTCChannelError(org.ngengine.platform.transport.RTCDataChannel channel, Throwable e) {} + + @Override + public void onRTCChannelReady(org.ngengine.platform.transport.RTCDataChannel channel) {} + + @Override + public void onRTCBufferedAmountLow(org.ngengine.platform.transport.RTCDataChannel channel) {} + + @Override + public void onRTCChannelClosed(org.ngengine.platform.transport.RTCDataChannel channel) {} + + @Override + public void onRTCDisconnected(String reason) {} + + @Override + public void onRTCConnected() {} + } + ); + + try { + // a listens -> offer + org.ngengine.platform.AsyncTask offerTask = a.listen(); + String offer = offerTask.await(); + + // b connects with offer -> returns answer + org.ngengine.platform.AsyncTask answerTask = b.connect(offer); + String answer = answerTask.await(); + + // a connects with answer + a.connect(answer); + + // create data channels on both sides + org.ngengine.platform.AsyncTask chA = + a.createDataChannel("reach-all", null, true, true, -1, null); + org.ngengine.platform.AsyncTask chB = + b.createDataChannel("reach-all", null, true, true, -1, null); + + org.ngengine.platform.transport.RTCDataChannel ca = chA.await(); + org.ngengine.platform.transport.RTCDataChannel cb = chB.await(); + + if (ca != null && cb != null) { + try { + ca.write(java.nio.ByteBuffer.wrap(new byte[] { 9, 9, 9 })); + } catch (Throwable ignored) {} + + // give some time for message delivery (best-effort) + try { Thread.sleep(200); } catch (InterruptedException ignored) {} + } + } catch (Throwable ignored) {} + + a.close(); + b.close(); + } catch (Throwable ignored) {} + + return null; + } + ); } private static void exerciseHttpRequests(JVMAsyncPlatform platform) {