github.com/lologarithm/mattermost-server@v5.3.2-0.20181002060438-c82a84ed765b+incompatible/utils/lru_test.go (about)

     1  // This files was copied/modified from https://github.com/hashicorp/golang-lru
     2  // which was (see below)
     3  
     4  // This package provides a simple LRU cache. It is based on the
     5  // LRU implementation in groupcache:
     6  // https://github.com/golang/groupcache/tree/master/lru
     7  
     8  package utils
     9  
    10  import "testing"
    11  import "time"
    12  
    13  func TestLRU(t *testing.T) {
    14  	l := NewLru(128)
    15  
    16  	for i := 0; i < 256; i++ {
    17  		l.Add(i, i)
    18  	}
    19  	if l.Len() != 128 {
    20  		t.Fatalf("bad len: %v", l.Len())
    21  	}
    22  
    23  	for i, k := range l.Keys() {
    24  		if v, ok := l.Get(k); !ok || v != k || v != i+128 {
    25  			t.Fatalf("bad key: %v", k)
    26  		}
    27  	}
    28  	for i := 0; i < 128; i++ {
    29  		_, ok := l.Get(i)
    30  		if ok {
    31  			t.Fatalf("should be evicted")
    32  		}
    33  	}
    34  	for i := 128; i < 256; i++ {
    35  		_, ok := l.Get(i)
    36  		if !ok {
    37  			t.Fatalf("should not be evicted")
    38  		}
    39  	}
    40  	for i := 128; i < 192; i++ {
    41  		l.Remove(i)
    42  		_, ok := l.Get(i)
    43  		if ok {
    44  			t.Fatalf("should be deleted")
    45  		}
    46  	}
    47  
    48  	l.Get(192) // expect 192 to be last key in l.Keys()
    49  
    50  	for i, k := range l.Keys() {
    51  		if (i < 63 && k != i+193) || (i == 63 && k != 192) {
    52  			t.Fatalf("out of order key: %v", k)
    53  		}
    54  	}
    55  
    56  	l.Purge()
    57  	if l.Len() != 0 {
    58  		t.Fatalf("bad len: %v", l.Len())
    59  	}
    60  	if _, ok := l.Get(200); ok {
    61  		t.Fatalf("should contain nothing")
    62  	}
    63  }
    64  
    65  func TestLRUExpire(t *testing.T) {
    66  	l := NewLru(128)
    67  
    68  	l.AddWithExpiresInSecs(1, 1, 1)
    69  	l.AddWithExpiresInSecs(2, 2, 1)
    70  	l.AddWithExpiresInSecs(3, 3, 0)
    71  
    72  	time.Sleep(time.Millisecond * 2100)
    73  
    74  	if r1, ok := l.Get(1); ok {
    75  		t.Fatal(r1)
    76  	}
    77  
    78  	if _, ok2 := l.Get(3); !ok2 {
    79  		t.Fatal("should exist")
    80  	}
    81  }