github.1git.de/docker/cli@v26.1.3+incompatible/cli/command/container/signals_unix_test.go (about)

     1  //go:build !windows
     2  
     3  package container
     4  
     5  import (
     6  	"context"
     7  	"os"
     8  	"syscall"
     9  	"testing"
    10  	"time"
    11  
    12  	"golang.org/x/sys/unix"
    13  	"gotest.tools/v3/assert"
    14  )
    15  
    16  func TestIgnoredSignals(t *testing.T) {
    17  	ignoredSignals := []syscall.Signal{unix.SIGPIPE, unix.SIGCHLD, unix.SIGURG}
    18  
    19  	for _, s := range ignoredSignals {
    20  		t.Run(unix.SignalName(s), func(t *testing.T) {
    21  			ctx, cancel := context.WithCancel(context.Background())
    22  			defer cancel()
    23  
    24  			var called bool
    25  			apiClient := &fakeClient{containerKillFunc: func(ctx context.Context, container, signal string) error {
    26  				called = true
    27  				return nil
    28  			}}
    29  
    30  			sigc := make(chan os.Signal)
    31  			defer close(sigc)
    32  
    33  			done := make(chan struct{})
    34  			go func() {
    35  				ForwardAllSignals(ctx, apiClient, t.Name(), sigc)
    36  				close(done)
    37  			}()
    38  
    39  			timer := time.NewTimer(30 * time.Second)
    40  			defer timer.Stop()
    41  
    42  			select {
    43  			case <-timer.C:
    44  				t.Fatal("timeout waiting to send signal")
    45  			case sigc <- s:
    46  			case <-done:
    47  			}
    48  
    49  			// cancel the context so ForwardAllSignals will exit after it has processed the signal we sent.
    50  			// This is how we know the signal was actually processed and are not introducing a flakey test.
    51  			cancel()
    52  			<-done
    53  
    54  			assert.Assert(t, !called, "kill was called")
    55  		})
    56  	}
    57  }