diff --git a/runtime/java/FunasrWsClient.java b/runtime/java/FunasrWsClient.java index 2037c9a8a..2113e45e0 100644 --- a/runtime/java/FunasrWsClient.java +++ b/runtime/java/FunasrWsClient.java @@ -225,7 +225,10 @@ public class FunasrWsClient extends WebSocketClient { close(); } - if (iseof && mode.equals("offline") && jsonObject.containsKey("is_final") && jsonObject.get("is_final").equals("false")) { + if (iseof + && mode.equals("offline") + && jsonObject.containsKey("is_final") + && Boolean.TRUE.equals(jsonObject.get("is_final"))) { close(); } } diff --git a/runtime/java/Makefile b/runtime/java/Makefile index 9a70ca5fc..9f3bc0725 100644 --- a/runtime/java/Makefile +++ b/runtime/java/Makefile @@ -8,6 +8,7 @@ WEBSOCKET_DIR:= ./ WEBSOCKET_FILES = \ $(WEBSOCKET_DIR)/FunasrWsClient.java \ +TEST_FILES = $(WEBSOCKET_DIR)/tests/FunasrWsClientTest.java LIB_BUILD_DIR = ./lib @@ -31,7 +32,7 @@ vpath %.java src rebuild: clean all -.PHONY: clean run downjar +.PHONY: clean run downjar test downjar: wget https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar -P ./lib/ @@ -61,6 +62,11 @@ runclient: buildwebsocket: $(WEBSOCKET_FILES:.java=.class) +test: buildwebsocket + $(JAVAC) -cp $(BUILD_DIR):lib/slf4j-simple-1.7.25.jar:lib/slf4j-api-1.7.25.jar:lib/Java-WebSocket-1.5.3.jar:lib/json-simple-1.1.1.jar:lib/argparse4j-0.9.0.jar -d $(BUILD_DIR) -encoding UTF-8 $(TEST_FILES) + java -ea -cp $(BUILD_DIR):lib/slf4j-simple-1.7.25.jar:lib/slf4j-api-1.7.25.jar:lib/Java-WebSocket-1.5.3.jar:lib/json-simple-1.1.1.jar:lib/argparse4j-0.9.0.jar $(RUNJFLAGS) websocket.FunasrWsClientTest + + %.class: %.java $(JAVAC) -cp $(BUILD_DIR):lib/slf4j-simple-1.7.25.jar:lib/slf4j-api-1.7.25.jar:lib/Java-WebSocket-1.5.3.jar:lib/json-simple-1.1.1.jar:lib/argparse4j-0.9.0.jar -d $(BUILD_DIR) -encoding UTF-8 $< diff --git a/runtime/java/tests/FunasrWsClientTest.java b/runtime/java/tests/FunasrWsClientTest.java new file mode 100644 index 000000000..ddfaa25fe --- /dev/null +++ b/runtime/java/tests/FunasrWsClientTest.java @@ -0,0 +1,70 @@ +package websocket; + +import java.net.URI; + +public final class FunasrWsClientTest { + private static final class RecordingClient extends FunasrWsClient { + private boolean closeCalled; + + RecordingClient() throws Exception { + super(new URI("ws://127.0.0.1:1")); + } + + @Override + public void close() { + closeCalled = true; + } + + @Override + public void send(String text) {} + } + + private static void assertCloseDecision( + boolean expected, boolean eof, String clientMode, String message, String description) + throws Exception { + RecordingClient client = new RecordingClient(); + FunasrWsClient.mode = clientMode; + if (eof) { + client.sendEof(); + } + + client.onMessage(message); + if (client.closeCalled != expected) { + throw new AssertionError( + description + ": expected close=" + expected + ", actual=" + client.closeCalled); + } + } + + public static void main(String[] args) throws Exception { + assertCloseDecision( + false, + true, + "offline", + "{\"text\":\"partial\",\"is_final\":false}", + "non-final offline response"); + assertCloseDecision( + false, + false, + "offline", + "{\"text\":\"done\",\"is_final\":true}", + "final response before EOF"); + assertCloseDecision( + false, + true, + "online", + "{\"text\":\"done\",\"is_final\":true}", + "final online response"); + assertCloseDecision( + true, + true, + "offline", + "{\"text\":\"legacy done\"}", + "legacy offline response without is_final"); + assertCloseDecision( + true, + true, + "offline", + "{\"mode\":\"2pass-offline\",\"text\":\"done\",\"is_final\":true}", + "final offline response"); + } +}