github.com/cilium/cilium@v1.16.2/pkg/hubble/filters/filters_test.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright Authors of Hubble 3 4 package filters 5 6 import ( 7 "context" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 12 flowpb "github.com/cilium/cilium/api/v1/flow" 13 v1 "github.com/cilium/cilium/pkg/hubble/api/v1" 14 ) 15 16 func TestApply(t *testing.T) { 17 ffyes := FilterFuncs{func(_ *v1.Event) bool { 18 return true 19 }} 20 ffno := FilterFuncs{func(_ *v1.Event) bool { 21 return false 22 }} 23 24 type args struct { 25 whitelist FilterFuncs 26 blacklist FilterFuncs 27 ev *v1.Event 28 } 29 tests := []struct { 30 name string 31 args args 32 want bool 33 }{ 34 {args: args{whitelist: ffyes}, want: true}, 35 {args: args{whitelist: ffno}, want: false}, 36 {args: args{blacklist: ffno}, want: true}, 37 {args: args{blacklist: ffyes}, want: false}, 38 {args: args{whitelist: ffyes, blacklist: ffyes}, want: false}, 39 {args: args{whitelist: ffyes, blacklist: ffno}, want: true}, 40 {args: args{whitelist: ffno, blacklist: ffyes}, want: false}, 41 {args: args{whitelist: ffno, blacklist: ffno}, want: false}, 42 {args: args{}, want: true}, 43 } 44 for _, tt := range tests { 45 t.Run(tt.name, func(t *testing.T) { 46 if got := Apply(tt.args.whitelist, tt.args.blacklist, tt.args.ev); got != tt.want { 47 t.Errorf("Apply() = %v, want %v", got, tt.want) 48 } 49 }) 50 } 51 } 52 53 func TestMatch(t *testing.T) { 54 fyes := func(_ *v1.Event) bool { 55 return true 56 } 57 fno := func(_ *v1.Event) bool { 58 return false 59 } 60 fs := FilterFuncs{fyes, fno} 61 assert.False(t, fs.MatchAll(nil)) 62 assert.True(t, fs.MatchOne(nil)) 63 assert.False(t, fs.MatchNone(nil)) 64 65 // When no filter is specified, MatchAll(), MatchOne() and MatchNone() must 66 // all return true 67 fs = FilterFuncs{} 68 assert.True(t, fs.MatchAll(nil)) 69 assert.True(t, fs.MatchOne(nil)) 70 assert.True(t, fs.MatchNone(nil)) 71 } 72 73 type testFilterTrue struct{} 74 75 func (t *testFilterTrue) OnBuildFilter(_ context.Context, ff *flowpb.FlowFilter) ([]FilterFunc, error) { 76 return []FilterFunc{func(ev *v1.Event) bool { return true }}, nil 77 } 78 79 type testFilterFalse struct{} 80 81 func (t *testFilterFalse) OnBuildFilter(_ context.Context, ff *flowpb.FlowFilter) ([]FilterFunc, error) { 82 return []FilterFunc{func(ev *v1.Event) bool { return false }}, nil 83 } 84 85 func TestOnBuildFilter(t *testing.T) { 86 fl, err := BuildFilterList(context.Background(), 87 []*flowpb.FlowFilter{{SourceIdentity: []uint32{1, 2, 3}}}, // true 88 []OnBuildFilter{&testFilterTrue{}}) // true 89 assert.NoError(t, err) 90 assert.Equal(t, true, fl.MatchAll(&v1.Event{Event: &flowpb.Flow{ 91 Source: &flowpb.Endpoint{Identity: 3}, 92 }})) 93 94 fl, err = BuildFilterList(context.Background(), 95 []*flowpb.FlowFilter{{SourceIdentity: []uint32{1, 2, 3}}}, // true 96 []OnBuildFilter{&testFilterFalse{}}) // false 97 assert.NoError(t, err) 98 assert.Equal(t, false, fl.MatchAll(&v1.Event{Event: &flowpb.Flow{ 99 Source: &flowpb.Endpoint{Identity: 3}, 100 }})) 101 102 fl, err = BuildFilterList(context.Background(), 103 []*flowpb.FlowFilter{{SourceIdentity: []uint32{1, 2, 3}}}, // true 104 []OnBuildFilter{ 105 &testFilterFalse{}, // false 106 &testFilterTrue{}}) // true 107 assert.NoError(t, err) 108 assert.Equal(t, false, fl.MatchAll(&v1.Event{Event: &flowpb.Flow{ 109 Source: &flowpb.Endpoint{Identity: 3}, 110 }})) 111 }