Skip to content

Commit c8b9660

Browse files
committed
more tests
1 parent 100df76 commit c8b9660

File tree

2 files changed

+73
-34
lines changed

2 files changed

+73
-34
lines changed

pkg/auditserver/server.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,6 @@ func (as *AuditServer) React(frame []byte, c gnet.Conn) (out []byte, action gnet
174174
// zero‑copy write to log when possible
175175
if rg.Writer != nil {
176176
_, _ = rg.Writer.Write(frame)
177-
_, _ = rg.Writer.Write([]byte{'\n'})
178177
} else {
179178
rg.Logger.Print(string(frame))
180179
}
@@ -251,10 +250,7 @@ func New(logger *slog.Logger) (*AuditServer, error) {
251250
var messenger messaging.Messenger
252251
switch rgConfig.Messaging.Type {
253252
case "mattermost":
254-
messenger = messaging.NewMattermostMessenger(
255-
rgConfig.Messaging.URL,
256-
rgConfig.Messaging.Token,
257-
rgConfig.Messaging.Channel)
253+
messenger = messaging.NewMattermostMessenger(rgConfig.Messaging.URL, rgConfig.Messaging.Token, rgConfig.Messaging.Channel)
258254
case "mattermost_webhook":
259255
messenger = messaging.NewMattermostWebhookMessenger(rgConfig.Messaging.WebhookURL)
260256
default:

pkg/auditserver/server_test.go

Lines changed: 72 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ import (
55
"encoding/json"
66
"errors"
77
"fmt"
8-
"github.com/ncode/vault-audit-filter/pkg/forwarder"
9-
"github.com/ncode/vault-audit-filter/pkg/messaging"
8+
"github.com/expr-lang/expr/vm"
109
"github.com/stretchr/testify/require"
1110
"io"
1211
"io/ioutil"
12+
"log"
1313
"net"
1414
"net/http"
1515
"net/http/httptest"
@@ -829,22 +829,23 @@ func auditFrame() []byte {
829829
return []byte(`{"type":"request","time":"2000-01-01T00:00:00Z","auth":{},"request":{},"response":{}}`)
830830
}
831831

832-
// rule‑group factory: match=true → no rules (auto‑match); match=false → 1 rule that always fails.
833-
func newRuleGroup(match bool, msgr messaging.Messenger, fwd forwarder.Forwarder) RuleGroup {
834-
var compiled []CompiledRule
835-
if !match {
836-
compiled = []CompiledRule{{Program: nil}} // any non‑nil slice forces shouldLog=false
837-
}
838-
return RuleGroup{
839-
Name: "grp",
840-
CompiledRules: compiled,
841-
Messenger: msgr,
842-
Forwarder: fwd,
843-
Writer: new(bytes.Buffer), // satisfies io.Writer, avoids disk I/O
844-
}
832+
// returns a compiled rule that always evaluates to false
833+
func falseProgram(t *testing.T) *vm.Program {
834+
t.Helper()
835+
p, err := expr.Compile("false")
836+
require.NoError(t, err)
837+
return p
845838
}
846839

847840
func TestReact_Branches(t *testing.T) {
841+
logger := slog.New(slog.NewTextHandler(io.Discard, &slog.HandlerOptions{Level: slog.LevelDebug}))
842+
frame := auditFrame()
843+
844+
newBufLogger := func() (*bytes.Buffer, *log.Logger) {
845+
buf := new(bytes.Buffer)
846+
return buf, log.New(buf, "", 0)
847+
}
848+
848849
tests := []struct {
849850
name string
850851
group RuleGroup
@@ -853,43 +854,85 @@ func TestReact_Branches(t *testing.T) {
853854
wantFwdCalls int
854855
}{
855856
{
856-
name: "match_no_side_effects_returns_None",
857-
group: newRuleGroup(true, nil, nil),
857+
name: "match_no_side_effects_returns_None",
858+
group: RuleGroup{
859+
Name: "matchOnly",
860+
// len==0 => always matches
861+
CompiledRules: nil,
862+
Writer: new(bytes.Buffer),
863+
},
864+
wantAction: gnet.None,
865+
},
866+
{
867+
name: "logger_print_branch_returns_None",
868+
group: func() RuleGroup {
869+
// Writer nil so else branch executes
870+
buf, lg := newBufLogger()
871+
_ = buf // buffer retained if inspection desired
872+
return RuleGroup{
873+
Name: "loggerPrint",
874+
CompiledRules: nil,
875+
Logger: lg,
876+
Writer: nil,
877+
}
878+
}(),
858879
wantAction: gnet.None,
859880
},
860881
{
861-
name: "forwarder_ok_triggers_Close",
862-
group: newRuleGroup(true, nil, &dummyForwarder{}),
882+
name: "forwarder_ok_triggers_Close",
883+
group: RuleGroup{
884+
Name: "forwardOK",
885+
CompiledRules: nil,
886+
Writer: new(bytes.Buffer),
887+
Forwarder: &dummyForwarder{},
888+
},
863889
wantAction: gnet.Close,
864890
wantFwdCalls: 1,
865891
},
866892
{
867-
name: "forwarder_error_triggers_Close",
868-
group: newRuleGroup(true, nil, &dummyForwarder{forwardErr: errors.New("x")}),
893+
name: "forwarder_error_triggers_Close",
894+
group: RuleGroup{
895+
Name: "forwardErr",
896+
CompiledRules: nil,
897+
Writer: new(bytes.Buffer),
898+
Forwarder: &dummyForwarder{forwardErr: errors.New("boom")},
899+
},
869900
wantAction: gnet.Close,
870901
wantFwdCalls: 1,
871902
},
872903
{
873-
name: "messenger_error_triggers_Close",
874-
group: newRuleGroup(true, &dummyMessenger{sendErr: errors.New("x")}, nil),
904+
name: "messenger_error_triggers_Close",
905+
group: RuleGroup{
906+
Name: "msgErr",
907+
CompiledRules: nil,
908+
Writer: new(bytes.Buffer),
909+
Messenger: &dummyMessenger{sendErr: errors.New("boom")},
910+
},
875911
wantAction: gnet.Close,
876912
wantMsgCalls: 1,
877913
},
878914
{
879-
name: "no_match_triggers_Close",
880-
group: newRuleGroup(false, nil, nil),
915+
name: "no_match_triggers_Close",
916+
group: RuleGroup{
917+
Name: "noMatch",
918+
CompiledRules: []CompiledRule{{
919+
Program: falseProgram(t),
920+
}},
921+
Writer: new(bytes.Buffer),
922+
},
881923
wantAction: gnet.Close,
882924
},
883925
}
884926

885-
frame := auditFrame()
886-
887927
for _, tc := range tests {
888928
tc := tc // capture range variable
889929
t.Run(tc.name, func(t *testing.T) {
890-
srv := &AuditServer{ruleGroups: []RuleGroup{tc.group}}
891-
_, act := srv.React(frame, nil)
930+
srv := &AuditServer{
931+
logger: logger,
932+
ruleGroups: []RuleGroup{tc.group},
933+
}
892934

935+
_, act := srv.React(frame, nil)
893936
require.Equal(t, tc.wantAction, act)
894937

895938
if dm, ok := tc.group.Messenger.(*dummyMessenger); ok {

0 commit comments

Comments
 (0)