harbor/src/pkg/proxy/secret/manager_test.go
Daniel Jiang 14203169bf Add GC mechanism to secret manager
When Generate is called and the size is larger than cap, GC will be
triggered.

Signed-off-by: Daniel Jiang <jiangd@vmware.com>
2020-07-20 15:53:36 +08:00

54 lines
1.3 KiB
Go

package secret
import (
"fmt"
"sync/atomic"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func TestManger(t *testing.T) {
manager := GetManager()
rn1 := "project1/golang"
assert.False(t, manager.Verify("whatever", rn1))
s1 := manager.Generate(rn1)
s2 := manager.Generate(rn1)
assert.False(t, s1 == s2)
assert.False(t, manager.Verify(s1, "project1/donotexist"))
assert.True(t, manager.Verify(s1, rn1))
// A secret can be used only once.
assert.False(t, manager.Verify(s1, rn1))
manager2 := GetManager()
assert.Equal(t, manager2, manager)
}
func TestExpiration(t *testing.T) {
manager := createManager(1*time.Second, defaultCap, defaultGCInterval)
rn1 := "project1/golang"
s := manager.Generate(rn1)
// Sleep till the secret expires
time.Sleep(2 * time.Second)
assert.False(t, manager.Verify(s, rn1))
}
func TestGC(t *testing.T) {
manager := createManager(1*time.Second, 10, 1*time.Second).(*mgr)
for i := 0; i < 10; i++ {
rn := fmt.Sprintf("project%d/golang", i)
manager.Generate(rn)
}
time.Sleep(2 * time.Second)
assert.Equal(t, uint64(10), manager.size)
for i := 0; i < 1000; i++ {
rn := fmt.Sprintf("project%d/redis", i)
manager.Generate(rn)
}
assert.Equal(t, uint64(1000), atomic.LoadUint64(&manager.size))
time.Sleep(4 * time.Second)
assert.Equal(t, uint64(0), atomic.LoadUint64(&manager.size))
}