diff options
| author | jwijenbergh <jeroenwijenbergh@protonmail.com> | 2024-08-27 14:27:16 +0200 |
|---|---|---|
| committer | Jeroen Wijenbergh <46386452+jwijenbergh@users.noreply.github.com> | 2024-10-28 17:02:14 +0100 |
| commit | d9e474cd515e87a9c21897800d0258d3d4b69395 (patch) | |
| tree | 6606c319bac6decffa0bdc09102161de6d9c7b8c /internal/failover/monitor_test.go | |
| parent | 1fa35a166cee057223e11428367210b9ea7a0a0d (diff) | |
Failover: add tests
Diffstat (limited to 'internal/failover/monitor_test.go')
| -rw-r--r-- | internal/failover/monitor_test.go | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/internal/failover/monitor_test.go b/internal/failover/monitor_test.go new file mode 100644 index 0000000..87fb3cd --- /dev/null +++ b/internal/failover/monitor_test.go @@ -0,0 +1,106 @@ +package failover + +import ( + "context" + "errors" + "io" + "testing" + "time" + + "github.com/eduvpn/eduvpn-common/internal/test" +) + +// mockedPinger is a ping sender that always returns nil for sending +// but returns EOF for reading +type mockedPinger struct{} + +func (mp *mockedPinger) Read(_ time.Time) error { + return io.EOF +} + +func (mp *mockedPinger) Send(_ int) error { + return nil +} + +func TestMonitor(t *testing.T) { + cases := []struct { + interval time.Duration + pDropped int + readRxBytes func() (int64, error) + gateway string + mtuSize int + disableDefaults bool + mockedPinger func(gateway string, mtu int) (sender, error) + wantDropped bool + wantErr string + }{ + { + mtuSize: 1, + wantDropped: false, + wantErr: "invalid MTU size given, MTU has to be at least: 28 bytes", + }, + { + readRxBytes: func() (int64, error) { + return 0, errors.New("error test") + }, + wantDropped: false, + wantErr: "error test", + }, + // default case, not dropped + {}, + // readRxBytes always returns 0 + // still we do not want a drop because we get a pong from 127.0.0.1 + { + readRxBytes: func() (int64, error) { + return 0, nil + }, + wantDropped: false, + }, + // readRxBytes always returns 0 + // we want dropped as the mock pinger does nothing + { + readRxBytes: func() (int64, error) { + return 0, nil + }, + gateway: "127.0.0.1", + mockedPinger: func(_ string, _ int) (sender, error) { + return &mockedPinger{}, nil + }, + wantDropped: true, + }, + } + + for _, c := range cases { + var counter int64 + // some defaults + if c.interval == 0 { + c.interval = 2 * time.Second + } + if c.pDropped == 0 { + c.pDropped = 5 + } + if c.gateway == "" { + c.gateway = "127.0.0.1" + } + if c.mtuSize == 0 { + c.mtuSize = 28 + } + if c.readRxBytes == nil { + c.readRxBytes = func() (int64, error) { + defer func() { + counter++ + }() + return counter, nil + } + } + dcm := NewDroppedMonitor(c.interval, c.pDropped, c.readRxBytes) + if c.mockedPinger != nil { + dcm.newPinger = c.mockedPinger + } + dropped, err := dcm.Start(context.Background(), c.gateway, c.mtuSize) + if dropped != c.wantDropped { + t.Fatalf("dropped is not equal to want dropped, got: %v, want: %v", dropped, c.wantDropped) + } + test.AssertError(t, err, c.wantErr) + } +} |
