mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
3257fcfd8d
This should allow implementing high availability scheme described at https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4792#issuecomment-1674338561 See also https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4893
90 lines
2.2 KiB
Go
90 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"testing"
|
|
)
|
|
|
|
func TestReadTrackingBodyRetrySuccess(t *testing.T) {
|
|
f := func(s string) {
|
|
t.Helper()
|
|
rtb := &readTrackingBody{
|
|
r: io.NopCloser(bytes.NewBufferString(s)),
|
|
}
|
|
if !rtb.canRetry() {
|
|
t.Fatalf("canRetry() must return true")
|
|
}
|
|
for i := 0; i < 5; i++ {
|
|
data, err := io.ReadAll(rtb)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error when reading all the data at iteration %d: %s", i, err)
|
|
}
|
|
if string(data) != s {
|
|
t.Fatalf("unexpected data read at iteration %d\ngot\n%s\nwant\n%s", i, data, s)
|
|
}
|
|
if err := rtb.Close(); err != nil {
|
|
t.Fatalf("unexpected error when closing readTrackingBody at iteration %d: %s", i, err)
|
|
}
|
|
if !rtb.canRetry() {
|
|
t.Fatalf("canRetry() must return true at iteration %d", i)
|
|
}
|
|
}
|
|
}
|
|
|
|
f("")
|
|
f("foo")
|
|
f("foobar")
|
|
f(newTestString(maxRequestBodySizeToRetry.IntN()))
|
|
}
|
|
|
|
func TestReadTrackingBodyRetryFailure(t *testing.T) {
|
|
f := func(s string) {
|
|
t.Helper()
|
|
rtb := &readTrackingBody{
|
|
r: io.NopCloser(bytes.NewBufferString(s)),
|
|
}
|
|
if !rtb.canRetry() {
|
|
t.Fatalf("canRetry() must return true")
|
|
}
|
|
buf := make([]byte, 1)
|
|
n, err := rtb.Read(buf)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error when reading a single byte: %s", err)
|
|
}
|
|
if n != 1 {
|
|
t.Fatalf("unexpected number of bytes read; got %d; want 1", n)
|
|
}
|
|
if rtb.canRetry() {
|
|
t.Fatalf("canRetry() must return false")
|
|
}
|
|
data, err := io.ReadAll(rtb)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error when reading all the data: %s", err)
|
|
}
|
|
if string(buf)+string(data) != s {
|
|
t.Fatalf("unexpected data read\ngot\n%s\nwant\n%s", string(buf)+string(data), s)
|
|
}
|
|
if err := rtb.Close(); err != nil {
|
|
t.Fatalf("unexpected error when closing readTrackingBody: %s", err)
|
|
}
|
|
if rtb.canRetry() {
|
|
t.Fatalf("canRetry() must return false")
|
|
}
|
|
|
|
data, err = io.ReadAll(rtb)
|
|
if err == nil {
|
|
t.Fatalf("expecting non-nil error")
|
|
}
|
|
if len(data) != 0 {
|
|
t.Fatalf("unexpected non-empty data read: %q", data)
|
|
}
|
|
}
|
|
|
|
f(newTestString(maxRequestBodySizeToRetry.IntN() + 1))
|
|
f(newTestString(2 * maxRequestBodySizeToRetry.IntN()))
|
|
}
|
|
|
|
func newTestString(sLen int) string {
|
|
return string(make([]byte, sLen))
|
|
}
|