blob: d253d3a8dea1d2615157a4dd86a1e6798fe85393 [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 "testing"
func TestSentVal(t *testing.T) {
for _, test := range []struct {
name string
f func(*sentVal)
wantIsSet bool
wantShouldSend bool
wantIsReceived bool
wantShouldSendPTO bool
}{{
name: "zero value",
f: func(*sentVal) {},
wantIsSet: false,
wantShouldSend: false,
wantShouldSendPTO: false,
wantIsReceived: false,
}, {
name: "v.set()",
f: (*sentVal).set,
wantIsSet: true,
wantShouldSend: true,
wantShouldSendPTO: true,
wantIsReceived: false,
}, {
name: "v.setSent(0)",
f: func(v *sentVal) {
v.setSent(0)
},
wantIsSet: true,
wantShouldSend: false,
wantShouldSendPTO: true,
wantIsReceived: false,
}, {
name: "sent.set()",
f: func(v *sentVal) {
v.setSent(0)
v.set()
},
wantIsSet: true,
wantShouldSend: false,
wantShouldSendPTO: true,
wantIsReceived: false,
}, {
name: "sent.setUnsent()",
f: func(v *sentVal) {
v.setSent(0)
v.setUnsent()
},
wantIsSet: true,
wantShouldSend: true,
wantShouldSendPTO: true,
wantIsReceived: false,
}, {
name: "set.clear()",
f: func(v *sentVal) {
v.set()
v.clear()
},
wantIsSet: false,
wantShouldSend: false,
wantShouldSendPTO: false,
wantIsReceived: false,
}, {
name: "v.setReceived()",
f: (*sentVal).setReceived,
wantIsSet: true,
wantShouldSend: false,
wantShouldSendPTO: false,
wantIsReceived: true,
}, {
name: "v.ackOrLoss(!pnum, true)",
f: func(v *sentVal) {
v.setSent(1)
v.ackOrLoss(0, packetAcked) // ack different packet containing the val
},
wantIsSet: true,
wantShouldSend: false,
wantShouldSendPTO: false,
wantIsReceived: true,
}, {
name: "v.ackOrLoss(!pnum, packetLost)",
f: func(v *sentVal) {
v.setSent(1)
v.ackOrLoss(0, packetLost) // lose different packet containing the val
},
wantIsSet: true,
wantShouldSend: false,
wantShouldSendPTO: true,
wantIsReceived: false,
}, {
name: "v.ackOrLoss(pnum, packetLost)",
f: func(v *sentVal) {
v.setSent(1)
v.ackOrLoss(1, packetLost) // lose same packet containing the val
},
wantIsSet: true,
wantShouldSend: true,
wantShouldSendPTO: true,
wantIsReceived: false,
}, {
name: "v.ackLatestOrLoss(!pnum, packetAcked)",
f: func(v *sentVal) {
v.setSent(1)
v.ackLatestOrLoss(0, packetAcked) // ack different packet containing the val
},
wantIsSet: true,
wantShouldSend: false,
wantShouldSendPTO: true,
wantIsReceived: false,
}, {
name: "v.ackLatestOrLoss(pnum, packetAcked)",
f: func(v *sentVal) {
v.setSent(1)
v.ackLatestOrLoss(1, packetAcked) // ack same packet containing the val
},
wantIsSet: true,
wantShouldSend: false,
wantShouldSendPTO: false,
wantIsReceived: true,
}, {
name: "v.ackLatestOrLoss(!pnum, packetLost)",
f: func(v *sentVal) {
v.setSent(1)
v.ackLatestOrLoss(0, packetLost) // lose different packet containing the val
},
wantIsSet: true,
wantShouldSend: false,
wantShouldSendPTO: true,
wantIsReceived: false,
}, {
name: "v.ackLatestOrLoss(pnum, packetLost)",
f: func(v *sentVal) {
v.setSent(1)
v.ackLatestOrLoss(1, packetLost) // lose same packet containing the val
},
wantIsSet: true,
wantShouldSend: true,
wantShouldSendPTO: true,
wantIsReceived: false,
}} {
var v sentVal
test.f(&v)
if got, want := v.isSet(), test.wantIsSet; got != want {
t.Errorf("%v: v.isSet() = %v, want %v", test.name, got, want)
}
if got, want := v.shouldSend(), test.wantShouldSend; got != want {
t.Errorf("%v: v.shouldSend() = %v, want %v", test.name, got, want)
}
if got, want := v.shouldSendPTO(false), test.wantShouldSend; got != want {
t.Errorf("%v: v.shouldSendPTO(false) = %v, want %v", test.name, got, want)
}
if got, want := v.shouldSendPTO(true), test.wantShouldSendPTO; got != want {
t.Errorf("%v: v.shouldSendPTO(true) = %v, want %v", test.name, got, want)
}
if got, want := v.isReceived(), test.wantIsReceived; got != want {
t.Errorf("%v: v.isReceived() = %v, want %v", test.name, got, want)
}
}
}