github.com/susy-go/susy-graviton@v0.0.0-20190614130430-36cddae42305/swarm/shed/field_uint64_test.go (about) 1 // Copyleft 2018 The susy-graviton Authors 2 // This file is part of the susy-graviton library. 3 // 4 // The susy-graviton library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The susy-graviton library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MSRCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the susy-graviton library. If not, see <http://www.gnu.org/licenses/>. 16 17 package shed 18 19 import ( 20 "testing" 21 22 "github.com/syndtr/goleveldb/leveldb" 23 ) 24 25 // TestUint64Field validates put and get operations 26 // of the Uint64Field. 27 func TestUint64Field(t *testing.T) { 28 db, cleanupFunc := newTestDB(t) 29 defer cleanupFunc() 30 31 counter, err := db.NewUint64Field("counter") 32 if err != nil { 33 t.Fatal(err) 34 } 35 36 t.Run("get empty", func(t *testing.T) { 37 got, err := counter.Get() 38 if err != nil { 39 t.Fatal(err) 40 } 41 var want uint64 42 if got != want { 43 t.Errorf("got uint64 %v, want %v", got, want) 44 } 45 }) 46 47 t.Run("put", func(t *testing.T) { 48 var want uint64 = 42 49 err = counter.Put(want) 50 if err != nil { 51 t.Fatal(err) 52 } 53 got, err := counter.Get() 54 if err != nil { 55 t.Fatal(err) 56 } 57 if got != want { 58 t.Errorf("got uint64 %v, want %v", got, want) 59 } 60 61 t.Run("overwrite", func(t *testing.T) { 62 var want uint64 = 84 63 err = counter.Put(want) 64 if err != nil { 65 t.Fatal(err) 66 } 67 got, err := counter.Get() 68 if err != nil { 69 t.Fatal(err) 70 } 71 if got != want { 72 t.Errorf("got uint64 %v, want %v", got, want) 73 } 74 }) 75 }) 76 77 t.Run("put in batch", func(t *testing.T) { 78 batch := new(leveldb.Batch) 79 var want uint64 = 42 80 counter.PutInBatch(batch, want) 81 err = db.WriteBatch(batch) 82 if err != nil { 83 t.Fatal(err) 84 } 85 got, err := counter.Get() 86 if err != nil { 87 t.Fatal(err) 88 } 89 if got != want { 90 t.Errorf("got uint64 %v, want %v", got, want) 91 } 92 93 t.Run("overwrite", func(t *testing.T) { 94 batch := new(leveldb.Batch) 95 var want uint64 = 84 96 counter.PutInBatch(batch, want) 97 err = db.WriteBatch(batch) 98 if err != nil { 99 t.Fatal(err) 100 } 101 got, err := counter.Get() 102 if err != nil { 103 t.Fatal(err) 104 } 105 if got != want { 106 t.Errorf("got uint64 %v, want %v", got, want) 107 } 108 }) 109 }) 110 } 111 112 // TestUint64Field_Inc validates Inc operation 113 // of the Uint64Field. 114 func TestUint64Field_Inc(t *testing.T) { 115 db, cleanupFunc := newTestDB(t) 116 defer cleanupFunc() 117 118 counter, err := db.NewUint64Field("counter") 119 if err != nil { 120 t.Fatal(err) 121 } 122 123 var want uint64 = 1 124 got, err := counter.Inc() 125 if err != nil { 126 t.Fatal(err) 127 } 128 if got != want { 129 t.Errorf("got uint64 %v, want %v", got, want) 130 } 131 132 want = 2 133 got, err = counter.Inc() 134 if err != nil { 135 t.Fatal(err) 136 } 137 if got != want { 138 t.Errorf("got uint64 %v, want %v", got, want) 139 } 140 } 141 142 // TestUint64Field_IncInBatch validates IncInBatch operation 143 // of the Uint64Field. 144 func TestUint64Field_IncInBatch(t *testing.T) { 145 db, cleanupFunc := newTestDB(t) 146 defer cleanupFunc() 147 148 counter, err := db.NewUint64Field("counter") 149 if err != nil { 150 t.Fatal(err) 151 } 152 153 batch := new(leveldb.Batch) 154 var want uint64 = 1 155 got, err := counter.IncInBatch(batch) 156 if err != nil { 157 t.Fatal(err) 158 } 159 if got != want { 160 t.Errorf("got uint64 %v, want %v", got, want) 161 } 162 err = db.WriteBatch(batch) 163 if err != nil { 164 t.Fatal(err) 165 } 166 got, err = counter.Get() 167 if err != nil { 168 t.Fatal(err) 169 } 170 if got != want { 171 t.Errorf("got uint64 %v, want %v", got, want) 172 } 173 174 batch2 := new(leveldb.Batch) 175 want = 2 176 got, err = counter.IncInBatch(batch2) 177 if err != nil { 178 t.Fatal(err) 179 } 180 if got != want { 181 t.Errorf("got uint64 %v, want %v", got, want) 182 } 183 err = db.WriteBatch(batch2) 184 if err != nil { 185 t.Fatal(err) 186 } 187 got, err = counter.Get() 188 if err != nil { 189 t.Fatal(err) 190 } 191 if got != want { 192 t.Errorf("got uint64 %v, want %v", got, want) 193 } 194 } 195 196 // TestUint64Field_Dec validates Dec operation 197 // of the Uint64Field. 198 func TestUint64Field_Dec(t *testing.T) { 199 db, cleanupFunc := newTestDB(t) 200 defer cleanupFunc() 201 202 counter, err := db.NewUint64Field("counter") 203 if err != nil { 204 t.Fatal(err) 205 } 206 207 // test overflow protection 208 var want uint64 209 got, err := counter.Dec() 210 if err != nil { 211 t.Fatal(err) 212 } 213 if got != want { 214 t.Errorf("got uint64 %v, want %v", got, want) 215 } 216 217 want = 32 218 err = counter.Put(want) 219 if err != nil { 220 t.Fatal(err) 221 } 222 223 want = 31 224 got, err = counter.Dec() 225 if err != nil { 226 t.Fatal(err) 227 } 228 if got != want { 229 t.Errorf("got uint64 %v, want %v", got, want) 230 } 231 } 232 233 // TestUint64Field_DecInBatch validates DecInBatch operation 234 // of the Uint64Field. 235 func TestUint64Field_DecInBatch(t *testing.T) { 236 db, cleanupFunc := newTestDB(t) 237 defer cleanupFunc() 238 239 counter, err := db.NewUint64Field("counter") 240 if err != nil { 241 t.Fatal(err) 242 } 243 244 batch := new(leveldb.Batch) 245 var want uint64 246 got, err := counter.DecInBatch(batch) 247 if err != nil { 248 t.Fatal(err) 249 } 250 if got != want { 251 t.Errorf("got uint64 %v, want %v", got, want) 252 } 253 err = db.WriteBatch(batch) 254 if err != nil { 255 t.Fatal(err) 256 } 257 got, err = counter.Get() 258 if err != nil { 259 t.Fatal(err) 260 } 261 if got != want { 262 t.Errorf("got uint64 %v, want %v", got, want) 263 } 264 265 batch2 := new(leveldb.Batch) 266 want = 42 267 counter.PutInBatch(batch2, want) 268 err = db.WriteBatch(batch2) 269 if err != nil { 270 t.Fatal(err) 271 } 272 got, err = counter.Get() 273 if err != nil { 274 t.Fatal(err) 275 } 276 if got != want { 277 t.Errorf("got uint64 %v, want %v", got, want) 278 } 279 280 batch3 := new(leveldb.Batch) 281 want = 41 282 got, err = counter.DecInBatch(batch3) 283 if err != nil { 284 t.Fatal(err) 285 } 286 if got != want { 287 t.Errorf("got uint64 %v, want %v", got, want) 288 } 289 err = db.WriteBatch(batch3) 290 if err != nil { 291 t.Fatal(err) 292 } 293 got, err = counter.Get() 294 if err != nil { 295 t.Fatal(err) 296 } 297 if got != want { 298 t.Errorf("got uint64 %v, want %v", got, want) 299 } 300 }