package signals import ( "fmt" "os" "os/signal" "sync" "testing" "time" ) func TestSignalHandler(t *testing.T) { ctx := SetupSignalHandler() task := &Task{ ticker: time.NewTicker(time.Millisecond * 20), } c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) task.wg.Add(1) go func(c chan os.Signal) { defer task.wg.Done() task.Run(c) }(c) select { case sig := <-c: fmt.Printf("Got %s signal. Aborting...\n", sig) case _, ok := <-ctx.Done(): if ok != false { t.Fatalf("expected ok to be false, was %v", ok) } } } type Task struct { wg sync.WaitGroup ticker *time.Ticker } func (t *Task) Run(c chan os.Signal) { for { go sendSignal(c) handle() } } func sendSignal(stopChan chan os.Signal) { fmt.Printf("...") time.Sleep(10 * time.Millisecond) stopChan <- os.Interrupt } func handle() { for i := 0; i < 5; i++ { fmt.Print("#") time.Sleep(time.Millisecond * 10) } }