blob: 038964a6ddfa2c7b22951ab585c77f65be5b7683 [file] [log] [blame]
// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build go1.21
package quic
import (
"math"
"testing"
"time"
)
func TestAckDelayFromDuration(t *testing.T) {
for _, test := range []struct {
d time.Duration
ackDelayExponent uint8
want unscaledAckDelay
}{{
d: 8 * time.Microsecond,
ackDelayExponent: 3,
want: 1,
}, {
d: 1 * time.Nanosecond,
ackDelayExponent: 3,
want: 0, // rounds to zero
}, {
d: 3 * (1 << 20) * time.Microsecond,
ackDelayExponent: 20,
want: 3,
}} {
got := unscaledAckDelayFromDuration(test.d, test.ackDelayExponent)
if got != test.want {
t.Errorf("unscaledAckDelayFromDuration(%v, %v) = %v, want %v",
test.d, test.ackDelayExponent, got, test.want)
}
}
}
func TestAckDelayToDuration(t *testing.T) {
for _, test := range []struct {
d unscaledAckDelay
ackDelayExponent uint8
want time.Duration
}{{
d: 1,
ackDelayExponent: 3,
want: 8 * time.Microsecond,
}, {
d: 0,
ackDelayExponent: 3,
want: 0,
}, {
d: 3,
ackDelayExponent: 20,
want: 3 * (1 << 20) * time.Microsecond,
}, {
d: math.MaxInt64 / 1000,
ackDelayExponent: 0,
want: (math.MaxInt64 / 1000) * time.Microsecond,
}, {
d: (math.MaxInt64 / 1000) + 1,
ackDelayExponent: 0,
want: 0, // return 0 on overflow
}, {
d: math.MaxInt64 / 1000 / 8,
ackDelayExponent: 3,
want: (math.MaxInt64 / 1000 / 8) * 8 * time.Microsecond,
}, {
d: (math.MaxInt64 / 1000 / 8) + 1,
ackDelayExponent: 3,
want: 0, // return 0 on overflow
}} {
got := test.d.Duration(test.ackDelayExponent)
if got != test.want {
t.Errorf("unscaledAckDelay(%v).Duration(%v) = %v, want %v",
test.d, test.ackDelayExponent, int64(got), int64(test.want))
}
}
}