@@ -24,8 +24,10 @@ import (
2424 "net/http/httptest"
2525 "os"
2626 "os/exec"
27+ "os/signal"
2728 "reflect"
2829 "regexp"
30+ "syscall"
2931 "testing"
3032 "time"
3133
@@ -34,6 +36,7 @@ import (
3436 "github.com/stretchr/testify/require"
3537
3638 "sigs.k8s.io/external-dns/endpoint"
39+ "sigs.k8s.io/external-dns/internal/testutils"
3740 "sigs.k8s.io/external-dns/pkg/apis/externaldns"
3841 "sigs.k8s.io/external-dns/provider"
3942 fakeprovider "sigs.k8s.io/external-dns/provider/fakes"
@@ -219,6 +222,40 @@ func TestSelectRegistry(t *testing.T) {
219222 }
220223}
221224
225+ func TestSetupSigtermHandler (t * testing.T ) {
226+ cancelCalled := make (chan bool , 1 )
227+ cancel := func () {
228+ cancelCalled <- true
229+ }
230+
231+ hook := testutils .LogsUnderTestWithLogLevel (log .InfoLevel , t )
232+
233+ defer signal .Reset (syscall .SIGTERM )
234+ setupSigtermHandler (cancel )
235+
236+ // Simulate sending a SIGTERM signal
237+ sigChan := make (chan os.Signal , 1 )
238+ signal .Notify (sigChan , syscall .SIGTERM )
239+ err := syscall .Kill (syscall .Getpid (), syscall .SIGTERM )
240+ assert .NoError (t , err )
241+
242+ // Wait for the signal to be received
243+ select {
244+ case sig := <- sigChan :
245+ assert .Equal (t , syscall .SIGTERM , sig )
246+ case <- time .After (1 * time .Second ):
247+ t .Fatal ("signal was not recieved" )
248+ }
249+
250+ // Wait for the cancel function to be called
251+ select {
252+ case <- cancelCalled :
253+ testutils .TestHelperLogContainsWithLogLevel ("Received SIGTERM. Terminating..." , log .InfoLevel , hook , t )
254+ case <- time .After (1 * time .Second ):
255+ t .Fatal ("cancel function was not called" )
256+ }
257+ }
258+
222259// Provider
223260func TestBuildProvider (t * testing.T ) {
224261 tests := []struct {
0 commit comments