100 lines
2.4 KiB
Go
100 lines
2.4 KiB
Go
|
package snmp_lookup
|
||
|
|
||
|
import (
|
||
|
"sync/atomic"
|
||
|
"testing"
|
||
|
"time"
|
||
|
|
||
|
"github.com/stretchr/testify/require"
|
||
|
|
||
|
"github.com/influxdata/telegraf/config"
|
||
|
)
|
||
|
|
||
|
func TestAddBacklog(t *testing.T) {
|
||
|
var notifyCount atomic.Uint64
|
||
|
s := newStore(0, 0, 0, 0)
|
||
|
s.update = func(string) *tagMap { return nil }
|
||
|
s.notify = func(string, *tagMap) { notifyCount.Add(1) }
|
||
|
defer s.destroy()
|
||
|
|
||
|
s.Lock()
|
||
|
require.Empty(t, s.deferredUpdates)
|
||
|
s.Unlock()
|
||
|
|
||
|
s.addBacklog("127.0.0.1", time.Now().Add(1*time.Second))
|
||
|
|
||
|
s.Lock()
|
||
|
require.Contains(t, s.deferredUpdates, "127.0.0.1")
|
||
|
s.Unlock()
|
||
|
require.Eventually(t, func() bool {
|
||
|
return notifyCount.Load() == 1
|
||
|
}, 3*time.Second, 100*time.Millisecond)
|
||
|
s.Lock()
|
||
|
require.Empty(t, s.deferredUpdates)
|
||
|
s.Unlock()
|
||
|
}
|
||
|
|
||
|
func TestLookup(t *testing.T) {
|
||
|
tmr := tagMapRows{
|
||
|
"0": {"ifName": "eth0"},
|
||
|
"1": {"ifName": "eth1"},
|
||
|
}
|
||
|
minUpdateInterval := 50 * time.Millisecond
|
||
|
cacheTTL := config.Duration(2 * minUpdateInterval)
|
||
|
var notifyCount atomic.Uint64
|
||
|
s := newStore(defaultCacheSize, cacheTTL, defaultParallelLookups, config.Duration(minUpdateInterval))
|
||
|
s.update = func(string) *tagMap {
|
||
|
return &tagMap{
|
||
|
created: time.Now(),
|
||
|
rows: tmr,
|
||
|
}
|
||
|
}
|
||
|
s.notify = func(string, *tagMap) { notifyCount.Add(1) }
|
||
|
defer s.destroy()
|
||
|
|
||
|
require.Equal(t, 0, s.cache.Len())
|
||
|
|
||
|
// Initial lookup should cache entries
|
||
|
s.lookup("127.0.0.1", "999")
|
||
|
require.Eventually(t, func() bool {
|
||
|
return s.cache.Contains("127.0.0.1")
|
||
|
}, time.Second, time.Millisecond)
|
||
|
require.EqualValues(t, 1, notifyCount.Load())
|
||
|
|
||
|
entries, _ := s.cache.Get("127.0.0.1")
|
||
|
require.Equal(t, tmr, entries.rows)
|
||
|
|
||
|
// Second lookup should be deferred minUpdateInterval
|
||
|
s.Lock()
|
||
|
require.Empty(t, s.deferredUpdates)
|
||
|
s.Unlock()
|
||
|
|
||
|
s.lookup("127.0.0.1", "999")
|
||
|
|
||
|
require.EqualValues(t, 2, notifyCount.Load())
|
||
|
|
||
|
s.Lock()
|
||
|
require.Contains(t, s.deferredUpdates, "127.0.0.1")
|
||
|
require.WithinDuration(t, time.Now(), s.deferredUpdates["127.0.0.1"], minUpdateInterval)
|
||
|
s.Unlock()
|
||
|
|
||
|
// Wait until resolved
|
||
|
require.Eventually(t, func() bool {
|
||
|
return notifyCount.Load() == 3
|
||
|
}, time.Second, time.Millisecond)
|
||
|
|
||
|
s.Lock()
|
||
|
require.Empty(t, s.deferredUpdates)
|
||
|
s.Unlock()
|
||
|
|
||
|
time.Sleep(minUpdateInterval)
|
||
|
|
||
|
// Third lookup should directly update
|
||
|
s.lookup("127.0.0.1", "999")
|
||
|
_, inflight := s.inflight.Load("127.0.0.1")
|
||
|
require.True(t, inflight)
|
||
|
require.Eventually(t, func() bool {
|
||
|
return notifyCount.Load() == 4
|
||
|
}, time.Second, time.Millisecond)
|
||
|
}
|