github.com/sberex/go-sberex@v1.8.2-0.20181113200658-ed96ac38f7d7/eth/filters/filter_test.go (about) 1 // This file is part of the go-sberex library. The go-sberex library is 2 // free software: you can redistribute it and/or modify it under the terms 3 // of the GNU Lesser General Public License as published by the Free 4 // Software Foundation, either version 3 of the License, or (at your option) 5 // any later version. 6 // 7 // The go-sberex library is distributed in the hope that it will be useful, 8 // but WITHOUT ANY WARRANTY; without even the implied warranty of 9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser 10 // General Public License <http://www.gnu.org/licenses/> for more details. 11 12 package filters 13 14 import ( 15 "context" 16 "io/ioutil" 17 "math/big" 18 "os" 19 "testing" 20 21 "github.com/Sberex/go-sberex/common" 22 "github.com/Sberex/go-sberex/consensus/ethash" 23 "github.com/Sberex/go-sberex/core" 24 "github.com/Sberex/go-sberex/core/types" 25 "github.com/Sberex/go-sberex/crypto" 26 "github.com/Sberex/go-sberex/ethdb" 27 "github.com/Sberex/go-sberex/event" 28 "github.com/Sberex/go-sberex/params" 29 ) 30 31 func makeReceipt(addr common.Address) *types.Receipt { 32 receipt := types.NewReceipt(nil, false, 0) 33 receipt.Logs = []*types.Log{ 34 {Address: addr}, 35 } 36 receipt.Bloom = types.CreateBloom(types.Receipts{receipt}) 37 return receipt 38 } 39 40 func BenchmarkFilters(b *testing.B) { 41 dir, err := ioutil.TempDir("", "filtertest") 42 if err != nil { 43 b.Fatal(err) 44 } 45 defer os.RemoveAll(dir) 46 47 var ( 48 db, _ = ethdb.NewLDBDatabase(dir, 0, 0) 49 mux = new(event.TypeMux) 50 txFeed = new(event.Feed) 51 rmLogsFeed = new(event.Feed) 52 logsFeed = new(event.Feed) 53 chainFeed = new(event.Feed) 54 backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} 55 key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") 56 addr1 = crypto.PubkeyToAddress(key1.PublicKey) 57 addr2 = common.BytesToAddress([]byte("jeff")) 58 addr3 = common.BytesToAddress([]byte("sberex")) 59 addr4 = common.BytesToAddress([]byte("random addresses please")) 60 ) 61 defer db.Close() 62 63 genesis := core.GenesisBlockForTesting(db, addr1, big.NewInt(1000000)) 64 chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 100010, func(i int, gen *core.BlockGen) { 65 switch i { 66 case 2403: 67 receipt := makeReceipt(addr1) 68 gen.AddUncheckedReceipt(receipt) 69 case 1034: 70 receipt := makeReceipt(addr2) 71 gen.AddUncheckedReceipt(receipt) 72 case 34: 73 receipt := makeReceipt(addr3) 74 gen.AddUncheckedReceipt(receipt) 75 case 99999: 76 receipt := makeReceipt(addr4) 77 gen.AddUncheckedReceipt(receipt) 78 79 } 80 }) 81 for i, block := range chain { 82 core.WriteBlock(db, block) 83 if err := core.WriteCanonicalHash(db, block.Hash(), block.NumberU64()); err != nil { 84 b.Fatalf("failed to insert block number: %v", err) 85 } 86 if err := core.WriteHeadBlockHash(db, block.Hash()); err != nil { 87 b.Fatalf("failed to insert block number: %v", err) 88 } 89 if err := core.WriteBlockReceipts(db, block.Hash(), block.NumberU64(), receipts[i]); err != nil { 90 b.Fatal("error writing block receipts:", err) 91 } 92 } 93 b.ResetTimer() 94 95 filter := New(backend, 0, -1, []common.Address{addr1, addr2, addr3, addr4}, nil) 96 97 for i := 0; i < b.N; i++ { 98 logs, _ := filter.Logs(context.Background()) 99 if len(logs) != 4 { 100 b.Fatal("expected 4 logs, got", len(logs)) 101 } 102 } 103 } 104 105 func TestFilters(t *testing.T) { 106 dir, err := ioutil.TempDir("", "filtertest") 107 if err != nil { 108 t.Fatal(err) 109 } 110 defer os.RemoveAll(dir) 111 112 var ( 113 db, _ = ethdb.NewLDBDatabase(dir, 0, 0) 114 mux = new(event.TypeMux) 115 txFeed = new(event.Feed) 116 rmLogsFeed = new(event.Feed) 117 logsFeed = new(event.Feed) 118 chainFeed = new(event.Feed) 119 backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} 120 key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") 121 addr = crypto.PubkeyToAddress(key1.PublicKey) 122 123 hash1 = common.BytesToHash([]byte("topic1")) 124 hash2 = common.BytesToHash([]byte("topic2")) 125 hash3 = common.BytesToHash([]byte("topic3")) 126 hash4 = common.BytesToHash([]byte("topic4")) 127 ) 128 defer db.Close() 129 130 genesis := core.GenesisBlockForTesting(db, addr, big.NewInt(1000000)) 131 chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 1000, func(i int, gen *core.BlockGen) { 132 switch i { 133 case 1: 134 receipt := types.NewReceipt(nil, false, 0) 135 receipt.Logs = []*types.Log{ 136 { 137 Address: addr, 138 Topics: []common.Hash{hash1}, 139 }, 140 } 141 gen.AddUncheckedReceipt(receipt) 142 case 2: 143 receipt := types.NewReceipt(nil, false, 0) 144 receipt.Logs = []*types.Log{ 145 { 146 Address: addr, 147 Topics: []common.Hash{hash2}, 148 }, 149 } 150 gen.AddUncheckedReceipt(receipt) 151 case 998: 152 receipt := types.NewReceipt(nil, false, 0) 153 receipt.Logs = []*types.Log{ 154 { 155 Address: addr, 156 Topics: []common.Hash{hash3}, 157 }, 158 } 159 gen.AddUncheckedReceipt(receipt) 160 case 999: 161 receipt := types.NewReceipt(nil, false, 0) 162 receipt.Logs = []*types.Log{ 163 { 164 Address: addr, 165 Topics: []common.Hash{hash4}, 166 }, 167 } 168 gen.AddUncheckedReceipt(receipt) 169 } 170 }) 171 for i, block := range chain { 172 core.WriteBlock(db, block) 173 if err := core.WriteCanonicalHash(db, block.Hash(), block.NumberU64()); err != nil { 174 t.Fatalf("failed to insert block number: %v", err) 175 } 176 if err := core.WriteHeadBlockHash(db, block.Hash()); err != nil { 177 t.Fatalf("failed to insert block number: %v", err) 178 } 179 if err := core.WriteBlockReceipts(db, block.Hash(), block.NumberU64(), receipts[i]); err != nil { 180 t.Fatal("error writing block receipts:", err) 181 } 182 } 183 184 filter := New(backend, 0, -1, []common.Address{addr}, [][]common.Hash{{hash1, hash2, hash3, hash4}}) 185 186 logs, _ := filter.Logs(context.Background()) 187 if len(logs) != 4 { 188 t.Error("expected 4 log, got", len(logs)) 189 } 190 191 filter = New(backend, 900, 999, []common.Address{addr}, [][]common.Hash{{hash3}}) 192 logs, _ = filter.Logs(context.Background()) 193 if len(logs) != 1 { 194 t.Error("expected 1 log, got", len(logs)) 195 } 196 if len(logs) > 0 && logs[0].Topics[0] != hash3 { 197 t.Errorf("expected log[0].Topics[0] to be %x, got %x", hash3, logs[0].Topics[0]) 198 } 199 200 filter = New(backend, 990, -1, []common.Address{addr}, [][]common.Hash{{hash3}}) 201 logs, _ = filter.Logs(context.Background()) 202 if len(logs) != 1 { 203 t.Error("expected 1 log, got", len(logs)) 204 } 205 if len(logs) > 0 && logs[0].Topics[0] != hash3 { 206 t.Errorf("expected log[0].Topics[0] to be %x, got %x", hash3, logs[0].Topics[0]) 207 } 208 209 filter = New(backend, 1, 10, nil, [][]common.Hash{{hash1, hash2}}) 210 211 logs, _ = filter.Logs(context.Background()) 212 if len(logs) != 2 { 213 t.Error("expected 2 log, got", len(logs)) 214 } 215 216 failHash := common.BytesToHash([]byte("fail")) 217 filter = New(backend, 0, -1, nil, [][]common.Hash{{failHash}}) 218 219 logs, _ = filter.Logs(context.Background()) 220 if len(logs) != 0 { 221 t.Error("expected 0 log, got", len(logs)) 222 } 223 224 failAddr := common.BytesToAddress([]byte("failmenow")) 225 filter = New(backend, 0, -1, []common.Address{failAddr}, nil) 226 227 logs, _ = filter.Logs(context.Background()) 228 if len(logs) != 0 { 229 t.Error("expected 0 log, got", len(logs)) 230 } 231 232 filter = New(backend, 0, -1, nil, [][]common.Hash{{failHash}, {hash1}}) 233 234 logs, _ = filter.Logs(context.Background()) 235 if len(logs) != 0 { 236 t.Error("expected 0 log, got", len(logs)) 237 } 238 }