You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
// +build !windows
package svc
import ( "os" "syscall" "testing"
"github.com/judwhite/go-svc/svc/internal/test" )
func TestDefaultSignalHandling(t *testing.T) { signals := []os.Signal{syscall.SIGINT, syscall.SIGTERM} // default signals handled
for _, signal := range signals { testSignalNotify(t, signal) } }
func TestUserDefinedSignalHandling(t *testing.T) { signals := []os.Signal{syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP} for _, signal := range signals { testSignalNotify(t, signal, signals...) } }
func testSignalNotify(t *testing.T, signal os.Signal, sig ...os.Signal) { // arrange
// sigChan is the chan we'll send to here. if a signal matches a registered signal
// type in the Run function (in svc_other.go) the signal will be delegated to the
// channel passed to signalNotify, which is created in the Run function in svc_other.go.
// shortly: we send here and the Run function gets it if it matches the filter.
sigChan := make(chan os.Signal)
var startCalled, stopCalled, initCalled int prg := makeProgram(&startCalled, &stopCalled, &initCalled)
signalNotify = func(c chan<- os.Signal, sig ...os.Signal) { if c == nil { panic("os/signal: Notify using nil channel") }
go func() { for val := range sigChan { for _, registeredSig := range sig { if val == registeredSig { c <- val } } } }() }
go func() { sigChan <- signal }()
// act
if err := Run(prg, sig...); err != nil { t.Fatal(err) }
// assert
test.Equal(t, 1, startCalled) test.Equal(t, 1, stopCalled) test.Equal(t, 1, initCalled) }
|