Files
akvorado/common/helpers/cache/persist_test.go
Vincent Bernat 2467a3c136 inlet/metadata: fix versioning of metadata cache
Gob decoding is quite liberal and accepts anything that is not
conflicting as long as there is at least one field matching. That's not
what we want. To check we are decoding the right things, use a string
representation of zero values.
2024-04-12 22:44:50 +02:00

123 lines
2.8 KiB
Go

// SPDX-FileCopyrightText: 2023 Free Mobile
// SPDX-License-Identifier: AGPL-3.0-only
package cache_test
import (
"errors"
"io/fs"
"net/netip"
"path/filepath"
"testing"
"time"
"akvorado/common/helpers/cache"
)
func TestLoadNotExist(t *testing.T) {
c := cache.New[netip.Addr, string]()
err := c.Load("/i/do/not/exist")
if !errors.Is(err, fs.ErrNotExist) {
t.Fatalf("c.Load() error:\n%s", err)
}
}
func TestSaveLoad(t *testing.T) {
c := cache.New[netip.Addr, string]()
t1 := time.Date(2022, time.December, 31, 10, 23, 0, 0, time.UTC)
t2 := t1.Add(time.Minute)
t3 := t2.Add(time.Minute)
c.Put(t1, netip.MustParseAddr("::ffff:127.0.0.1"), "entry1")
c.Put(t2, netip.MustParseAddr("::ffff:127.0.0.2"), "entry2")
c.Put(t3, netip.MustParseAddr("::ffff:127.0.0.3"), "entry3")
target := filepath.Join(t.TempDir(), "cache")
if err := c.Save(target); err != nil {
t.Fatalf("c.Save() error:\n%s", err)
}
c = cache.New[netip.Addr, string]()
if err := c.Load(target); err != nil {
t.Fatalf("c.Load() error:\n%s", err)
}
expectCacheGet(t, c, "127.0.0.1", "entry1", true)
expectCacheGet(t, c, "127.0.0.2", "entry2", true)
expectCacheGet(t, c, "127.0.0.3", "entry3", true)
}
func TestLoadMismatchVersion(t *testing.T) {
t.Run("simple", func(t *testing.T) {
c1 := cache.New[netip.Addr, string]()
c1.Put(time.Now(), netip.MustParseAddr("::ffff:127.0.0.1"), "entry1")
target := filepath.Join(t.TempDir(), "cache")
if err := c1.Save(target); err != nil {
t.Fatalf("c.Save() error:\n%s", err)
}
// Try to load it
c2 := cache.New[netip.Addr, int]()
if err := c2.Load(target); !errors.Is(err, cache.ErrVersion) {
t.Fatalf("c.Load() error:\n%s", err)
}
})
t.Run("structs", func(t *testing.T) {
target := filepath.Join(t.TempDir(), "cache")
{
type Interface struct {
Name string
Description string
Speed uint
}
type Answer struct {
ExporterName string
Interface
}
c1 := cache.New[string, Answer]()
c1.Put(time.Now(),
"test1",
Answer{
ExporterName: "exporter1",
Interface: Interface{
Name: "ifname1",
Description: "first",
Speed: 1000,
},
})
if err := c1.Save(target); err != nil {
t.Fatalf("c.Save() error:\n%s", err)
}
}
// Try to load it
{
type Exporter struct {
Name string
Region string
Role string
Tenant string
Site string
Group string
}
type Interface struct {
Name string
Description string
Speed uint
Provider string
Connectivity string
}
type Answer struct {
Exporter Exporter
Interface Interface
}
c2 := cache.New[string, Answer]()
if err := c2.Load(target); !errors.Is(err, cache.ErrVersion) {
t.Fatalf("c.Load() error:\n%s", err)
}
}
})
}