1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
package flowcontrol
import (
"testing"
"time"
"github.com/quic-go/quic-go/internal/protocol"
"github.com/quic-go/quic-go/internal/qerr"
"github.com/quic-go/quic-go/internal/utils"
"github.com/stretchr/testify/require"
)
func TestConnectionFlowControlWindowUpdate(t *testing.T) {
fc := NewConnectionFlowController(
100, // initial receive window
100, // max receive window
nil,
&utils.RTTStats{},
utils.DefaultLogger,
)
require.False(t, fc.AddBytesRead(1))
require.Zero(t, fc.GetWindowUpdate(time.Now()))
require.True(t, fc.AddBytesRead(99))
require.Equal(t, protocol.ByteCount(200), fc.GetWindowUpdate(time.Now()))
}
func TestConnectionWindowAutoTuningNotAllowed(t *testing.T) {
// the RTT is 1 second
rttStats := &utils.RTTStats{}
rttStats.UpdateRTT(time.Second, 0)
require.Equal(t, time.Second, rttStats.SmoothedRTT())
callbackCalledWith := protocol.InvalidByteCount
fc := NewConnectionFlowController(
100, // initial receive window
150, // max receive window
func(size protocol.ByteCount) bool {
callbackCalledWith = size
return false
},
rttStats,
utils.DefaultLogger,
)
now := time.Now()
require.NoError(t, fc.IncrementHighestReceived(100, now))
fc.AddBytesRead(90)
require.Equal(t, protocol.InvalidByteCount, callbackCalledWith)
require.Equal(t, protocol.ByteCount(90+100), fc.GetWindowUpdate(now.Add(time.Millisecond)))
require.Equal(t, protocol.ByteCount(150-100), callbackCalledWith)
}
func TestConnectionFlowControlViolation(t *testing.T) {
fc := NewConnectionFlowController(100, 100, nil, &utils.RTTStats{}, utils.DefaultLogger)
require.NoError(t, fc.IncrementHighestReceived(40, time.Now()))
require.NoError(t, fc.IncrementHighestReceived(60, time.Now()))
err := fc.IncrementHighestReceived(1, time.Now())
var terr *qerr.TransportError
require.ErrorAs(t, err, &terr)
require.Equal(t, qerr.FlowControlError, terr.ErrorCode)
}
func TestConnectionFlowControllerReset(t *testing.T) {
fc := NewConnectionFlowController(0, 0, nil, &utils.RTTStats{}, utils.DefaultLogger)
fc.UpdateSendWindow(100)
fc.AddBytesSent(10)
require.Equal(t, protocol.ByteCount(90), fc.SendWindowSize())
require.NoError(t, fc.Reset())
require.Zero(t, fc.SendWindowSize())
}
func TestConnectionFlowControllerResetAfterReading(t *testing.T) {
fc := NewConnectionFlowController(0, 0, nil, &utils.RTTStats{}, utils.DefaultLogger)
fc.AddBytesRead(1)
require.EqualError(t, fc.Reset(), "flow controller reset after reading data")
}
|