mirror of
https://gitee.com/johng/gf.git
synced 2024-12-02 04:07:47 +08:00
108 lines
2.1 KiB
Go
108 lines
2.1 KiB
Go
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
|
//
|
|
// This Source Code Form is subject to the terms of the MIT License.
|
|
// If a copy of the MIT was not distributed with this file,
|
|
// You can obtain one at https://github.com/gogf/gf.
|
|
|
|
package gproc
|
|
|
|
import (
|
|
"os"
|
|
"syscall"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/gogf/gf/v2/test/gtest"
|
|
)
|
|
|
|
func Test_Signal(t *testing.T) {
|
|
go Listen()
|
|
|
|
// non shutdown signal
|
|
gtest.C(t, func(t *gtest.T) {
|
|
sigRec := make(chan os.Signal, 1)
|
|
AddSigHandler(func(sig os.Signal) {
|
|
sigRec <- sig
|
|
}, syscall.SIGUSR1, syscall.SIGUSR2)
|
|
|
|
sendSignal(syscall.SIGUSR1)
|
|
select {
|
|
case s := <-sigRec:
|
|
t.AssertEQ(s, syscall.SIGUSR1)
|
|
t.AssertEQ(false, isWaitChClosed())
|
|
case <-time.After(time.Second):
|
|
t.Error("signal SIGUSR1 handler timeout")
|
|
}
|
|
|
|
sendSignal(syscall.SIGUSR2)
|
|
select {
|
|
case s := <-sigRec:
|
|
t.AssertEQ(s, syscall.SIGUSR2)
|
|
t.AssertEQ(false, isWaitChClosed())
|
|
case <-time.After(time.Second):
|
|
t.Error("signal SIGUSR2 handler timeout")
|
|
}
|
|
|
|
sendSignal(syscall.SIGHUP)
|
|
select {
|
|
case <-sigRec:
|
|
t.Error("signal SIGHUP should not be listen")
|
|
case <-time.After(time.Millisecond * 100):
|
|
}
|
|
|
|
// multiple listen
|
|
go Listen()
|
|
go Listen()
|
|
sendSignal(syscall.SIGUSR1)
|
|
cnt := 0
|
|
timeout := time.After(time.Second)
|
|
for {
|
|
select {
|
|
case <-sigRec:
|
|
cnt++
|
|
case <-timeout:
|
|
if cnt == 0 {
|
|
t.Error("signal SIGUSR2 handler timeout")
|
|
}
|
|
if cnt != 1 {
|
|
t.Error("multi Listen() repetitive execution")
|
|
}
|
|
return
|
|
}
|
|
}
|
|
})
|
|
|
|
// test shutdown signal
|
|
gtest.C(t, func(t *gtest.T) {
|
|
sigRec := make(chan os.Signal, 1)
|
|
AddSigHandlerShutdown(func(sig os.Signal) {
|
|
sigRec <- sig
|
|
})
|
|
|
|
sendSignal(syscall.SIGTERM)
|
|
// wait the listen done
|
|
time.Sleep(time.Second)
|
|
|
|
select {
|
|
case s := <-sigRec:
|
|
t.AssertEQ(s, syscall.SIGTERM)
|
|
t.AssertEQ(true, isWaitChClosed())
|
|
case <-time.After(time.Second):
|
|
t.Error("signal SIGUSR2 handler timeout")
|
|
}
|
|
})
|
|
}
|
|
|
|
func sendSignal(sig os.Signal) {
|
|
signalChan <- sig
|
|
}
|
|
|
|
func isWaitChClosed() bool {
|
|
select {
|
|
case _, ok := <-waitChan:
|
|
return !ok
|
|
default:
|
|
return false
|
|
}
|
|
}
|