| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | package api |
| 4 | |
| 5 | import ( |
| 6 | "context" |
| 7 | "errors" |
| 8 | "testing" |
| 9 | |
| 10 | "github.com/stretchr/testify/assert" |
| 11 | "github.com/stretchr/testify/require" |
| 12 | "layeh.com/radius" |
| 13 | ) |
| 14 | |
| 15 | func TestNew(t *testing.T) { |
| 16 | assert.NotNil(t, New(Config{})) |
| 17 | } |
| 18 | |
| 19 | func TestClient_Status(t *testing.T) { |
| 20 | var c Client |
| 21 | c.radiusClient = newOKMockFreeRADIUSClient() |
| 22 | |
| 23 | expected := Status{ |
| 24 | AccessRequests: 1, |
| 25 | AccessAccepts: 2, |
| 26 | AccessRejects: 3, |
| 27 | AccessChallenges: 4, |
| 28 | AuthResponses: 5, |
| 29 | AuthDuplicateRequests: 6, |
| 30 | AuthMalformedRequests: 7, |
| 31 | AuthInvalidRequests: 8, |
| 32 | AuthDroppedRequests: 9, |
| 33 | AuthUnknownTypes: 10, |
| 34 | AccountingRequests: 11, |
| 35 | AccountingResponses: 12, |
| 36 | AcctDuplicateRequests: 13, |
| 37 | AcctMalformedRequests: 14, |
| 38 | AcctInvalidRequests: 15, |
| 39 | AcctDroppedRequests: 16, |
| 40 | AcctUnknownTypes: 17, |
| 41 | ProxyAccessRequests: 18, |
| 42 | ProxyAccessAccepts: 19, |
| 43 | ProxyAccessRejects: 20, |
| 44 | ProxyAccessChallenges: 21, |
| 45 | ProxyAuthResponses: 22, |
| 46 | ProxyAuthDuplicateRequests: 23, |
| 47 | ProxyAuthMalformedRequests: 24, |
| 48 | ProxyAuthInvalidRequests: 25, |
| 49 | ProxyAuthDroppedRequests: 26, |
| 50 | ProxyAuthUnknownTypes: 27, |
| 51 | ProxyAccountingRequests: 28, |
| 52 | ProxyAccountingResponses: 29, |
| 53 | ProxyAcctDuplicateRequests: 30, |
| 54 | ProxyAcctMalformedRequests: 31, |
| 55 | ProxyAcctInvalidRequests: 32, |
| 56 | ProxyAcctDroppedRequests: 33, |
| 57 | ProxyAcctUnknownTypes: 34, |
| 58 | } |
| 59 | |
| 60 | s, err := c.Status() |
| 61 | |
| 62 | require.NoError(t, err) |
| 63 | assert.Equal(t, expected, *s) |
| 64 | } |
| 65 | |
| 66 | func TestClient_Status_ReturnsErrorIfClientExchangeReturnsError(t *testing.T) { |
| 67 | var c Client |
| 68 | c.radiusClient = newErrorMockFreeRADIUSClient() |
| 69 | |
| 70 | s, err := c.Status() |
| 71 | |
| 72 | assert.Nil(t, s) |
| 73 | assert.Error(t, err) |
| 74 | } |
| 75 | |
| 76 | func TestClient_Status_ReturnsErrorIfServerResponseHasBadStatus(t *testing.T) { |
| 77 | var c Client |
| 78 | c.radiusClient = newBadRespCodeMockFreeRADIUSClient() |
| 79 | |
| 80 | s, err := c.Status() |
| 81 | |
| 82 | assert.Nil(t, s) |
| 83 | assert.Error(t, err) |
| 84 | } |
| 85 | |
| 86 | type mockFreeRADIUSClient struct { |
| 87 | errOnExchange bool |
| 88 | badRespCode bool |
| 89 | } |
| 90 | |
| 91 | func newOKMockFreeRADIUSClient() *mockFreeRADIUSClient { |
| 92 | return &mockFreeRADIUSClient{} |
| 93 | } |
| 94 | |
| 95 | func newErrorMockFreeRADIUSClient() *mockFreeRADIUSClient { |
| 96 | return &mockFreeRADIUSClient{errOnExchange: true} |
| 97 | } |
| 98 | |
| 99 | func newBadRespCodeMockFreeRADIUSClient() *mockFreeRADIUSClient { |
| 100 | return &mockFreeRADIUSClient{badRespCode: true} |
| 101 | } |
| 102 | |
| 103 | func (m mockFreeRADIUSClient) Exchange(_ context.Context, _ *radius.Packet, _ string) (*radius.Packet, error) { |
| 104 | if m.errOnExchange { |
| 105 | return nil, errors.New("mock Exchange error") |
| 106 | } |
| 107 | resp := radius.New(radius.CodeAccessAccept, []byte("secret")) |
| 108 | if m.badRespCode { |
| 109 | resp.Code = radius.CodeAccessReject |
| 110 | } else { |
| 111 | resp.Code = radius.CodeAccessAccept |
| 112 | } |
| 113 | addValues(resp) |
| 114 | return resp, nil |
| 115 | } |
| 116 | |
| 117 | func addValues(resp *radius.Packet) { |
| 118 | _ = FreeRADIUSTotalAccessRequests_Add(resp, 1) |
| 119 | _ = FreeRADIUSTotalAccessAccepts_Add(resp, 2) |
| 120 | _ = FreeRADIUSTotalAccessRejects_Add(resp, 3) |
| 121 | _ = FreeRADIUSTotalAccessChallenges_Add(resp, 4) |
| 122 | _ = FreeRADIUSTotalAuthResponses_Add(resp, 5) |
| 123 | _ = FreeRADIUSTotalAuthDuplicateRequests_Add(resp, 6) |
| 124 | _ = FreeRADIUSTotalAuthMalformedRequests_Add(resp, 7) |
| 125 | _ = FreeRADIUSTotalAuthInvalidRequests_Add(resp, 8) |
| 126 | _ = FreeRADIUSTotalAuthDroppedRequests_Add(resp, 9) |
| 127 | _ = FreeRADIUSTotalAuthUnknownTypes_Add(resp, 10) |
| 128 | _ = FreeRADIUSTotalAccountingRequests_Add(resp, 11) |
| 129 | _ = FreeRADIUSTotalAccountingResponses_Add(resp, 12) |
| 130 | _ = FreeRADIUSTotalAcctDuplicateRequests_Add(resp, 13) |
| 131 | _ = FreeRADIUSTotalAcctMalformedRequests_Add(resp, 14) |
| 132 | _ = FreeRADIUSTotalAcctInvalidRequests_Add(resp, 15) |
| 133 | _ = FreeRADIUSTotalAcctDroppedRequests_Add(resp, 16) |
| 134 | _ = FreeRADIUSTotalAcctUnknownTypes_Add(resp, 17) |
| 135 | _ = FreeRADIUSTotalProxyAccessRequests_Add(resp, 18) |
| 136 | _ = FreeRADIUSTotalProxyAccessAccepts_Add(resp, 19) |
| 137 | _ = FreeRADIUSTotalProxyAccessRejects_Add(resp, 20) |
| 138 | _ = FreeRADIUSTotalProxyAccessChallenges_Add(resp, 21) |
| 139 | _ = FreeRADIUSTotalProxyAuthResponses_Add(resp, 22) |
| 140 | _ = FreeRADIUSTotalProxyAuthDuplicateRequests_Add(resp, 23) |
| 141 | _ = FreeRADIUSTotalProxyAuthMalformedRequests_Add(resp, 24) |
| 142 | _ = FreeRADIUSTotalProxyAuthInvalidRequests_Add(resp, 25) |
| 143 | _ = FreeRADIUSTotalProxyAuthDroppedRequests_Add(resp, 26) |
| 144 | _ = FreeRADIUSTotalProxyAuthUnknownTypes_Add(resp, 27) |
| 145 | _ = FreeRADIUSTotalProxyAccountingRequests_Add(resp, 28) |
| 146 | _ = FreeRADIUSTotalProxyAccountingResponses_Add(resp, 29) |
| 147 | _ = FreeRADIUSTotalProxyAcctDuplicateRequests_Add(resp, 30) |
| 148 | _ = FreeRADIUSTotalProxyAcctMalformedRequests_Add(resp, 31) |
| 149 | _ = FreeRADIUSTotalProxyAcctInvalidRequests_Add(resp, 32) |
| 150 | _ = FreeRADIUSTotalProxyAcctDroppedRequests_Add(resp, 33) |
| 151 | _ = FreeRADIUSTotalProxyAcctUnknownTypes_Add(resp, 34) |
| 152 | } |