// NewFilterSystem returns a newly allocated filter manager func NewFilterSystem(mux *event.TypeMux) *FilterSystem { fs := &FilterSystem{ filters: make(map[int]*Filter), created: make(map[int]time.Time), } fs.sub = mux.Subscribe( //core.PendingBlockEvent{}, core.ChainEvent{}, core.TxPreEvent{}, vm.Logs(nil), ) go fs.filterLoop() return fs }
func NewTxPool(eventMux *event.TypeMux, currentStateFn stateFn, gasLimitFn func() *big.Int) *TxPool { pool := &TxPool{ pending: make(map[common.Hash]*types.Transaction), queue: make(map[common.Address]map[common.Hash]*types.Transaction), quit: make(chan bool), eventMux: eventMux, currentState: currentStateFn, gasLimit: gasLimitFn, minGasPrice: new(big.Int), pendingState: nil, events: eventMux.Subscribe(ChainHeadEvent{}, GasPriceChanged{}, RemovedTransactionEvent{}), } go pool.eventLoop() return pool }
func NewTxPool(config *ChainConfig, eventMux *event.TypeMux, currentStateFn stateFn, gasLimitFn func() *big.Int) *TxPool { pool := &TxPool{ config: config, pending: make(map[common.Address]*txList), queue: make(map[common.Address]*txList), all: make(map[common.Hash]*types.Transaction), beats: make(map[common.Address]time.Time), eventMux: eventMux, currentState: currentStateFn, gasLimit: gasLimitFn, minGasPrice: new(big.Int), pendingState: nil, localTx: newTxSet(), events: eventMux.Subscribe(ChainHeadEvent{}, GasPriceChanged{}, RemovedTransactionEvent{}), quit: make(chan struct{}), } pool.wg.Add(2) go pool.eventLoop() go pool.expirationLoop() return pool }
func TestCallbacks(t *testing.T) { var ( mux event.TypeMux fs = NewFilterSystem(&mux) blockDone = make(chan struct{}) txDone = make(chan struct{}) logDone = make(chan struct{}) removedLogDone = make(chan struct{}) pendingLogDone = make(chan struct{}) ) blockFilter := &Filter{ BlockCallback: func(*types.Block, vm.Logs) { close(blockDone) }, } txFilter := &Filter{ TransactionCallback: func(*types.Transaction) { close(txDone) }, } logFilter := &Filter{ LogCallback: func(l *vm.Log, oob bool) { if !oob { close(logDone) } }, } removedLogFilter := &Filter{ LogCallback: func(l *vm.Log, oob bool) { if oob { close(removedLogDone) } }, } pendingLogFilter := &Filter{ LogCallback: func(*vm.Log, bool) { close(pendingLogDone) }, } fs.Add(blockFilter, ChainFilter) fs.Add(txFilter, PendingTxFilter) fs.Add(logFilter, LogFilter) fs.Add(removedLogFilter, LogFilter) fs.Add(pendingLogFilter, PendingLogFilter) mux.Post(core.ChainEvent{}) mux.Post(core.TxPreEvent{}) mux.Post(vm.Logs{&vm.Log{}}) mux.Post(core.RemovedLogsEvent{Logs: vm.Logs{&vm.Log{}}}) mux.Post(core.PendingLogsEvent{Logs: vm.Logs{&vm.Log{}}}) const dura = 5 * time.Second failTimer := time.NewTimer(dura) select { case <-blockDone: case <-failTimer.C: t.Error("block filter failed to trigger (timeout)") } failTimer.Reset(dura) select { case <-txDone: case <-failTimer.C: t.Error("transaction filter failed to trigger (timeout)") } failTimer.Reset(dura) select { case <-logDone: case <-failTimer.C: t.Error("log filter failed to trigger (timeout)") } failTimer.Reset(dura) select { case <-removedLogDone: case <-failTimer.C: t.Error("removed log filter failed to trigger (timeout)") } failTimer.Reset(dura) select { case <-pendingLogDone: case <-failTimer.C: t.Error("pending log filter failed to trigger (timeout)") } }