diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2020-09-09 22:40:16 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-09 22:40:16 +0200 |
commit | 2423a867c0540edc5535a21559e6319d920e1376 (patch) | |
tree | 3c476cc0a084e34cea3a87db429f176fcd1d0506 | |
parent | 839c59b14f062649ebfad702658b271830dcbb50 (diff) |
fix: panic on process.kill() after run (#7405)
This commit fixes panic caused by "unimplemented!()"
calls for some variants of "nix::errno::Errno".
Catch-all variant now returns "Error" class name
instead of panicking.
Co-authored-by: Bert Belder <bertbelder@gmail.com>
-rw-r--r-- | cli/errors.rs | 8 | ||||
-rw-r--r-- | cli/tests/unit/process_test.ts | 24 |
2 files changed, 29 insertions, 3 deletions
diff --git a/cli/errors.rs b/cli/errors.rs index ffa0b95e4..041e8703c 100644 --- a/cli/errors.rs +++ b/cli/errors.rs @@ -156,12 +156,14 @@ fn get_url_parse_error_class(_error: &url::ParseError) -> &'static str { fn get_nix_error_class(error: &nix::Error) -> &'static str { use nix::errno::Errno::*; match error { - nix::Error::Sys(EPERM) => "PermissionDenied", + nix::Error::Sys(ECHILD) => "NotFound", nix::Error::Sys(EINVAL) => "TypeError", nix::Error::Sys(ENOENT) => "NotFound", nix::Error::Sys(ENOTTY) => "BadResource", - nix::Error::Sys(UnknownErrno) => unreachable!(), - nix::Error::Sys(_) => unreachable!(), + nix::Error::Sys(EPERM) => "PermissionDenied", + nix::Error::Sys(ESRCH) => "NotFound", + nix::Error::Sys(UnknownErrno) => "Error", + nix::Error::Sys(_) => "Error", nix::Error::InvalidPath => "TypeError", nix::Error::InvalidUtf8 => "InvalidData", nix::Error::UnsupportedOperation => unreachable!(), diff --git a/cli/tests/unit/process_test.ts b/cli/tests/unit/process_test.ts index 5b7844970..76b755295 100644 --- a/cli/tests/unit/process_test.ts +++ b/cli/tests/unit/process_test.ts @@ -375,6 +375,30 @@ unitTest({ perms: { run: true } }, async function runClose(): Promise<void> { p.stderr.close(); }); +unitTest( + { perms: { run: true } }, + async function runKillAfterStatus(): Promise<void> { + const p = Deno.run({ + cmd: ["python", "-c", 'print("hello")'], + }); + await p.status(); + + // On Windows the underlying Rust API returns `ERROR_ACCESS_DENIED`, + // which serves kind of as a catch all error code. More specific + // error codes do exist, e.g. `ERROR_WAIT_NO_CHILDREN`; it's unclear + // why they're not returned. + const expectedErrorType = Deno.build.os === "windows" + ? Deno.errors.PermissionDenied + : Deno.errors.NotFound; + assertThrows( + () => p.kill(Deno.Signal.SIGTERM), + expectedErrorType, + ); + + p.close(); + }, +); + unitTest(function signalNumbers(): void { if (Deno.build.os === "darwin") { assertEquals(Deno.Signal.SIGSTOP, 17); |