github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/network/internal/testutils/meshengine.go (about) 1 package testutils 2 3 import ( 4 "fmt" 5 "sync" 6 "testing" 7 8 "github.com/stretchr/testify/require" 9 10 "github.com/onflow/flow-go/model/flow" 11 mockcomponent "github.com/onflow/flow-go/module/component/mock" 12 "github.com/onflow/flow-go/network" 13 "github.com/onflow/flow-go/network/channels" 14 ) 15 16 // MeshEngine is a simple engine that is used for testing the correctness of 17 // driving the engines with libp2p, it simply receives and stores the incoming messages 18 type MeshEngine struct { 19 sync.Mutex 20 t *testing.T 21 Con network.Conduit // used to directly communicate with the network 22 originID flow.Identifier // used to keep track of the id of the sender of the messages 23 Event chan interface{} // used to keep track of the events that the node receives 24 Channel chan channels.Channel // used to keep track of the channels that events are Received on 25 Received chan struct{} // used as an indicator on reception of messages for testing 26 mockcomponent.Component 27 } 28 29 func NewMeshEngine(t *testing.T, net network.EngineRegistry, cap int, channel channels.Channel) *MeshEngine { 30 te := &MeshEngine{ 31 t: t, 32 Event: make(chan interface{}, cap), 33 Channel: make(chan channels.Channel, cap), 34 Received: make(chan struct{}, cap), 35 } 36 37 c2, err := net.Register(channel, te) 38 require.NoError(te.t, err) 39 te.Con = c2 40 41 return te 42 } 43 44 // SubmitLocal is implemented for a valid type assertion to Engine 45 // any call to it fails the test 46 func (e *MeshEngine) SubmitLocal(event interface{}) { 47 require.Fail(e.t, "not implemented") 48 } 49 50 // Submit is implemented for a valid type assertion to Engine 51 // any call to it fails the test 52 func (e *MeshEngine) Submit(channel channels.Channel, originID flow.Identifier, event interface{}) { 53 go func() { 54 err := e.Process(channel, originID, event) 55 if err != nil { 56 require.Fail(e.t, "could not process submitted Event") 57 } 58 }() 59 } 60 61 // ProcessLocal is implemented for a valid type assertion to Engine 62 // any call to it fails the test 63 func (e *MeshEngine) ProcessLocal(event interface{}) error { 64 require.Fail(e.t, "not implemented") 65 return fmt.Errorf(" unexpected method called") 66 } 67 68 // Process receives an originID and an Event and casts them into the corresponding fields of the 69 // MeshEngine. It then flags the Received Channel on reception of an Event. 70 func (e *MeshEngine) Process(channel channels.Channel, originID flow.Identifier, event interface{}) error { 71 e.Lock() 72 defer e.Unlock() 73 74 // stores the message locally 75 e.originID = originID 76 e.Channel <- channel 77 e.Event <- event 78 e.Received <- struct{}{} 79 return nil 80 }