github.com/cilium/cilium@v1.16.2/operator/pkg/ciliumendpointslice/rate_limit_test.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // Copyright Authors of Cilium
     3  
     4  package ciliumendpointslice
     5  
     6  import (
     7  	"encoding/json"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func Test_parseDynamicRateLimitConfig(t *testing.T) {
    14  	jsonCfg := "[{\"nodes\":1,\"limit\":100,\"burst\":200}]"
    15  	wantCfg := rateLimit{Nodes: 1, Limit: 100, Burst: 200}
    16  
    17  	drl, err := parseDynamicRateLimit(jsonCfg)
    18  	assert.NoError(t, err)
    19  	assert.Contains(t, drl, wantCfg)
    20  }
    21  
    22  func Test_parseDynamicRateLimitConfigInvalid(t *testing.T) {
    23  	jsonCfg := "[{\"noides\": 1,\"blurst\":100}]"
    24  
    25  	drl, err := parseDynamicRateLimit(jsonCfg)
    26  	assert.Error(t, err)
    27  	assert.Nil(t, drl)
    28  }
    29  
    30  func TestSingleDynamicRateLimit(t *testing.T) {
    31  	limit := 15.0
    32  	burst := 30
    33  	p := params{
    34  		Logger: log,
    35  		Cfg: Config{
    36  			CESDynamicRateLimitConfig: "[{\"nodes\": 5, \"limit\": 15.0, \"burst\": 30}]",
    37  		},
    38  	}
    39  	config, err := getRateLimitConfig(p)
    40  	assert.NoError(t, err)
    41  	assert.Equal(t, limit, config.current.Limit)
    42  	assert.Equal(t, burst, config.current.Burst)
    43  	assert.False(t, config.updateRateLimiterWithNodes(1000))
    44  	assert.Equal(t, limit, config.current.Limit)
    45  	assert.Equal(t, burst, config.current.Burst)
    46  	assert.False(t, config.updateRateLimiterWithNodes(0))
    47  	assert.Equal(t, limit, config.current.Limit)
    48  	assert.Equal(t, burst, config.current.Burst)
    49  	assert.False(t, config.updateRateLimiterWithNodes(-100))
    50  	assert.Equal(t, limit, config.current.Limit)
    51  	assert.Equal(t, burst, config.current.Burst)
    52  }
    53  
    54  func TestMultipleUnsortedDynamicRateLimit(t *testing.T) {
    55  	limit0 := 5.0
    56  	burst0 := 10
    57  	limit1 := 11.0
    58  	burst1 := 22
    59  	limit2 := 16.0
    60  	burst2 := 32
    61  	rl := dynamicRateLimit{
    62  		{Nodes: 15, Limit: 11.0, Burst: 22},
    63  		{Nodes: 5, Limit: 5.0, Burst: 10},
    64  		{Nodes: 25, Limit: 16.0, Burst: 32},
    65  	}
    66  
    67  	rlJson, err := json.Marshal(rl)
    68  	assert.NoError(t, err)
    69  	p := params{
    70  		Logger: log,
    71  		Cfg: Config{
    72  			CESDynamicRateLimitConfig: string(rlJson),
    73  		},
    74  	}
    75  	config, err := getRateLimitConfig(p)
    76  	assert.NoError(t, err)
    77  	assert.Equal(t, limit0, config.current.Limit)
    78  	assert.Equal(t, burst0, config.current.Burst)
    79  	assert.True(t, config.updateRateLimiterWithNodes(1000))
    80  	assert.Equal(t, limit2, config.current.Limit)
    81  	assert.Equal(t, burst2, config.current.Burst)
    82  	assert.True(t, config.updateRateLimiterWithNodes(0))
    83  	assert.Equal(t, limit0, config.current.Limit)
    84  	assert.Equal(t, burst0, config.current.Burst)
    85  	assert.True(t, config.updateRateLimiterWithNodes(24))
    86  	assert.Equal(t, limit1, config.current.Limit)
    87  	assert.Equal(t, burst1, config.current.Burst)
    88  	assert.True(t, config.updateRateLimiterWithNodes(25))
    89  	assert.Equal(t, limit2, config.current.Limit)
    90  	assert.Equal(t, burst2, config.current.Burst)
    91  	assert.True(t, config.updateRateLimiterWithNodes(-100))
    92  	assert.Equal(t, limit0, config.current.Limit)
    93  	assert.Equal(t, burst0, config.current.Burst)
    94  	assert.True(t, config.updateRateLimiterWithNodes(16))
    95  	assert.Equal(t, limit1, config.current.Limit)
    96  	assert.Equal(t, burst1, config.current.Burst)
    97  	assert.False(t, config.updateRateLimiterWithNodes(23))
    98  	assert.Equal(t, limit1, config.current.Limit)
    99  	assert.Equal(t, burst1, config.current.Burst)
   100  }