evcc-io/util/waiter_test.go
andig cd43f09263
Some checks failed
Default / Build (push) Failing after 1m46s
Default / Build UI (push) Failing after 2m12s
Release / call-build-workflow (push) Has been cancelled
Release / Publish Docker :release (push) Has been cancelled
Release / Publish Github & APT release (push) Has been cancelled
Make waiter always expect initial value even if timeout is zero (#2031)
2021-12-12 20:06:41 +01:00

76 lines
1.4 KiB
Go

package util
import (
"os"
"testing"
"time"
)
const testTimeout = 100 * time.Millisecond
func TestMain(t *testing.M) {
waitInitialTimeout = 2 * testTimeout
os.Exit(t.Run())
}
func TestWaiterInitialUpdateInTime(t *testing.T) {
for _, timeout := range []time.Duration{0, testTimeout} {
w := NewWaiter(timeout, func() {})
go func() {
time.Sleep(testTimeout / 2)
w.Update()
}()
w.Lock()
defer w.Unlock()
if elapsed := w.Overdue(); elapsed != 0 {
t.Errorf("expected %v, got %v", 0, elapsed)
}
}
}
func TestWaiterInitialUpdateNotReceived(t *testing.T) {
for _, timeout := range []time.Duration{0, testTimeout} {
w := NewWaiter(timeout, func() {})
w.Lock()
defer w.Unlock()
if elapsed := w.Overdue(); elapsed != waitInitialTimeout {
t.Errorf("expected %v, got %v", waitInitialTimeout, elapsed)
}
}
}
func TestWaiterUpdateInTime(t *testing.T) {
w := NewWaiter(testTimeout, func() {})
w.Update()
go func() {
time.Sleep(testTimeout / 2)
w.Update()
}()
w.Lock()
defer w.Unlock()
if elapsed := w.Overdue(); elapsed != 0 {
t.Errorf("expected %v, got %v", 0, elapsed)
}
}
func TestWaiterUpdateNotReceived(t *testing.T) {
w := NewWaiter(testTimeout, func() {})
w.Update()
time.Sleep(2 * testTimeout)
w.Lock()
defer w.Unlock()
if elapsed := w.Overdue(); elapsed < 2*testTimeout {
t.Errorf("expected >%v, got %v", 2*testTimeout, elapsed)
}
}