github.com/markusbkk/elvish@v0.0.0-20231204143114-91dc52438621/pkg/eval/exception_unix_test.go (about)

     1  //go:build !windows && !plan9 && !js
     2  // +build !windows,!plan9,!js
     3  
     4  package eval_test
     5  
     6  import (
     7  	"fmt"
     8  	"runtime"
     9  	"syscall"
    10  	"testing"
    11  
    12  	. "github.com/markusbkk/elvish/pkg/eval"
    13  
    14  	"github.com/markusbkk/elvish/pkg/tt"
    15  )
    16  
    17  func TestExternalCmdExit_Error(t *testing.T) {
    18  	tt.Test(t, tt.Fn("Error", error.Error), tt.Table{
    19  		tt.Args(ExternalCmdExit{0x0, "ls", 1}).Rets("ls exited with 0"),
    20  		tt.Args(ExternalCmdExit{0x100, "ls", 1}).Rets("ls exited with 1"),
    21  		// Note: all Unix'es have SIGINT = 2, but syscall package has different
    22  		// string in gccgo("Interrupt") and gc("interrupt").
    23  		tt.Args(ExternalCmdExit{0x2, "ls", 1}).Rets("ls killed by signal " + syscall.SIGINT.String()),
    24  		// 0x80 + signal for core dumped
    25  		tt.Args(ExternalCmdExit{0x82, "ls", 1}).Rets("ls killed by signal " + syscall.SIGINT.String() + " (core dumped)"),
    26  		// 0x7f + signal<<8 for stopped
    27  		tt.Args(ExternalCmdExit{0x27f, "ls", 1}).Rets("ls stopped by signal " + syscall.SIGINT.String() + " (pid=1)"),
    28  	})
    29  	if runtime.GOOS == "linux" {
    30  		tt.Test(t, tt.Fn("Error", error.Error), tt.Table{
    31  			// 0x057f + cause<<16 for trapped. SIGTRAP is 5 on all Unix'es but have
    32  			// different string representations on different OSes.
    33  			tt.Args(ExternalCmdExit{0x1057f, "ls", 1}).Rets(fmt.Sprintf(
    34  				"ls stopped by signal %s (pid=1) (trapped 1)", syscall.SIGTRAP)),
    35  			// 0xff is the only exit code that is not exited, signaled or stopped.
    36  			tt.Args(ExternalCmdExit{0xff, "ls", 1}).Rets("ls has unknown WaitStatus 255"),
    37  		})
    38  	}
    39  }