github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/cmds/core/kill/kill_test.go (about)

     1  // Copyright 2016 the u-root Authors. All rights reserved
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import (
     8  	"bytes"
     9  	"fmt"
    10  	"os/exec"
    11  	"strings"
    12  	"testing"
    13  )
    14  
    15  func getUnusedPID() string {
    16  	cmd := exec.Command("true")
    17  	cmd.Start()
    18  	pid := cmd.Process.Pid
    19  	cmd.Wait()
    20  	return fmt.Sprintf("%d", pid)
    21  }
    22  
    23  func TestKillProcess(t *testing.T) {
    24  	for _, tt := range []struct {
    25  		name string
    26  		args []string
    27  		want string
    28  	}{
    29  		{
    30  			name: "not enough args",
    31  			args: []string{"kill"},
    32  			want: fmt.Sprintf("%s\n", eUsage),
    33  		},
    34  		{
    35  			name: "list signal names with too much args",
    36  			args: []string{"kill", "-l", "10"},
    37  			want: fmt.Sprintf("%s\n", eUsage),
    38  		},
    39  		{
    40  			name: "list signal names",
    41  			args: []string{"kill", "-l"},
    42  			want: fmt.Sprintf("%s\n", siglist()),
    43  		},
    44  		{
    45  			name: "kill pid 2",
    46  			args: []string{"kill", "2"},
    47  			want: "",
    48  		},
    49  		{
    50  			name: "kill signal without signal and pid",
    51  			args: []string{"kill", "-s"},
    52  			want: fmt.Sprintf("%s\n", eUsage),
    53  		},
    54  		{
    55  			name: "kill signal with signal but without pid",
    56  			args: []string{"kill", "--signal", "50"},
    57  			want: fmt.Sprintf("%s\n", eUsage),
    58  		},
    59  		{
    60  			name: "kill signal with signal and pid",
    61  			args: []string{"kill", "--signal", "50", "2"},
    62  			want: "",
    63  		},
    64  		{
    65  			name: "kill signal with signal and wrong pid",
    66  			args: []string{"kill", "--signal", "50", getUnusedPID()},
    67  			want: "some processes could not be killed",
    68  		},
    69  		{
    70  			name: "signal is invalid",
    71  			args: []string{"kill", "--signal", "a"},
    72  			want: "is not a valid signal",
    73  		},
    74  		{
    75  			name: "signal is invalid",
    76  			args: []string{"kill", "-1", "a"},
    77  			want: "some processes could not be killed: [a: arguments must be process or job IDS]",
    78  		},
    79  	} {
    80  		t.Run(tt.name, func(t *testing.T) {
    81  			buf := &bytes.Buffer{}
    82  			if err := killProcess(buf, tt.args...); err != nil {
    83  				if !strings.Contains(err.Error(), tt.want) {
    84  					t.Errorf("killProcess() = %q, want to contain: %q", err.Error(), tt.want)
    85  				}
    86  			} else {
    87  				if buf.String() != tt.want {
    88  					t.Errorf("killProcess() = %q, want: %q", buf.String(), tt.want)
    89  				}
    90  			}
    91  		})
    92  	}
    93  }