diff options
author | Kali Kaneko (leap communications) <kali@leap.se> | 2019-01-12 18:39:45 +0100 |
---|---|---|
committer | Ruben Pollan <meskio@sindominio.net> | 2019-01-17 12:30:32 +0100 |
commit | b1247d2d0d51108c910a73891ff3116e5f032ab1 (patch) | |
tree | e9948964f0bfb1ad2df3bc7bad02aa1f41ccfbd8 /vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/event_test.go | |
parent | efcb8312e31b5c2261b1a1e95ace55b322cfcc27 (diff) |
[pkg] all your deps are vendored to us
Diffstat (limited to 'vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/event_test.go')
-rw-r--r-- | vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/event_test.go | 346 |
1 files changed, 346 insertions, 0 deletions
diff --git a/vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/event_test.go b/vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/event_test.go new file mode 100644 index 0000000..81a02e1 --- /dev/null +++ b/vendor/github.com/apparentlymart/go-openvpn-mgmt/openvpn/event_test.go @@ -0,0 +1,346 @@ +package openvpn + +import ( + "fmt" + "testing" +) + +// A key requirement of our event parsing is that it must never cause a +// panic, even if the OpenVPN process sends us malformed garbage. +// +// Therefore most of the tests in here are testing various tortured error +// cases, which are all expected to produce an event object, though the +// contents of that event object will be nonsensical if the OpenVPN server +// sends something nonsensical. + +func TestMalformedEvent(t *testing.T) { + testCases := [][]byte{ + []byte(""), + []byte("HTTP/1.1 200 OK"), + []byte(" "), + []byte("\x00"), + } + + for i, testCase := range testCases { + event := upgradeEvent(testCase) + + var malformed *MalformedEvent + var ok bool + if malformed, ok = event.(*MalformedEvent); !ok { + t.Errorf("test %d got %T; want %T", i, event, malformed) + continue + } + + wantString := fmt.Sprintf("Malformed Event %q", testCase) + if gotString := malformed.String(); gotString != wantString { + t.Errorf("test %d String returned %q; want %q", i, gotString, wantString) + } + } +} + +func TestUnknownEvent(t *testing.T) { + type TestCase struct { + Input []byte + WantType string + WantBody string + } + testCases := []TestCase{ + { + Input: []byte("DUMMY:baz"), + WantType: "DUMMY", + WantBody: "baz", + }, + { + Input: []byte("DUMMY:"), + WantType: "DUMMY", + WantBody: "", + }, + { + Input: []byte("DUMMY:abc,123,456"), + WantType: "DUMMY", + WantBody: "abc,123,456", + }, + } + + for i, testCase := range testCases { + event := upgradeEvent(testCase.Input) + + var unk *UnknownEvent + var ok bool + if unk, ok = event.(*UnknownEvent); !ok { + t.Errorf("test %d got %T; want %T", i, event, unk) + continue + } + + if got, want := unk.Type(), testCase.WantType; got != want { + t.Errorf("test %d Type returned %q; want %q", i, got, want) + } + if got, want := unk.Body(), testCase.WantBody; got != want { + t.Errorf("test %d Body returned %q; want %q", i, got, want) + } + } +} + +func TestHoldEvent(t *testing.T) { + testCases := [][]byte{ + []byte("HOLD:"), + []byte("HOLD:waiting for hold release"), + } + + for i, testCase := range testCases { + event := upgradeEvent(testCase) + + var hold *HoldEvent + var ok bool + if hold, ok = event.(*HoldEvent); !ok { + t.Errorf("test %d got %T; want %T", i, event, hold) + continue + } + } +} + +func TestEchoEvent(t *testing.T) { + type TestCase struct { + Input []byte + WantTimestamp string + WantMessage string + } + testCases := []TestCase{ + { + Input: []byte("ECHO:123,foo"), + WantTimestamp: "123", + WantMessage: "foo", + }, + { + Input: []byte("ECHO:123,"), + WantTimestamp: "123", + WantMessage: "", + }, + { + Input: []byte("ECHO:,foo"), + WantTimestamp: "", + WantMessage: "foo", + }, + { + Input: []byte("ECHO:,"), + WantTimestamp: "", + WantMessage: "", + }, + { + Input: []byte("ECHO:"), + WantTimestamp: "", + WantMessage: "", + }, + } + + for i, testCase := range testCases { + event := upgradeEvent(testCase.Input) + + var echo *EchoEvent + var ok bool + if echo, ok = event.(*EchoEvent); !ok { + t.Errorf("test %d got %T; want %T", i, event, echo) + continue + } + + if got, want := echo.RawTimestamp(), testCase.WantTimestamp; got != want { + t.Errorf("test %d RawTimestamp returned %q; want %q", i, got, want) + } + if got, want := echo.Message(), testCase.WantMessage; got != want { + t.Errorf("test %d Message returned %q; want %q", i, got, want) + } + } +} + +func TestStateEvent(t *testing.T) { + type TestCase struct { + Input []byte + WantTimestamp string + WantState string + WantDesc string + WantLocalAddr string + WantRemoteAddr string + } + testCases := []TestCase{ + { + Input: []byte("STATE:"), + WantTimestamp: "", + WantState: "", + WantDesc: "", + WantLocalAddr: "", + WantRemoteAddr: "", + }, + { + Input: []byte("STATE:,"), + WantTimestamp: "", + WantState: "", + WantDesc: "", + WantLocalAddr: "", + WantRemoteAddr: "", + }, + { + Input: []byte("STATE:,,,,"), + WantTimestamp: "", + WantState: "", + WantDesc: "", + WantLocalAddr: "", + WantRemoteAddr: "", + }, + { + Input: []byte("STATE:123,CONNECTED,good,172.16.0.1,192.168.4.1"), + WantTimestamp: "123", + WantState: "CONNECTED", + WantDesc: "good", + WantLocalAddr: "172.16.0.1", + WantRemoteAddr: "192.168.4.1", + }, + { + Input: []byte("STATE:123,RECONNECTING,SIGHUP,,"), + WantTimestamp: "123", + WantState: "RECONNECTING", + WantDesc: "SIGHUP", + WantLocalAddr: "", + WantRemoteAddr: "", + }, + { + Input: []byte("STATE:123,RECONNECTING,SIGHUP,,,extra"), + WantTimestamp: "123", + WantState: "RECONNECTING", + WantDesc: "SIGHUP", + WantLocalAddr: "", + WantRemoteAddr: "", + }, + } + + for i, testCase := range testCases { + event := upgradeEvent(testCase.Input) + + var st *StateEvent + var ok bool + if st, ok = event.(*StateEvent); !ok { + t.Errorf("test %d got %T; want %T", i, event, st) + continue + } + + if got, want := st.RawTimestamp(), testCase.WantTimestamp; got != want { + t.Errorf("test %d RawTimestamp returned %q; want %q", i, got, want) + } + if got, want := st.NewState(), testCase.WantState; got != want { + t.Errorf("test %d NewState returned %q; want %q", i, got, want) + } + if got, want := st.Description(), testCase.WantDesc; got != want { + t.Errorf("test %d Description returned %q; want %q", i, got, want) + } + if got, want := st.LocalTunnelAddr(), testCase.WantLocalAddr; got != want { + t.Errorf("test %d LocalTunnelAddr returned %q; want %q", i, got, want) + } + if got, want := st.RemoteAddr(), testCase.WantRemoteAddr; got != want { + t.Errorf("test %d RemoteAddr returned %q; want %q", i, got, want) + } + } +} + +func TestByteCountEvent(t *testing.T) { + type TestCase struct { + Input []byte + WantClientId string + WantBytesIn int + WantBytesOut int + } + testCases := []TestCase{ + { + Input: []byte("BYTECOUNT:"), + WantClientId: "", + WantBytesIn: 0, + WantBytesOut: 0, + }, + { + Input: []byte("BYTECOUNT:123,456"), + WantClientId: "", + WantBytesIn: 123, + WantBytesOut: 456, + }, + { + Input: []byte("BYTECOUNT:,"), + WantClientId: "", + WantBytesIn: 0, + WantBytesOut: 0, + }, + { + Input: []byte("BYTECOUNT:5,"), + WantClientId: "", + WantBytesIn: 5, + WantBytesOut: 0, + }, + { + Input: []byte("BYTECOUNT:,6"), + WantClientId: "", + WantBytesIn: 0, + WantBytesOut: 6, + }, + { + Input: []byte("BYTECOUNT:6"), + WantClientId: "", + WantBytesIn: 6, + WantBytesOut: 0, + }, + { + Input: []byte("BYTECOUNT:wrong,bad"), + WantClientId: "", + WantBytesIn: 0, + WantBytesOut: 0, + }, + { + Input: []byte("BYTECOUNT:1,2,3"), + WantClientId: "", + WantBytesIn: 1, + WantBytesOut: 2, + }, + { + // Intentionally malformed BYTECOUNT event sent as BYTECOUNT_CLI + Input: []byte("BYTECOUNT_CLI:123,456"), + WantClientId: "123", + WantBytesIn: 456, + WantBytesOut: 0, + }, + { + Input: []byte("BYTECOUNT_CLI:"), + WantClientId: "", + WantBytesIn: 0, + WantBytesOut: 0, + }, + { + Input: []byte("BYTECOUNT_CLI:abc123,123,456"), + WantClientId: "abc123", + WantBytesIn: 123, + WantBytesOut: 456, + }, + { + Input: []byte("BYTECOUNT_CLI:abc123,123"), + WantClientId: "abc123", + WantBytesIn: 123, + WantBytesOut: 0, + }, + } + + for i, testCase := range testCases { + event := upgradeEvent(testCase.Input) + + var bc *ByteCountEvent + var ok bool + if bc, ok = event.(*ByteCountEvent); !ok { + t.Errorf("test %d got %T; want %T", i, event, bc) + continue + } + + if got, want := bc.ClientId(), testCase.WantClientId; got != want { + t.Errorf("test %d ClientId returned %q; want %q", i, got, want) + } + if got, want := bc.BytesIn(), testCase.WantBytesIn; got != want { + t.Errorf("test %d BytesIn returned %d; want %d", i, got, want) + } + if got, want := bc.BytesOut(), testCase.WantBytesOut; got != want { + t.Errorf("test %d BytesOut returned %d; want %d", i, got, want) + } + } +} |