mirror of
https://github.com/akvorado/akvorado.git
synced 2025-12-11 22:14:02 +01:00
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.
123 lines
2.8 KiB
Go
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)
|
|
}
|
|
}
|
|
})
|
|
}
|