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 }