From 63a8478f7ca72741dae73ff9322a6d59fb4ffeab Mon Sep 17 00:00:00 2001 From: Ed Burns Date: Fri, 14 Aug 2026 15:12:23 -0700 Subject: [PATCH 1/2] Fix Java builds with scoped npm registries on macOS Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- java/sdk/pom.xml | 2 ++ .../test/java/com/github/copilot/CliServerManagerTest.java | 5 ++--- .../src/test/java/com/github/copilot/JsonRpcClientTest.java | 5 ++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/java/sdk/pom.xml b/java/sdk/pom.xml index 0c93a2b30..ca0e792ea 100644 --- a/java/sdk/pom.xml +++ b/java/sdk/pom.xml @@ -201,6 +201,7 @@ ${copilot.sdk.root}/test/harness ci + --omit-lockfile-registry-resolved=true --loglevel ${npm.loglevel} @@ -225,6 +226,7 @@ ci --ignore-scripts + --omit-lockfile-registry-resolved=true --loglevel ${npm.loglevel} diff --git a/java/sdk/src/test/java/com/github/copilot/CliServerManagerTest.java b/java/sdk/src/test/java/com/github/copilot/CliServerManagerTest.java index 353858135..ee0d7418f 100644 --- a/java/sdk/src/test/java/com/github/copilot/CliServerManagerTest.java +++ b/java/sdk/src/test/java/com/github/copilot/CliServerManagerTest.java @@ -72,9 +72,8 @@ void connectToServerTcpMode() throws Exception { private static Process startBlockingProcess() throws IOException { boolean isWindows = System.getProperty("os.name").toLowerCase().contains("windows"); - return (isWindows - ? new ProcessBuilder(System.getenv("COMSPEC"), "/c", "more") - : new ProcessBuilder("/usr/bin/cat")).start(); + return (isWindows ? new ProcessBuilder(System.getenv("COMSPEC"), "/c", "more") : new ProcessBuilder("cat")) + .start(); } @Test diff --git a/java/sdk/src/test/java/com/github/copilot/JsonRpcClientTest.java b/java/sdk/src/test/java/com/github/copilot/JsonRpcClientTest.java index d6c0b5e14..2737420e8 100644 --- a/java/sdk/src/test/java/com/github/copilot/JsonRpcClientTest.java +++ b/java/sdk/src/test/java/com/github/copilot/JsonRpcClientTest.java @@ -135,9 +135,8 @@ void testIsConnectedWithSocketClosed() throws Exception { private static Process startBlockingProcess() throws IOException { boolean isWindows = System.getProperty("os.name").toLowerCase().contains("windows"); - return (isWindows - ? new ProcessBuilder(System.getenv("COMSPEC"), "/c", "more") - : new ProcessBuilder("/usr/bin/cat")).start(); + return (isWindows ? new ProcessBuilder(System.getenv("COMSPEC"), "/c", "more") : new ProcessBuilder("cat")) + .start(); } @Test From d453dce52bd45302484b6b69ada577f21f5feb96 Mon Sep 17 00:00:00 2001 From: Ed Burns Date: Fri, 14 Aug 2026 15:53:42 -0700 Subject: [PATCH 2/2] Test: replace external blocking processes Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../github/copilot/CliServerManagerTest.java | 8 +-- .../com/github/copilot/JsonRpcClientTest.java | 12 +--- .../java/com/github/copilot/TestProcess.java | 65 +++++++++++++++++++ 3 files changed, 69 insertions(+), 16 deletions(-) create mode 100644 java/sdk/src/test/java/com/github/copilot/TestProcess.java diff --git a/java/sdk/src/test/java/com/github/copilot/CliServerManagerTest.java b/java/sdk/src/test/java/com/github/copilot/CliServerManagerTest.java index ee0d7418f..68555a35b 100644 --- a/java/sdk/src/test/java/com/github/copilot/CliServerManagerTest.java +++ b/java/sdk/src/test/java/com/github/copilot/CliServerManagerTest.java @@ -70,19 +70,13 @@ void connectToServerTcpMode() throws Exception { } } - private static Process startBlockingProcess() throws IOException { - boolean isWindows = System.getProperty("os.name").toLowerCase().contains("windows"); - return (isWindows ? new ProcessBuilder(System.getenv("COMSPEC"), "/c", "more") : new ProcessBuilder("cat")) - .start(); - } - @Test void connectToServerStdioMode() throws Exception { var options = new CopilotClientOptions(); var manager = new CliServerManager(options); // Create a dummy process for stdio mode - Process process = startBlockingProcess(); + Process process = new TestProcess(); try { JsonRpcClient client = manager.connectToServer(process, null, null); assertNotNull(client); diff --git a/java/sdk/src/test/java/com/github/copilot/JsonRpcClientTest.java b/java/sdk/src/test/java/com/github/copilot/JsonRpcClientTest.java index 2737420e8..79aaea10d 100644 --- a/java/sdk/src/test/java/com/github/copilot/JsonRpcClientTest.java +++ b/java/sdk/src/test/java/com/github/copilot/JsonRpcClientTest.java @@ -133,15 +133,9 @@ void testIsConnectedWithSocketClosed() throws Exception { pair.serverSocket.close(); } - private static Process startBlockingProcess() throws IOException { - boolean isWindows = System.getProperty("os.name").toLowerCase().contains("windows"); - return (isWindows ? new ProcessBuilder(System.getenv("COMSPEC"), "/c", "more") : new ProcessBuilder("cat")) - .start(); - } - @Test void testIsConnectedWithProcess() throws Exception { - Process proc = startBlockingProcess(); + Process proc = new TestProcess(); try (var client = JsonRpcClient.fromProcess(proc)) { assertTrue(client.isConnected()); } @@ -149,7 +143,7 @@ void testIsConnectedWithProcess() throws Exception { @Test void testIsConnectedWithProcessDead() throws Exception { - Process proc = startBlockingProcess(); + Process proc = new TestProcess(); var client = JsonRpcClient.fromProcess(proc); proc.destroy(); proc.waitFor(5, TimeUnit.SECONDS); @@ -161,7 +155,7 @@ void testIsConnectedWithProcessDead() throws Exception { @Test void testGetProcessReturnsProcess() throws Exception { - Process proc = startBlockingProcess(); + Process proc = new TestProcess(); try (var client = JsonRpcClient.fromProcess(proc)) { assertSame(proc, client.getProcess()); } diff --git a/java/sdk/src/test/java/com/github/copilot/TestProcess.java b/java/sdk/src/test/java/com/github/copilot/TestProcess.java new file mode 100644 index 000000000..f7187ae67 --- /dev/null +++ b/java/sdk/src/test/java/com/github/copilot/TestProcess.java @@ -0,0 +1,65 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + *--------------------------------------------------------------------------------------------*/ + +package com.github.copilot; + +import java.io.InputStream; +import java.io.OutputStream; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +final class TestProcess extends Process { + + private final CountDownLatch terminated = new CountDownLatch(1); + + @Override + public OutputStream getOutputStream() { + return OutputStream.nullOutputStream(); + } + + @Override + public InputStream getInputStream() { + return InputStream.nullInputStream(); + } + + @Override + public InputStream getErrorStream() { + return InputStream.nullInputStream(); + } + + @Override + public int waitFor() throws InterruptedException { + terminated.await(); + return 0; + } + + @Override + public boolean waitFor(long timeout, TimeUnit unit) throws InterruptedException { + return terminated.await(timeout, unit); + } + + @Override + public int exitValue() { + if (isAlive()) { + throw new IllegalThreadStateException("Process has not exited"); + } + return 0; + } + + @Override + public void destroy() { + terminated.countDown(); + } + + @Override + public Process destroyForcibly() { + destroy(); + return this; + } + + @Override + public boolean isAlive() { + return terminated.getCount() > 0; + } +}