blob: 143b90c62bc05d3bef409c18346d10ae5514d87e [file] [log] [blame]
package events
import (
"io/ioutil"
"path"
"testing"
"time"
assert "github.com/stretchr/testify/require"
"go.skia.org/infra/go/testutils"
)
func TestAggregateMetric(t *testing.T) {
testutils.MediumTest(t)
tmp, err := ioutil.TempDir("", "")
assert.NoError(t, err)
defer testutils.RemoveAll(t, tmp)
db, err := NewEventDB(path.Join(tmp, "events.bdb"))
assert.NoError(t, err)
m, err := NewEventMetrics(db, "test-metrics")
assert.NoError(t, err)
s := "my-events"
now := time.Now()
k1 := now.Add(-3 * time.Second)
v1 := 0.05
assert.NoError(t, m.db.Insert(&Event{
Stream: s,
Timestamp: k1,
Data: encodeEvent(v1),
}))
period := 20 * time.Minute
called := false
assert.NoError(t, m.AggregateMetric(s, nil, period, func(vs []*Event) (float64, error) {
called = true
assert.Equal(t, 1, len(vs))
assert.Equal(t, v1, decodeEvent(vs[0].Data))
return 0.0, nil
}))
assert.False(t, called)
assert.NoError(t, m.updateMetrics(now))
assert.True(t, called)
}
func TestDynamicMetric(t *testing.T) {
testutils.MediumTest(t)
tmp, err := ioutil.TempDir("", "")
assert.NoError(t, err)
defer testutils.RemoveAll(t, tmp)
db, err := NewEventDB(path.Join(tmp, "events.bdb"))
assert.NoError(t, err)
m, err := NewEventMetrics(db, "test-dynamic-metrics")
assert.NoError(t, err)
s := "my-events"
now := time.Now()
k := now.Add(-5 * 20 * time.Minute)
for i := 0; i < 20; i++ {
v := 0.05 * float64(i)
assert.NoError(t, m.db.Insert(&Event{
Stream: s,
Timestamp: k,
Data: encodeEvent(v),
}))
k = k.Add(5 * time.Minute)
}
period := 100 * time.Minute
assert.NoError(t, m.DynamicMetric(s, nil, period, func(vs []*Event) ([]map[string]string, []float64, error) {
tags := []map[string]string{}
vals := []float64{}
for _, e := range vs {
t := map[string]string{}
v := decodeEvent(e.Data)
if v >= 0.5 {
t["category"] = "large"
} else {
t["category"] = "small"
}
tags = append(tags, t)
vals = append(vals, v)
}
return tags, vals, nil
}))
assert.NoError(t, m.updateMetrics(now))
// Ensure that we got the right dynamic metrics.
assert.Equal(t, 2, len(m.currentDynamicMetrics))
// Wait for the "small" events to scroll off, ensure that we deleted the
// old metric.
t1 := now.Add(50 * time.Minute)
assert.NoError(t, m.updateMetrics(t1))
assert.Equal(t, 1, len(m.currentDynamicMetrics))
}