All checks were successful
Vulncheck / Vulncheck (push) Successful in 1m12s
Pre-commit hooks / Pre-commit (push) Successful in 1m41s
Build / Build Components (push) Successful in 1m54s
Tests and linters / Run gofumpt (push) Successful in 3m35s
Tests and linters / Lint (push) Successful in 4m5s
Tests and linters / Staticcheck (push) Successful in 4m9s
Tests and linters / gopls check (push) Successful in 4m29s
Tests and linters / Tests (push) Successful in 4m52s
OCI image / Build container images (push) Successful in 5m9s
Tests and linters / Tests with -race (push) Successful in 6m14s
Applicable for both cases: when node uses local cache for netmap and when it disabled. Change-Id: I3050f537e20312a4b39e944aca763b77bd1e74c4 Signed-off-by: Anton Nikiforov <an.nikiforov@yadro.com>
135 lines
3.4 KiB
Go
135 lines
3.4 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
|
|
netmapSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestTTLNetCache(t *testing.T) {
|
|
ttlDuration := time.Millisecond * 50
|
|
cache := newNetworkTTLCache(10, ttlDuration, testNetValueReader, &noopCacheMetricts{})
|
|
|
|
key := "key"
|
|
|
|
t.Run("Test Add and Get", func(t *testing.T) {
|
|
ti := time.Now()
|
|
cache.set(key, ti, nil)
|
|
val, err := cache.get(context.Background(), key)
|
|
require.NoError(t, err)
|
|
require.Equal(t, ti, val)
|
|
})
|
|
|
|
t.Run("Test TTL", func(t *testing.T) {
|
|
ti := time.Now()
|
|
cache.set(key, ti, nil)
|
|
time.Sleep(2 * ttlDuration)
|
|
val, err := cache.get(context.Background(), key)
|
|
require.NoError(t, err)
|
|
require.NotEqual(t, val, ti)
|
|
})
|
|
|
|
t.Run("Test Remove", func(t *testing.T) {
|
|
ti := time.Now()
|
|
cache.set(key, ti, nil)
|
|
cache.remove(key)
|
|
val, err := cache.get(context.Background(), key)
|
|
require.NoError(t, err)
|
|
require.NotEqual(t, val, ti)
|
|
})
|
|
|
|
t.Run("Test Cache Error", func(t *testing.T) {
|
|
cache.set("error", time.Now(), errors.New("mock error"))
|
|
_, err := cache.get(context.Background(), "error")
|
|
require.Error(t, err)
|
|
require.Equal(t, "mock error", err.Error())
|
|
})
|
|
}
|
|
|
|
func testNetValueReader(_ context.Context, key string) (time.Time, error) {
|
|
if key == "error" {
|
|
return time.Now(), errors.New("mock error")
|
|
}
|
|
return time.Now(), nil
|
|
}
|
|
|
|
type noopCacheMetricts struct{}
|
|
|
|
func (m *noopCacheMetricts) AddMethodDuration(method string, d time.Duration, hit bool) {}
|
|
|
|
type rawSrc struct{}
|
|
|
|
func (r *rawSrc) GetCandidates(_ context.Context) ([]netmapSDK.NodeInfo, error) {
|
|
node0 := netmapSDK.NodeInfo{}
|
|
node0.SetPublicKey([]byte{byte(1)})
|
|
node0.SetStatus(netmapSDK.Online)
|
|
node0.SetExternalAddresses("1", "0")
|
|
node0.SetNetworkEndpoints("1", "0")
|
|
|
|
node1 := netmapSDK.NodeInfo{}
|
|
node1.SetPublicKey([]byte{byte(1)})
|
|
node1.SetStatus(netmapSDK.Online)
|
|
node1.SetExternalAddresses("1", "0")
|
|
node1.SetNetworkEndpoints("1", "0")
|
|
|
|
return []netmapSDK.NodeInfo{node0, node1}, nil
|
|
}
|
|
|
|
func (r *rawSrc) GetNetMapByEpoch(ctx context.Context, epoch uint64) (*netmapSDK.NetMap, error) {
|
|
nm := netmapSDK.NetMap{}
|
|
nm.SetEpoch(1)
|
|
|
|
node0 := netmapSDK.NodeInfo{}
|
|
node0.SetPublicKey([]byte{byte(1)})
|
|
node0.SetStatus(netmapSDK.Maintenance)
|
|
node0.SetExternalAddresses("0")
|
|
node0.SetNetworkEndpoints("0")
|
|
|
|
node1 := netmapSDK.NodeInfo{}
|
|
node1.SetPublicKey([]byte{byte(1)})
|
|
node1.SetStatus(netmapSDK.Maintenance)
|
|
node1.SetExternalAddresses("0")
|
|
node1.SetNetworkEndpoints("0")
|
|
|
|
nm.SetNodes([]netmapSDK.NodeInfo{node0, node1})
|
|
|
|
return &nm, nil
|
|
}
|
|
|
|
type st struct{}
|
|
|
|
func (s *st) CurrentEpoch() uint64 {
|
|
return 1
|
|
}
|
|
|
|
func TestNetmapStorage(t *testing.T) {
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
wg := sync.WaitGroup{}
|
|
cache := newCachedNetmapStorage(ctx, nil, &st{}, &rawSrc{}, &wg, time.Millisecond*50)
|
|
|
|
nm, err := cache.GetNetMapByEpoch(ctx, 1)
|
|
require.NoError(t, err)
|
|
require.True(t, nm.Nodes()[0].Status() == netmapSDK.Maintenance)
|
|
require.True(t, len(nm.Nodes()[0].ExternalAddresses()) == 1)
|
|
require.True(t, nm.Nodes()[0].NumberOfNetworkEndpoints() == 1)
|
|
|
|
require.Eventually(t, func() bool {
|
|
nm, err := cache.GetNetMapByEpoch(ctx, 1)
|
|
require.NoError(t, err)
|
|
for _, node := range nm.Nodes() {
|
|
if !(node.Status() == netmapSDK.Online && len(node.ExternalAddresses()) == 2 &&
|
|
node.NumberOfNetworkEndpoints() == 2) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}, time.Second*5, time.Millisecond*10)
|
|
|
|
cancel()
|
|
wg.Wait()
|
|
}
|