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  }