64 lines
1.7 KiB
Go
64 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"syscall"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestConfirmOrRevert(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
confirm bool
|
|
abort bool
|
|
resolved bool
|
|
revertErr error
|
|
wantRevert bool
|
|
wantErr bool
|
|
wantResolved bool
|
|
}{
|
|
{name: "confirmed keeps ruleset", confirm: true},
|
|
{name: "confirm wins over simultaneous abort", confirm: true, abort: true},
|
|
{name: "timeout reverts", wantRevert: true, wantErr: true},
|
|
{name: "hangup reverts", abort: true, wantRevert: true, wantErr: true},
|
|
{name: "revert failure surfaces", revertErr: errors.New("boom"), wantRevert: true, wantErr: true},
|
|
{name: "resolved elsewhere", resolved: true, wantRevert: true, wantResolved: true},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
for i := 0; i < 20; i++ { // select between ready channels is random
|
|
confirm := make(chan os.Signal, 1)
|
|
abort := make(chan os.Signal, 1)
|
|
if tt.confirm {
|
|
confirm <- syscall.SIGUSR1
|
|
}
|
|
if tt.abort {
|
|
abort <- syscall.SIGHUP
|
|
}
|
|
called := false
|
|
msg, err := confirmOrRevert(confirm, abort, 10*time.Millisecond, func() (bool, error) {
|
|
called = true
|
|
return !tt.resolved, tt.revertErr
|
|
})
|
|
if called != tt.wantRevert {
|
|
t.Fatalf("revert called = %v, want %v", called, tt.wantRevert)
|
|
}
|
|
if (err != nil) != tt.wantErr {
|
|
t.Fatalf("err = %v, wantErr %v", err, tt.wantErr)
|
|
}
|
|
if tt.revertErr != nil && !errors.Is(err, tt.revertErr) {
|
|
t.Fatalf("revert error not wrapped: %v", err)
|
|
}
|
|
if tt.wantResolved && msg == "" {
|
|
t.Fatal("expected already-resolved message")
|
|
}
|
|
if !(tt.confirm && tt.abort) {
|
|
break
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|