github.com/BGrewell/tail@v1.0.1-0.20210309152823-689d25348e0e/ratelimiter/leakybucket_test.go (about)

     1  package ratelimiter
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  )
     7  
     8  func TestPour(t *testing.T) {
     9  	bucket := NewLeakyBucket(60, time.Second)
    10  	bucket.Lastupdate = time.Unix(0, 0)
    11  
    12  	bucket.Now = func() time.Time { return time.Unix(1, 0) }
    13  
    14  	if bucket.Pour(61) {
    15  		t.Error("Expected false")
    16  	}
    17  
    18  	if !bucket.Pour(10) {
    19  		t.Error("Expected true")
    20  	}
    21  
    22  	if !bucket.Pour(49) {
    23  		t.Error("Expected true")
    24  	}
    25  
    26  	if bucket.Pour(2) {
    27  		t.Error("Expected false")
    28  	}
    29  
    30  	bucket.Now = func() time.Time { return time.Unix(61, 0) }
    31  	if !bucket.Pour(60) {
    32  		t.Error("Expected true")
    33  	}
    34  
    35  	if bucket.Pour(1) {
    36  		t.Error("Expected false")
    37  	}
    38  
    39  	bucket.Now = func() time.Time { return time.Unix(70, 0) }
    40  
    41  	if !bucket.Pour(1) {
    42  		t.Error("Expected true")
    43  	}
    44  
    45  }
    46  
    47  func TestTimeSinceLastUpdate(t *testing.T) {
    48  	bucket := NewLeakyBucket(60, time.Second)
    49  	bucket.Now = func() time.Time { return time.Unix(1, 0) }
    50  	bucket.Pour(1)
    51  	bucket.Now = func() time.Time { return time.Unix(2, 0) }
    52  
    53  	sinceLast := bucket.TimeSinceLastUpdate()
    54  	if sinceLast != time.Second*1 {
    55  		t.Errorf("Expected time since last update to be less than 1 second, got %d", sinceLast)
    56  	}
    57  }
    58  
    59  func TestTimeToDrain(t *testing.T) {
    60  	bucket := NewLeakyBucket(60, time.Second)
    61  	bucket.Now = func() time.Time { return time.Unix(1, 0) }
    62  	bucket.Pour(10)
    63  
    64  	if bucket.TimeToDrain() != time.Second*10 {
    65  		t.Error("Time to drain should be 10 seconds")
    66  	}
    67  
    68  	bucket.Now = func() time.Time { return time.Unix(2, 0) }
    69  
    70  	if bucket.TimeToDrain() != time.Second*9 {
    71  		t.Error("Time to drain should be 9 seconds")
    72  	}
    73  }