github.com/insolar/vanilla@v0.0.0-20201023172447-248fdf805322/ratelimiter/calc_test.go (about)

     1  // Copyright 2020 Insolar Network Ltd.
     2  // All rights reserved.
     3  // This material is licensed under the Insolar License version 1.0,
     4  // available at https://github.com/insolar/assured-ledger/blob/master/LICENSE.md.
     5  
     6  package ratelimiter
     7  
     8  import (
     9  	"math"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestMinLimit(t *testing.T) {
    16  	require.Equal(t, int64(20), minLimit(1000, 10, 20, 100, 1000, 10000))
    17  	require.Equal(t, int64(50), minLimit(1000, 50, 20, 100, 1000, 10000))
    18  	require.Equal(t, int64(10), minLimit(10, 50, 20, 100, 1000, 10000))
    19  	require.Equal(t, int64(-10), minLimit(-10, -50, -20, -100, 1000, -10000))
    20  }
    21  
    22  func TestMaxLimit(t *testing.T) {
    23  	require.Equal(t, int64(10000), maxLimit(1000, 10, 20, 100, 1000, 10000))
    24  	require.Equal(t, int64(1000), maxLimit(1000, 10, 20, 100))
    25  }
    26  
    27  func u(a, b, c int) [3]int {
    28  	return [3]int{a, b, c}
    29  }
    30  
    31  func uR(a uint32, b uint64, c uint32) [3]int {
    32  	return [3]int{int(a), int(b), int(c)}
    33  }
    34  
    35  func TestThroughputQuantizer(t *testing.T) {
    36  	require.Equal(t, u(0, 1, 1), uR(ThroughputQuantizer(1, 1000)))
    37  	require.Equal(t, u(0, 1, 1), uR(ThroughputQuantizer(16, 1000)))
    38  	require.Equal(t, u(0, 1, 1), uR(ThroughputQuantizer(16, 1000, 0)))
    39  	require.Equal(t, u(0, 1, 1), uR(ThroughputQuantizer(16, 1000, math.MaxInt64)))
    40  
    41  	// quantizer is not accurate when traffic limits are lower than samples/sec
    42  	require.Equal(t, u(1, 1000, 1), uR(ThroughputQuantizer(1, 1000, 256)))
    43  	require.Equal(t, u(1, 1000, 1), uR(ThroughputQuantizer(16, 1000, 256)))
    44  
    45  	require.Equal(t, u(1, 1000, 1), uR(ThroughputQuantizer(1, 1000, 1000)))
    46  	require.Equal(t, u(1, 1000, 1), uR(ThroughputQuantizer(1, 1000, 2560)))
    47  	require.Equal(t, u(1, 1000, 1), uR(ThroughputQuantizer(1, 1000, 4000)))
    48  	require.Equal(t, u(2, 2000, 1), uR(ThroughputQuantizer(1, 1000, 8000)))
    49  	require.Equal(t, u(8, 8000, 1), uR(ThroughputQuantizer(1, 1000, 25600)))
    50  	require.Equal(t, u(64, 64000, 1), uR(ThroughputQuantizer(1, 1000, 256000)))
    51  	require.Equal(t, u(256, 256000, 1), uR(ThroughputQuantizer(1, 1000, 2_560_000)))
    52  	require.Equal(t, u(256, 256000, 1), uR(ThroughputQuantizer(1, 1000, 25600000)))
    53  	require.Equal(t, u(256, 256000, 1), uR(ThroughputQuantizer(1, 1000, 256000000)))
    54  	require.Equal(t, u(256, 256000, 1), uR(ThroughputQuantizer(1, 1000, 2_560_000_000)))
    55  	require.Equal(t, u(256, 2048000, 8), uR(ThroughputQuantizer(1, 1000, 25_600_000_000)))
    56  
    57  	require.Equal(t, u(8, 2048, 1), uR(ThroughputQuantizer(1, 256, 8192, 16384, 65536)))
    58  	require.Equal(t, u(4, 1024, 1), uR(ThroughputQuantizer(1, 256, 8192, 16384+4096, 65536)))
    59  }