@@ -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
847840func 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