// 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)) } } }