gitee.com/aurawing/surguard-go@v0.3.1-0.20240409071558-96509a61ecf3/ratelimiter/ratelimiter_test.go (about)

     1  /* SPDX-License-Identifier: MIT
     2   *
     3   * Copyright (C) 2017-2023 WireGuard LLC. All Rights Reserved.
     4   */
     5  
     6  package ratelimiter
     7  
     8  import (
     9  	"net/netip"
    10  	"testing"
    11  	"time"
    12  )
    13  
    14  type result struct {
    15  	allowed bool
    16  	text    string
    17  	wait    time.Duration
    18  }
    19  
    20  func TestRatelimiter(t *testing.T) {
    21  	var rate Ratelimiter
    22  	var expectedResults []result
    23  
    24  	nano := func(nano int64) time.Duration {
    25  		return time.Nanosecond * time.Duration(nano)
    26  	}
    27  
    28  	add := func(res result) {
    29  		expectedResults = append(
    30  			expectedResults,
    31  			res,
    32  		)
    33  	}
    34  
    35  	for i := 0; i < packetsBurstable; i++ {
    36  		add(result{
    37  			allowed: true,
    38  			text:    "initial burst",
    39  		})
    40  	}
    41  
    42  	add(result{
    43  		allowed: false,
    44  		text:    "after burst",
    45  	})
    46  
    47  	add(result{
    48  		allowed: true,
    49  		wait:    nano(time.Second.Nanoseconds() / packetsPerSecond),
    50  		text:    "filling tokens for single packet",
    51  	})
    52  
    53  	add(result{
    54  		allowed: false,
    55  		text:    "not having refilled enough",
    56  	})
    57  
    58  	add(result{
    59  		allowed: true,
    60  		wait:    2 * (nano(time.Second.Nanoseconds() / packetsPerSecond)),
    61  		text:    "filling tokens for two packet burst",
    62  	})
    63  
    64  	add(result{
    65  		allowed: true,
    66  		text:    "second packet in 2 packet burst",
    67  	})
    68  
    69  	add(result{
    70  		allowed: false,
    71  		text:    "packet following 2 packet burst",
    72  	})
    73  
    74  	ips := []netip.Addr{
    75  		netip.MustParseAddr("127.0.0.1"),
    76  		netip.MustParseAddr("192.168.1.1"),
    77  		netip.MustParseAddr("172.167.2.3"),
    78  		netip.MustParseAddr("97.231.252.215"),
    79  		netip.MustParseAddr("248.97.91.167"),
    80  		netip.MustParseAddr("188.208.233.47"),
    81  		netip.MustParseAddr("104.2.183.179"),
    82  		netip.MustParseAddr("72.129.46.120"),
    83  		netip.MustParseAddr("2001:0db8:0a0b:12f0:0000:0000:0000:0001"),
    84  		netip.MustParseAddr("f5c2:818f:c052:655a:9860:b136:6894:25f0"),
    85  		netip.MustParseAddr("b2d7:15ab:48a7:b07c:a541:f144:a9fe:54fc"),
    86  		netip.MustParseAddr("a47b:786e:1671:a22b:d6f9:4ab0:abc7:c918"),
    87  		netip.MustParseAddr("ea1e:d155:7f7a:98fb:2bf5:9483:80f6:5445"),
    88  		netip.MustParseAddr("3f0e:54a2:f5b4:cd19:a21d:58e1:3746:84c4"),
    89  	}
    90  
    91  	now := time.Now()
    92  	rate.timeNow = func() time.Time {
    93  		return now
    94  	}
    95  	defer func() {
    96  		// Lock to avoid data race with cleanup goroutine from Init.
    97  		rate.mu.Lock()
    98  		defer rate.mu.Unlock()
    99  
   100  		rate.timeNow = time.Now
   101  	}()
   102  	timeSleep := func(d time.Duration) {
   103  		now = now.Add(d + 1)
   104  		rate.cleanup()
   105  	}
   106  
   107  	rate.Init()
   108  	defer rate.Close()
   109  
   110  	for i, res := range expectedResults {
   111  		timeSleep(res.wait)
   112  		for _, ip := range ips {
   113  			allowed := rate.Allow(ip)
   114  			if allowed != res.allowed {
   115  				t.Fatalf("%d: %s: rate.Allow(%q)=%v, want %v", i, res.text, ip, allowed, res.allowed)
   116  			}
   117  		}
   118  	}
   119  }