kdnotify/watcher/watcher_test.go

130 lines
2.7 KiB
Go

/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package watcher_test
import (
"context"
"fmt"
"testing"
"github.com/stretchr/testify/assert"
"go.uber.org/zap"
"git.st8l.com/luxolus/kdnotify/config"
mfifo "git.st8l.com/luxolus/kdnotify/fifo/mock"
n "git.st8l.com/luxolus/kdnotify/schema/notify"
"git.st8l.com/luxolus/kdnotify/schema/notify/state"
"git.st8l.com/luxolus/kdnotify/schema/notify/ty"
"git.st8l.com/luxolus/kdnotify/watcher"
mwatcher "git.st8l.com/luxolus/kdnotify/watcher/mock"
)
func Test_EventWatcher(t *testing.T) {
t.Parallel()
cases := []struct {
Name string
Events []n.VrrpMessage
Expected []n.VrrpMessage
ShouldError bool
HandlerFunc func(t *testing.T, expected, actual *n.VrrpMessage) bool
}{
{
Name: "NoEvents",
},
{
Name: "InputEqualOutput",
Events: []n.VrrpMessage{
{
Message: n.Message{
Type: ty.INSTANCE,
State: state.MASTER,
Instance: "buzz_instance",
},
},
{
Message: n.Message{
Type: ty.GROUP,
State: state.BACKUP,
Instance: "wuz_group",
},
},
{
Message: n.Message{
Type: ty.INSTANCE,
State: state.STOP,
Instance: "blah_instance",
},
},
},
Expected: []n.VrrpMessage{
{
Message: n.Message{
Type: ty.INSTANCE,
State: state.MASTER,
Instance: "buzz_instance",
},
},
{
Message: n.Message{
Type: ty.GROUP,
State: state.BACKUP,
Instance: "wuz_group",
},
},
{
Message: n.Message{
Type: ty.INSTANCE,
State: state.STOP,
Instance: "blah_instance",
},
},
},
},
}
for i, test := range cases {
test := test // Avoid closure capture by ref
tname := fmt.Sprintf("%s@%d:%d", test.Name, i+1, len(cases))
t.Run(tname, func(t *testing.T) {
t.Parallel()
hfunc := test.HandlerFunc
if hfunc == nil {
hfunc = CompareVrrpMessage
}
if test.ShouldError {
hfunc = func(t *testing.T, expected, actual *n.VrrpMessage) bool {
return !hfunc(t, expected, actual)
}
}
events := mfifo.NewMockEvents(test.Events...)
watcher := watcher.NewWatcher(mkTestCxt(), &events)
handler := mwatcher.MockHandler{
T: t,
Expected: test.Expected,
HandlerFunc: hfunc,
}
watcher.Watch(&handler)
})
}
}
func CompareVrrpMessage(t *testing.T, expected, actual *n.VrrpMessage) bool {
return assert.Equal(t, *expected, *actual)
}
func mkTestCxt() *config.LibCxt {
return &config.LibCxt{
Context: context.TODO(),
Logger: zap.NewNop(),
}
}