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