github.com/cilium/cilium@v1.16.2/pkg/hubble/filters/labelparser_test.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // Copyright Authors of Hubble
     3  
     4  package filters
     5  
     6  import (
     7  	"reflect"
     8  	"testing"
     9  )
    10  
    11  func Test_translateSelector(t *testing.T) {
    12  	tests := []struct {
    13  		name    string
    14  		in      string
    15  		want    string
    16  		wantErr bool
    17  	}{
    18  		{
    19  			name: "simple",
    20  			in:   "foo",
    21  			want: "any.foo",
    22  		},
    23  		{
    24  			name: "multiple",
    25  			in:   "foo, bar",
    26  			want: "any.foo, any.bar",
    27  		},
    28  		{
    29  			name: "with prefix",
    30  			in:   "k8s:foo, bar",
    31  			want: "k8s.foo, any.bar",
    32  		},
    33  		{
    34  			name: "with negation",
    35  			in:   "k8s:foo, !bar",
    36  			want: "k8s.foo, !any.bar",
    37  		},
    38  		{
    39  			name: "with negation",
    40  			in:   "k8s:foo, !bar",
    41  			want: "k8s.foo, !any.bar",
    42  		},
    43  		{
    44  			name: "match value",
    45  			in:   "foo, bar=buzz",
    46  			want: "any.foo, any.bar=buzz",
    47  		},
    48  		{
    49  			name: "don't match value",
    50  			in:   "foo, bar!= buzz",
    51  			want: "any.foo, any.bar!= buzz",
    52  		},
    53  		{
    54  			name: "in values",
    55  			in:   "foo in (a,b,c)",
    56  			want: "any.foo in (a,b,c)",
    57  		},
    58  		{
    59  			name: "notin values",
    60  			in:   "foo notin   (a,b,c)",
    61  			want: "any.foo notin   (a,b,c)",
    62  		},
    63  		{
    64  			name: "with dots",
    65  			in:   "foo.example.com, bar.example.com=buzz",
    66  			want: "any.foo.example.com, any.bar.example.com=buzz",
    67  		},
    68  		{
    69  			name: "dots and colons in value",
    70  			in:   "foo.example.com=some:other.thing, bar.example.com=buzz:any:thing.example.org",
    71  			want: "any.foo.example.com=some:other.thing, any.bar.example.com=buzz:any:thing.example.org",
    72  		},
    73  		{
    74  			name: "edgecase missing values",
    75  			in:   "x in (foo,,baz),y,z notin ()",
    76  			want: "any.x in (foo,,baz),any.y,any.z notin ()",
    77  		},
    78  		{
    79  			name: "multi value edgecase",
    80  			in:   "foo.example.com in (foo, any.bar, k8s:buzz, some.other,, end), k8s:bar in (a,b,c,  ,d,  e,),!any:test",
    81  			want: "any.foo.example.com in (foo, any.bar, k8s:buzz, some.other,, end), k8s.bar in (a,b,c,  ,d,  e,),!any.test",
    82  		},
    83  		{
    84  			name: "complex edgecase",
    85  			in:   "a=b, foo:bar, !k8s:b, foo in  (a, ,   c, d), !any:buzz, c!= d.e, foo:bar.example.com=any.value, !any.other, k8s.example.com in (foo.bar, bar.buzz,  a)",
    86  			want: "any.a=b, foo.bar, !k8s.b, any.foo in  (a, ,   c, d), !any.buzz, any.c!= d.e, foo.bar.example.com=any.value, !any.any.other, any.k8s.example.com in (foo.bar, bar.buzz,  a)",
    87  		},
    88  	}
    89  	for _, tt := range tests {
    90  		t.Run(tt.name, func(t *testing.T) {
    91  			got, err := translateSelector(tt.in)
    92  			if (err != nil) != tt.wantErr {
    93  				t.Errorf("parseSelector() error = %v, wantErr %v", err, tt.wantErr)
    94  				return
    95  			}
    96  			if !tt.wantErr && !reflect.DeepEqual(got, tt.want) {
    97  				t.Errorf("parseSelector() = %q, want %q", got, tt.want)
    98  			}
    99  		})
   100  	}
   101  }