mirror of https://github.com/poanetwork/gecko.git
172 lines
4.6 KiB
Go
172 lines
4.6 KiB
Go
|
// (c) 2019-2020, Ava Labs, Inc. All rights reserved.
|
||
|
// See the file LICENSE for licensing terms.
|
||
|
|
||
|
package cache
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
|
||
|
"github.com/ava-labs/gecko/ids"
|
||
|
)
|
||
|
|
||
|
func TestLRU(t *testing.T) {
|
||
|
cache := LRU{Size: 1}
|
||
|
|
||
|
id1 := ids.NewID([32]byte{1})
|
||
|
if _, found := cache.Get(id1); found {
|
||
|
t.Fatalf("Retrieved value when none exists")
|
||
|
}
|
||
|
|
||
|
expectedValue1 := 1
|
||
|
cache.Put(id1, expectedValue1)
|
||
|
if value, found := cache.Get(id1); !found {
|
||
|
t.Fatalf("Failed to retrieve value when one exists")
|
||
|
} else if value != expectedValue1 {
|
||
|
t.Fatalf("Failed to retrieve correct value when one exists")
|
||
|
}
|
||
|
|
||
|
cache.Put(id1, expectedValue1)
|
||
|
if value, found := cache.Get(id1); !found {
|
||
|
t.Fatalf("Failed to retrieve value when one exists")
|
||
|
} else if value != expectedValue1 {
|
||
|
t.Fatalf("Failed to retrieve correct value when one exists")
|
||
|
}
|
||
|
|
||
|
cache.Put(id1, expectedValue1)
|
||
|
if value, found := cache.Get(id1); !found {
|
||
|
t.Fatalf("Failed to retrieve value when one exists")
|
||
|
} else if value != expectedValue1 {
|
||
|
t.Fatalf("Failed to retrieve correct value when one exists")
|
||
|
}
|
||
|
|
||
|
id2 := ids.NewID([32]byte{2})
|
||
|
|
||
|
expectedValue2 := 2
|
||
|
cache.Put(id2, expectedValue2)
|
||
|
if _, found := cache.Get(id1); found {
|
||
|
t.Fatalf("Retrieved value when none exists")
|
||
|
}
|
||
|
if value, found := cache.Get(id2); !found {
|
||
|
t.Fatalf("Failed to retrieve value when one exists")
|
||
|
} else if value != expectedValue2 {
|
||
|
t.Fatalf("Failed to retrieve correct value when one exists")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestLRUEviction(t *testing.T) {
|
||
|
cache := LRU{Size: 2}
|
||
|
|
||
|
id1 := ids.NewID([32]byte{1})
|
||
|
id2 := ids.NewID([32]byte{2})
|
||
|
id3 := ids.NewID([32]byte{3})
|
||
|
|
||
|
cache.Put(id1, 1)
|
||
|
cache.Put(id2, 2)
|
||
|
|
||
|
if val, found := cache.Get(id1); !found {
|
||
|
t.Fatalf("Failed to retrieve value when one exists")
|
||
|
} else if val != 1 {
|
||
|
t.Fatalf("Retrieved wrong value")
|
||
|
} else if val, found := cache.Get(id2); !found {
|
||
|
t.Fatalf("Failed to retrieve value when one exists")
|
||
|
} else if val != 2 {
|
||
|
t.Fatalf("Retrieved wrong value")
|
||
|
} else if _, found := cache.Get(id3); found {
|
||
|
t.Fatalf("Retrieve value when none exists")
|
||
|
}
|
||
|
|
||
|
cache.Put(id3, 3)
|
||
|
|
||
|
if _, found := cache.Get(id1); found {
|
||
|
t.Fatalf("Retrieve value when none exists")
|
||
|
} else if val, found := cache.Get(id2); !found {
|
||
|
t.Fatalf("Failed to retrieve value when one exists")
|
||
|
} else if val != 2 {
|
||
|
t.Fatalf("Retrieved wrong value")
|
||
|
} else if val, found := cache.Get(id3); !found {
|
||
|
t.Fatalf("Failed to retrieve value when one exists")
|
||
|
} else if val != 3 {
|
||
|
t.Fatalf("Retrieved wrong value")
|
||
|
}
|
||
|
|
||
|
cache.Get(id2)
|
||
|
cache.Put(id1, 1)
|
||
|
|
||
|
if val, found := cache.Get(id1); !found {
|
||
|
t.Fatalf("Failed to retrieve value when one exists")
|
||
|
} else if val != 1 {
|
||
|
t.Fatalf("Retrieved wrong value")
|
||
|
} else if val, found := cache.Get(id2); !found {
|
||
|
t.Fatalf("Failed to retrieve value when one exists")
|
||
|
} else if val != 2 {
|
||
|
t.Fatalf("Retrieved wrong value")
|
||
|
} else if _, found := cache.Get(id3); found {
|
||
|
t.Fatalf("Retrieved value when none exists")
|
||
|
}
|
||
|
|
||
|
cache.Evict(id2)
|
||
|
cache.Put(id3, 3)
|
||
|
|
||
|
if val, found := cache.Get(id1); !found {
|
||
|
t.Fatalf("Failed to retrieve value when one exists")
|
||
|
} else if val != 1 {
|
||
|
t.Fatalf("Retrieved wrong value")
|
||
|
} else if _, found := cache.Get(id2); found {
|
||
|
t.Fatalf("Retrieved value when none exists")
|
||
|
} else if val, found := cache.Get(id3); !found {
|
||
|
t.Fatalf("Failed to retrieve value when one exists")
|
||
|
} else if val != 3 {
|
||
|
t.Fatalf("Retrieved wrong value")
|
||
|
}
|
||
|
|
||
|
cache.Flush()
|
||
|
|
||
|
if _, found := cache.Get(id1); found {
|
||
|
t.Fatalf("Retrieved value when none exists")
|
||
|
} else if _, found := cache.Get(id2); found {
|
||
|
t.Fatalf("Retrieved value when none exists")
|
||
|
} else if _, found := cache.Get(id3); found {
|
||
|
t.Fatalf("Retrieved value when none exists")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestLRUResize(t *testing.T) {
|
||
|
cache := LRU{Size: 2}
|
||
|
|
||
|
id1 := ids.NewID([32]byte{1})
|
||
|
id2 := ids.NewID([32]byte{2})
|
||
|
|
||
|
cache.Put(id1, 1)
|
||
|
cache.Put(id2, 2)
|
||
|
|
||
|
if val, found := cache.Get(id1); !found {
|
||
|
t.Fatalf("Failed to retrieve value when one exists")
|
||
|
} else if val != 1 {
|
||
|
t.Fatalf("Retrieved wrong value")
|
||
|
} else if val, found := cache.Get(id2); !found {
|
||
|
t.Fatalf("Failed to retrieve value when one exists")
|
||
|
} else if val != 2 {
|
||
|
t.Fatalf("Retrieved wrong value")
|
||
|
}
|
||
|
|
||
|
cache.Size = 1
|
||
|
|
||
|
if _, found := cache.Get(id1); found {
|
||
|
t.Fatalf("Retrieve value when none exists")
|
||
|
} else if val, found := cache.Get(id2); !found {
|
||
|
t.Fatalf("Failed to retrieve value when one exists")
|
||
|
} else if val != 2 {
|
||
|
t.Fatalf("Retrieved wrong value")
|
||
|
}
|
||
|
|
||
|
cache.Size = 0
|
||
|
|
||
|
if _, found := cache.Get(id1); found {
|
||
|
t.Fatalf("Retrieve value when none exists")
|
||
|
} else if val, found := cache.Get(id2); !found {
|
||
|
t.Fatalf("Failed to retrieve value when one exists")
|
||
|
} else if val != 2 {
|
||
|
t.Fatalf("Retrieved wrong value")
|
||
|
}
|
||
|
}
|