blob: a6eca0af78440fab3482bf36f5cba0a5c5b41213 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package counter
import (
"reflect"
"testing"
"time"
)
func TestTimeSeries(t *testing.T) {
now := time.Unix(1, 0)
ts := newTimeSeries(now, 5*time.Second, time.Second)
// Time 1
ts.advanceTime(now)
ts.set(123)
if expected, got := int64(123), ts.headValue(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
ts.set(234)
if expected, got := int64(234), ts.headValue(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
if expected, got := int64(234), ts.min(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
if expected, got := int64(234), ts.max(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
// Time 2
now = now.Add(time.Second)
ts.advanceTime(now)
ts.set(345)
if expected, got := int64(345), ts.headValue(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
if expected, got := int64(0), ts.tailValue(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
if expected, got := int64(234), ts.min(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
if expected, got := int64(345), ts.max(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
// Time 4
now = now.Add(2 * time.Second)
ts.advanceTime(now)
ts.set(111)
if expected, got := int64(111), ts.headValue(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
if expected, got := int64(0), ts.tailValue(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
if expected, got := int64(111), ts.min(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
if expected, got := int64(345), ts.max(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
// Time 7
now = now.Add(3 * time.Second)
ts.advanceTime(now)
if expected, got := int64(111), ts.headValue(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
if expected, got := int64(345), ts.tailValue(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
if expected, got := int64(111), ts.min(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
if expected, got := int64(345), ts.max(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
// Time 8
now = now.Add(time.Second)
ts.advanceTime(now)
if expected, got := int64(111), ts.headValue(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
if expected, got := int64(345), ts.tailValue(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
if expected, got := int64(111), ts.min(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
if expected, got := int64(111), ts.max(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
// Time 27
now = now.Add(20 * time.Second)
ts.advanceTime(now)
if expected, got := int64(111), ts.headValue(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
if expected, got := int64(111), ts.tailValue(); got != expected {
t.Errorf("unexpected value. Got %v, want %v", got, expected)
}
}
func TestTimeSeriesRate(t *testing.T) {
now := time.Unix(1, 0)
ts := newTimeSeries(now, 60*time.Second, time.Second)
// Increment by 5 every 4 seconds. The rate is 1.25.
for i := 0; i < 10; i++ {
now = now.Add(4 * time.Second)
ts.advanceTime(now)
ts.incr(5)
}
if expected, got := float64(1.25), ts.rate(); got != expected {
t.Errorf("Unexpected value. Got %v, want %v", got, expected)
}
}
func TestTimeSeriesValues(t *testing.T) {
now := time.Unix(1, 0)
// 6 time slots.
ts := newTimeSeries(now, 5*time.Second, time.Second)
// Add 3 values.
// slots: [0, 1, 2, 3, x, x]
// values: [0, 1, 2, 3]
now = addValue(1, 3, ts, now)
if expected, got := []int64{0, 1, 2, 3}, ts.values(); !reflect.DeepEqual(got, expected) {
t.Errorf("unexpected values. Got %v, want %v", got, expected)
}
// Add 2 more values.
// slots: [0, 1, 2, 3, 4, 5]
// values: [0, 1, 2, 3, 4, 5]
now = addValue(1, 2, ts, now)
if expected, got := []int64{0, 1, 2, 3, 4, 5}, ts.values(); !reflect.DeepEqual(got, expected) {
t.Errorf("unexpected values. Got %v, want %v", got, expected)
}
// Add 3 more values.
// slots: [6, 7, 8, 3, 4, 5]
// values: [3, 4, 5, 6, 7, 8]
now = addValue(1, 3, ts, now)
if expected, got := []int64{3, 4, 5, 6, 7, 8}, ts.values(); !reflect.DeepEqual(got, expected) {
t.Errorf("unexpected values. Got %v, want %v", got, expected)
}
}
func addValue(increment int64, count int, ts *timeseries, now time.Time) time.Time {
for i := 0; i < count; i++ {
now = now.Add(time.Second)
ts.advanceTime(now)
ts.incr(increment)
}
return now
}