github.com/SagerNet/gvisor@v0.0.0-20210707092255-7731c139d75c/pkg/tcpip/transport/tcp/rcv_test.go (about)

     1  // Copyright 2020 The gVisor Authors.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package rcv_test
    16  
    17  import (
    18  	"testing"
    19  
    20  	"github.com/SagerNet/gvisor/pkg/tcpip/header"
    21  	"github.com/SagerNet/gvisor/pkg/tcpip/seqnum"
    22  )
    23  
    24  func TestAcceptable(t *testing.T) {
    25  	for _, tt := range []struct {
    26  		segSeq         seqnum.Value
    27  		segLen         seqnum.Size
    28  		rcvNxt, rcvAcc seqnum.Value
    29  		want           bool
    30  	}{
    31  		// The segment is smaller than the window.
    32  		{105, 2, 100, 104, false},
    33  		{105, 2, 101, 105, true},
    34  		{105, 2, 102, 106, true},
    35  		{105, 2, 103, 107, true},
    36  		{105, 2, 104, 108, true},
    37  		{105, 2, 105, 109, true},
    38  		{105, 2, 106, 110, true},
    39  		{105, 2, 107, 111, false},
    40  
    41  		// The segment is larger than the window.
    42  		{105, 4, 103, 105, true},
    43  		{105, 4, 104, 106, true},
    44  		{105, 4, 105, 107, true},
    45  		{105, 4, 106, 108, true},
    46  		{105, 4, 107, 109, true},
    47  		{105, 4, 108, 110, true},
    48  		{105, 4, 109, 111, false},
    49  		{105, 4, 110, 112, false},
    50  
    51  		// The segment has no width.
    52  		{105, 0, 100, 102, false},
    53  		{105, 0, 101, 103, false},
    54  		{105, 0, 102, 104, false},
    55  		{105, 0, 103, 105, true},
    56  		{105, 0, 104, 106, true},
    57  		{105, 0, 105, 107, true},
    58  		{105, 0, 106, 108, false},
    59  		{105, 0, 107, 109, false},
    60  
    61  		// The receive window has no width.
    62  		{105, 2, 103, 103, false},
    63  		{105, 2, 104, 104, false},
    64  		{105, 2, 105, 105, false},
    65  		{105, 2, 106, 106, false},
    66  		{105, 2, 107, 107, false},
    67  		{105, 2, 108, 108, false},
    68  		{105, 2, 109, 109, false},
    69  	} {
    70  		if got := header.Acceptable(tt.segSeq, tt.segLen, tt.rcvNxt, tt.rcvAcc); got != tt.want {
    71  			t.Errorf("header.Acceptable(%d, %d, %d, %d) = %t, want %t", tt.segSeq, tt.segLen, tt.rcvNxt, tt.rcvAcc, got, tt.want)
    72  		}
    73  	}
    74  }