From 0fc57376c07310eec4074bf37c8dc9129379b74a Mon Sep 17 00:00:00 2001 From: Lord of Abyss <103809695+Abyss-lord@users.noreply.github.com> Date: Fri, 17 Jan 2025 06:54:45 +0800 Subject: [PATCH] [#6277] improve(CLI): Fix AreYouSure Scanner should close. (#6285) ### What changes were proposed in this pull request? Fix AreYouSure Scanner should close. ### Why are the changes needed? Fix: #6277 ### Does this PR introduce _any_ user-facing change? No. ### How was this patch tested? local test. --- .../org/apache/gravitino/cli/AreYouSure.java | 16 +++-- .../apache/gravitino/cli/TestAreYouSure.java | 60 +++++++++++++++++++ 2 files changed, 70 insertions(+), 6 deletions(-) create mode 100644 clients/cli/src/test/java/org/apache/gravitino/cli/TestAreYouSure.java diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/AreYouSure.java b/clients/cli/src/main/java/org/apache/gravitino/cli/AreYouSure.java index a0893dbad4f..a6d1450c1bf 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/AreYouSure.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/AreYouSure.java @@ -32,16 +32,20 @@ public class AreYouSure { * @return {@code true} if the action is to continue {@code false} otherwise. */ public static boolean really(boolean force) { - Scanner scanner = new Scanner(System.in, StandardCharsets.UTF_8.name()); - /* force option for scripting */ if (force) { return true; } - System.out.println( - "This command could result in data loss or other issues. Are you sure you want to do this? (Y/N)"); - String answer = scanner.next(); - return answer.equals("Y"); + try (Scanner scanner = new Scanner(System.in, StandardCharsets.UTF_8.name())) { + System.out.println( + "This command could result in data loss or other issues. Are you sure you want to do this? (Y/N)"); + String answer = scanner.next(); + return "Y".equals(answer); + } catch (Exception e) { + System.err.println("Error while reading user input: " + e.getMessage()); + Main.exit(-1); + } + return false; } } diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestAreYouSure.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestAreYouSure.java new file mode 100644 index 00000000000..78a1c2d67d4 --- /dev/null +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestAreYouSure.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli; + +import java.io.ByteArrayInputStream; +import java.nio.charset.StandardCharsets; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TestAreYouSure { + + @Test + void testCommandWithForce() { + Assertions.assertTrue(AreYouSure.really(true)); + } + + @Test + void testCommandWithInputY() { + ByteArrayInputStream inputStream = + new ByteArrayInputStream("Y".getBytes(StandardCharsets.UTF_8)); + System.setIn(inputStream); + + Assertions.assertTrue(AreYouSure.really(false)); + } + + @Test + void testCommandWithInputN() { + ByteArrayInputStream inputStream = + new ByteArrayInputStream("N".getBytes(StandardCharsets.UTF_8)); + System.setIn(inputStream); + + Assertions.assertFalse(AreYouSure.really(false)); + } + + @Test + void testCommandWithInputInvalid() { + ByteArrayInputStream inputStream = + new ByteArrayInputStream("Invalid".getBytes(StandardCharsets.UTF_8)); + System.setIn(inputStream); + + Assertions.assertFalse(AreYouSure.really(false)); + } +}