From ff3ddd33becb0e140be4016cc37b675a0e739b17 Mon Sep 17 00:00:00 2001 From: Anton Malinskiy Date: Sat, 30 Jan 2021 20:02:42 +1100 Subject: [PATCH] fix(shell): throw exceptions when shell exit code is unavailable --- .../v1/ShellResultResponseTransformer.kt | 7 ++- .../v1/ShellResultResponseTransformerTest.kt | 43 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/test/kotlin/com/malinskiy/adam/request/shell/v1/ShellResultResponseTransformerTest.kt diff --git a/src/main/kotlin/com/malinskiy/adam/request/shell/v1/ShellResultResponseTransformer.kt b/src/main/kotlin/com/malinskiy/adam/request/shell/v1/ShellResultResponseTransformer.kt index 34b6b35ed..ed10efcfc 100644 --- a/src/main/kotlin/com/malinskiy/adam/request/shell/v1/ShellResultResponseTransformer.kt +++ b/src/main/kotlin/com/malinskiy/adam/request/shell/v1/ShellResultResponseTransformer.kt @@ -17,6 +17,7 @@ package com.malinskiy.adam.request.shell.v1 import com.malinskiy.adam.Const +import com.malinskiy.adam.exception.RequestRejectedException import com.malinskiy.adam.request.transform.ResponseTransformer class ShellResultResponseTransformer : ResponseTransformer { @@ -30,8 +31,12 @@ class ShellResultResponseTransformer : ResponseTransformer { override fun transform(): ShellCommandResult { val output = builder.toString() val indexOfDelimiter = output.lastIndexOf(SyncShellCommandRequest.EXIT_CODE_DELIMITER) + if (indexOfDelimiter == -1) { + throw RequestRejectedException("No exit code delimiter found in $output") + } val stdout = output.substring(0 until indexOfDelimiter) - val exitCode = output.substring(indexOfDelimiter + 1).trim().toInt() + val exitCodeString = output.substring(indexOfDelimiter + 1).trim() + val exitCode = exitCodeString.toIntOrNull() ?: throw RequestRejectedException("Unexpected exit code value $exitCodeString") return ShellCommandResult( output = stdout, exitCode = exitCode diff --git a/src/test/kotlin/com/malinskiy/adam/request/shell/v1/ShellResultResponseTransformerTest.kt b/src/test/kotlin/com/malinskiy/adam/request/shell/v1/ShellResultResponseTransformerTest.kt new file mode 100644 index 000000000..ea3b36551 --- /dev/null +++ b/src/test/kotlin/com/malinskiy/adam/request/shell/v1/ShellResultResponseTransformerTest.kt @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2021 Anton Malinskiy + * + * Licensed 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 com.malinskiy.adam.request.shell.v1 + +import com.malinskiy.adam.exception.RequestRejectedException +import kotlinx.coroutines.runBlocking +import org.junit.Test + +class ShellResultResponseTransformerTest { + @Test(expected = RequestRejectedException::class) + fun testNoExitCodeDelimiter() { + runBlocking { + ShellResultResponseTransformer().apply { + val bytes = "nothing".toByteArray() + process(bytes, 0, bytes.size) + }.transform() + } + } + + @Test(expected = RequestRejectedException::class) + fun testInvalidExitCode() { + runBlocking { + ShellResultResponseTransformer().apply { + val bytes = "nothingxtest".toByteArray() + process(bytes, 0, bytes.size) + }.transform() + } + } +} \ No newline at end of file