github.com/FUSIONFoundation/efsn@v3.6.2-0.20200916075423-dbb5dd5d2cc7+incompatible/swarm/storage/memstore_test.go (about) 1 // Copyright 2016 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum 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 go-ethereum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY 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 go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 package storage 18 19 import ( 20 "context" 21 "testing" 22 23 "github.com/FusionFoundation/efsn/swarm/log" 24 ) 25 26 func newTestMemStore() *MemStore { 27 storeparams := NewDefaultStoreParams() 28 return NewMemStore(storeparams, nil) 29 } 30 31 func testMemStoreRandom(n int, chunksize int64, t *testing.T) { 32 m := newTestMemStore() 33 defer m.Close() 34 testStoreRandom(m, n, chunksize, t) 35 } 36 37 func testMemStoreCorrect(n int, chunksize int64, t *testing.T) { 38 m := newTestMemStore() 39 defer m.Close() 40 testStoreCorrect(m, n, chunksize, t) 41 } 42 43 func TestMemStoreRandom_1(t *testing.T) { 44 testMemStoreRandom(1, 0, t) 45 } 46 47 func TestMemStoreCorrect_1(t *testing.T) { 48 testMemStoreCorrect(1, 4104, t) 49 } 50 51 func TestMemStoreRandom_1k(t *testing.T) { 52 testMemStoreRandom(1000, 0, t) 53 } 54 55 func TestMemStoreCorrect_1k(t *testing.T) { 56 testMemStoreCorrect(100, 4096, t) 57 } 58 59 func TestMemStoreNotFound(t *testing.T) { 60 m := newTestMemStore() 61 defer m.Close() 62 63 _, err := m.Get(context.TODO(), ZeroAddr) 64 if err != ErrChunkNotFound { 65 t.Errorf("Expected ErrChunkNotFound, got %v", err) 66 } 67 } 68 69 func benchmarkMemStorePut(n int, processors int, chunksize int64, b *testing.B) { 70 m := newTestMemStore() 71 defer m.Close() 72 benchmarkStorePut(m, n, chunksize, b) 73 } 74 75 func benchmarkMemStoreGet(n int, processors int, chunksize int64, b *testing.B) { 76 m := newTestMemStore() 77 defer m.Close() 78 benchmarkStoreGet(m, n, chunksize, b) 79 } 80 81 func BenchmarkMemStorePut_1_500(b *testing.B) { 82 benchmarkMemStorePut(500, 1, 4096, b) 83 } 84 85 func BenchmarkMemStorePut_8_500(b *testing.B) { 86 benchmarkMemStorePut(500, 8, 4096, b) 87 } 88 89 func BenchmarkMemStoreGet_1_500(b *testing.B) { 90 benchmarkMemStoreGet(500, 1, 4096, b) 91 } 92 93 func BenchmarkMemStoreGet_8_500(b *testing.B) { 94 benchmarkMemStoreGet(500, 8, 4096, b) 95 } 96 97 func TestMemStoreAndLDBStore(t *testing.T) { 98 ldb, cleanup := newLDBStore(t) 99 ldb.setCapacity(4000) 100 defer cleanup() 101 102 cacheCap := 200 103 memStore := NewMemStore(NewStoreParams(4000, 200, nil, nil), nil) 104 105 tests := []struct { 106 n int // number of chunks to push to memStore 107 chunkSize int64 // size of chunk (by default in Swarm - 4096) 108 }{ 109 { 110 n: 1, 111 chunkSize: 4096, 112 }, 113 { 114 n: 201, 115 chunkSize: 4096, 116 }, 117 { 118 n: 501, 119 chunkSize: 4096, 120 }, 121 { 122 n: 3100, 123 chunkSize: 4096, 124 }, 125 { 126 n: 100, 127 chunkSize: 4096, 128 }, 129 } 130 131 for i, tt := range tests { 132 log.Info("running test", "idx", i, "tt", tt) 133 var chunks []Chunk 134 135 for i := 0; i < tt.n; i++ { 136 c := GenerateRandomChunk(tt.chunkSize) 137 chunks = append(chunks, c) 138 } 139 140 for i := 0; i < tt.n; i++ { 141 err := ldb.Put(context.TODO(), chunks[i]) 142 if err != nil { 143 t.Fatal(err) 144 } 145 err = memStore.Put(context.TODO(), chunks[i]) 146 if err != nil { 147 t.Fatal(err) 148 } 149 150 if got := memStore.cache.Len(); got > cacheCap { 151 t.Fatalf("expected to get cache capacity less than %v, but got %v", cacheCap, got) 152 } 153 154 } 155 156 for i := 0; i < tt.n; i++ { 157 _, err := memStore.Get(context.TODO(), chunks[i].Address()) 158 if err != nil { 159 if err == ErrChunkNotFound { 160 _, err := ldb.Get(context.TODO(), chunks[i].Address()) 161 if err != nil { 162 t.Fatalf("couldn't get chunk %v from ldb, got error: %v", i, err) 163 } 164 } else { 165 t.Fatalf("got error from memstore: %v", err) 166 } 167 } 168 } 169 } 170 }