Spaces:
Running
Running
// _ _ | |
// __ _____ __ ___ ___ __ _| |_ ___ | |
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
// \ V V / __/ (_| |\ V /| | (_| | || __/ | |
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
// | |
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
// | |
// CONTACT: [email protected] | |
// | |
package helper | |
import ( | |
"fmt" | |
"testing" | |
"time" | |
"github.com/stretchr/testify/assert" | |
) | |
type fakeT struct { | |
lastError error | |
} | |
func (f *fakeT) Reset() { | |
f.lastError = nil | |
} | |
func (f *fakeT) Errorf(msg string, args ...interface{}) { | |
f.lastError = fmt.Errorf(msg, args...) | |
} | |
// AssertEventuallyEqual retries the 'actual' thunk every 10ms for a total of | |
// 300ms. If a single one succeeds, it returns, if all fails it eventually | |
// fails | |
func AssertEventuallyEqual(t *testing.T, expected interface{}, actualThunk func() interface{}, msg ...interface{}) { | |
t.Helper() | |
interval := 10 * time.Millisecond | |
timeout := 4000 * time.Millisecond | |
elapsed := 0 * time.Millisecond | |
fakeT := &fakeT{} | |
for elapsed < timeout { | |
fakeT.Reset() | |
actual := actualThunk() | |
assert.Equal(fakeT, expected, actual, msg...) | |
if fakeT.lastError == nil { | |
return | |
} | |
time.Sleep(interval) | |
elapsed += interval | |
} | |
t.Errorf("waiting for %s, but never succeeded:\n\n%s", elapsed, fakeT.lastError) | |
} | |
func AssertEventuallyEqualWithFrequencyAndTimeout(t *testing.T, expected interface{}, actualThunk func() interface{}, | |
interval time.Duration, timeout time.Duration, msg ...interface{}, | |
) { | |
elapsed := 0 * time.Millisecond | |
fakeT := &fakeT{} | |
for elapsed < timeout { | |
fakeT.Reset() | |
actual := actualThunk() | |
assert.Equal(fakeT, expected, actual, msg...) | |
if fakeT.lastError == nil { | |
return | |
} | |
time.Sleep(interval) | |
elapsed += interval | |
} | |
t.Errorf("waiting for %s, but never succeeded:\n\n%s", elapsed, fakeT.lastError) | |
} | |