github.com/database64128/shadowsocks-go@v1.7.0/ss2022/slidingwindow_test.go (about)

     1  package ss2022
     2  
     3  import "testing"
     4  
     5  func TestIsOkMustAdd(t *testing.T) {
     6  	var (
     7  		filter Filter
     8  		n      uint64 = (swRingBlocks + 1) * swBlockBits
     9  	)
    10  
    11  	// Add 1, 3, 5, ..., n-1.
    12  	for i := uint64(1); i < n; i += 2 {
    13  		if !filter.IsOk(i) {
    14  			t.Error(i, "should be ok.")
    15  		}
    16  		filter.MustAdd(i)
    17  	}
    18  
    19  	// Check 0, 2, 4, ..., 126.
    20  	for i := uint64(1); i < n-swSize; i += 2 {
    21  		if filter.IsOk(i) {
    22  			t.Error(i, "should not be ok.")
    23  		}
    24  	}
    25  
    26  	// Check 128, 130, 132, ..., n-2.
    27  	for i := uint64(n - swSize); i < n; i += 2 {
    28  		if !filter.IsOk(i) {
    29  			t.Error(i, "should be ok.")
    30  		}
    31  	}
    32  
    33  	// Check 1, 3, 5, ..., n-1.
    34  	for i := uint64(1); i < n; i += 2 {
    35  		if filter.IsOk(i) {
    36  			t.Error(i, "should not be ok.")
    37  		}
    38  	}
    39  
    40  	// Roll over the window.
    41  	n *= 2
    42  	if !filter.IsOk(n) {
    43  		t.Error(n, "should be ok.")
    44  	}
    45  	filter.MustAdd(n)
    46  
    47  	// Check behind window.
    48  	for i := uint64(0); i < n-swSize; i++ {
    49  		if filter.IsOk(i) {
    50  			t.Error(i, "should not be ok.")
    51  		}
    52  	}
    53  
    54  	// Check within window.
    55  	for i := n - swSize; i < n; i++ {
    56  		if !filter.IsOk(i) {
    57  			t.Error(i, "should be ok.")
    58  		}
    59  	}
    60  
    61  	// Check after window.
    62  	for i := n + 1; i < n+swSize; i++ {
    63  		if !filter.IsOk(i) {
    64  			t.Error(i, "should be ok.")
    65  		}
    66  	}
    67  }
    68  
    69  func TestAdd(t *testing.T) {
    70  	var (
    71  		filter Filter
    72  		n      uint64 = (swRingBlocks + 1) * swBlockBits
    73  	)
    74  
    75  	// Add 1, 3, 5, ..., n-1.
    76  	for i := uint64(1); i < n; i += 2 {
    77  		if !filter.Add(i) {
    78  			t.Error(i, "should succeed.")
    79  		}
    80  	}
    81  
    82  	// Check 0, 2, 4, ..., 126.
    83  	for i := uint64(1); i < n-swSize; i += 2 {
    84  		if filter.Add(i) {
    85  			t.Error(i, "should fail.")
    86  		}
    87  	}
    88  
    89  	// Check 128, 130, 132, ..., n-2.
    90  	for i := uint64(n - swSize); i < n; i += 2 {
    91  		if !filter.Add(i) {
    92  			t.Error(i, "should succeed.")
    93  		}
    94  	}
    95  
    96  	// Check 1, 3, 5, ..., n-1.
    97  	for i := uint64(1); i < n; i += 2 {
    98  		if filter.Add(i) {
    99  			t.Error(i, "should fail.")
   100  		}
   101  	}
   102  
   103  	// Roll over the window.
   104  	n *= 2
   105  	if !filter.Add(n) {
   106  		t.Error(n, "should succeed.")
   107  	}
   108  
   109  	// Check behind window.
   110  	for i := uint64(0); i < n-swSize; i++ {
   111  		if filter.Add(i) {
   112  			t.Error(i, "should fail.")
   113  		}
   114  	}
   115  
   116  	// Check within window.
   117  	for i := n - swSize; i < n; i++ {
   118  		if !filter.Add(i) {
   119  			t.Error(i, "should succeed.")
   120  		}
   121  	}
   122  
   123  	// Check after window.
   124  	for i := n + 1; i < n+swSize; i++ {
   125  		if !filter.Add(i) {
   126  			t.Error(i, "should succeed.")
   127  		}
   128  	}
   129  }
   130  
   131  func TestReset(t *testing.T) {
   132  	var filter Filter
   133  
   134  	for i := uint64(0); i < swSize*2; i++ {
   135  		filter.MustAdd(i)
   136  	}
   137  
   138  	filter.Reset()
   139  
   140  	for i := uint64(0); i < swSize*2; i++ {
   141  		if !filter.IsOk(i) {
   142  			t.Error(i, "should be ok.")
   143  		}
   144  	}
   145  }