github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/swarmkit/manager/constraint/constraint_test.go (about)

     1  package constraint
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/assert"
     7  )
     8  
     9  func TestParse(t *testing.T) {
    10  	// empty string
    11  	_, err := Parse([]string{""})
    12  	assert.Error(t, err)
    13  
    14  	_, err = Parse([]string{" "})
    15  	assert.Error(t, err)
    16  
    17  	// no operator
    18  	_, err = Parse([]string{"nodeabc"})
    19  	assert.Error(t, err)
    20  
    21  	// incorrect operator
    22  	_, err = Parse([]string{"node ~ abc"})
    23  	assert.Error(t, err)
    24  
    25  	// Cannot use the leading digit for key
    26  	_, err = Parse([]string{"1node==a2"})
    27  	assert.Error(t, err)
    28  
    29  	// leading and trailing white space are ignored
    30  	_, err = Parse([]string{" node == node1"})
    31  	assert.NoError(t, err)
    32  
    33  	// key cannot container white space in the middle
    34  	_, err = Parse([]string{"no de== node1"})
    35  	assert.Error(t, err)
    36  
    37  	// Cannot use * in key
    38  	_, err = Parse([]string{"no*de==node1"})
    39  	assert.Error(t, err)
    40  
    41  	// key cannot be empty
    42  	_, err = Parse([]string{"==node1"})
    43  	assert.Error(t, err)
    44  
    45  	// value cannot be empty
    46  	_, err = Parse([]string{"node=="})
    47  	assert.Error(t, err)
    48  
    49  	// value cannot be an empty space
    50  	_, err = Parse([]string{"node== "})
    51  	assert.Error(t, err)
    52  
    53  	// Cannot use $ in key
    54  	_, err = Parse([]string{"no$de==node1"})
    55  	assert.Error(t, err)
    56  
    57  	// Allow CAPS in key
    58  	exprs, err := Parse([]string{"NoDe==node1"})
    59  	assert.NoError(t, err)
    60  	assert.Equal(t, exprs[0].key, "NoDe")
    61  
    62  	// Allow dot in key
    63  	exprs, err = Parse([]string{"no.de==node1"})
    64  	assert.NoError(t, err)
    65  	assert.Equal(t, exprs[0].key, "no.de")
    66  
    67  	// Allow leading underscore
    68  	exprs, err = Parse([]string{"_node==_node1"})
    69  	assert.NoError(t, err)
    70  	assert.Equal(t, exprs[0].key, "_node")
    71  
    72  	// Allow special characters in exp
    73  	exprs, err = Parse([]string{"node==[a-b]+c*(n|b)/"})
    74  	assert.NoError(t, err)
    75  	assert.Equal(t, exprs[0].key, "node")
    76  	assert.Equal(t, exprs[0].exp, "[a-b]+c*(n|b)/")
    77  
    78  	// Allow space in Exp
    79  	exprs, err = Parse([]string{"node==node 1"})
    80  	assert.NoError(t, err)
    81  	assert.Equal(t, exprs[0].key, "node")
    82  	assert.Equal(t, exprs[0].exp, "node 1")
    83  }
    84  
    85  func TestMatch(t *testing.T) {
    86  	exprs, err := Parse([]string{"node.name==foo"})
    87  	assert.NoError(t, err)
    88  	e := exprs[0]
    89  	assert.True(t, e.Match("foo"))
    90  	assert.False(t, e.Match("fo"))
    91  	assert.False(t, e.Match("fooE"))
    92  
    93  	exprs, err = Parse([]string{"node.name!=foo"})
    94  	assert.NoError(t, err)
    95  	e = exprs[0]
    96  	assert.False(t, e.Match("foo"))
    97  	assert.True(t, e.Match("bar"))
    98  	assert.True(t, e.Match("fo"))
    99  	assert.True(t, e.Match("fooExtra"))
   100  
   101  	exprs, err = Parse([]string{"node.name==f*o"})
   102  	assert.NoError(t, err)
   103  	e = exprs[0]
   104  	assert.False(t, e.Match("fo"))
   105  	assert.True(t, e.Match("f*o"))
   106  	assert.True(t, e.Match("F*o"))
   107  	assert.False(t, e.Match("foo", "fo", "bar"))
   108  	assert.True(t, e.Match("foo", "f*o", "bar"))
   109  	assert.False(t, e.Match("foo"))
   110  
   111  	// test special characters
   112  	exprs, err = Parse([]string{"node.name==f.-$o"})
   113  	assert.NoError(t, err)
   114  	e = exprs[0]
   115  	assert.False(t, e.Match("fa-$o"))
   116  	assert.True(t, e.Match("f.-$o"))
   117  }