github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/orderer/common/server/server_test.go (about) 1 /* 2 Copyright hechain. 2017 All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package server 8 9 import ( 10 "io/ioutil" 11 "os" 12 "path/filepath" 13 "testing" 14 "time" 15 16 "github.com/golang/protobuf/proto" 17 localconfig "github.com/hechain20/hechain/orderer/common/localconfig" 18 "github.com/hechain20/hechain/orderer/common/multichannel" 19 "github.com/hechain20/hechain/protoutil" 20 cb "github.com/hyperledger/fabric-protos-go/common" 21 ab "github.com/hyperledger/fabric-protos-go/orderer" 22 "github.com/stretchr/testify/require" 23 "google.golang.org/grpc" 24 ) 25 26 func TestBroadcastNoPanic(t *testing.T) { 27 // Defer recovers from the panic 28 _ = (&server{}).Broadcast(nil) 29 } 30 31 func TestDeliverNoPanic(t *testing.T) { 32 // Defer recovers from the panic 33 _ = (&server{}).Deliver(nil) 34 } 35 36 type recvr interface { 37 Recv() (*cb.Envelope, error) 38 } 39 40 type mockBroadcastSrv struct { 41 grpc.ServerStream 42 msg *cb.Envelope 43 err error 44 } 45 46 func (mbs *mockBroadcastSrv) Recv() (*cb.Envelope, error) { 47 return mbs.msg, mbs.err 48 } 49 50 func (mbs *mockBroadcastSrv) Send(br *ab.BroadcastResponse) error { 51 panic("Unimplemented") 52 } 53 54 type mockDeliverSrv struct { 55 grpc.ServerStream 56 msg *cb.Envelope 57 err error 58 } 59 60 func (mds *mockDeliverSrv) CreateStatusReply(status cb.Status) proto.Message { 61 return &ab.DeliverResponse{ 62 Type: &ab.DeliverResponse_Status{Status: status}, 63 } 64 } 65 66 func (mds *mockDeliverSrv) CreateBlockReply(block *cb.Block) proto.Message { 67 return &ab.DeliverResponse{ 68 Type: &ab.DeliverResponse_Block{Block: block}, 69 } 70 } 71 72 func (mds *mockDeliverSrv) Recv() (*cb.Envelope, error) { 73 return mds.msg, mds.err 74 } 75 76 func (mds *mockDeliverSrv) Send(br *ab.DeliverResponse) error { 77 panic("Unimplemented") 78 } 79 80 func testMsgTrace(handler func(dir string, msg *cb.Envelope) recvr, t *testing.T) { 81 dir, err := ioutil.TempDir("", "TestMsgTrace") 82 if err != nil { 83 t.Fatalf("Could not create temp dir") 84 } 85 defer os.RemoveAll(dir) 86 87 msg := &cb.Envelope{Payload: []byte("somedata")} 88 89 r := handler(dir, msg) 90 91 rMsg, err := r.Recv() 92 require.Equal(t, msg, rMsg) 93 require.Nil(t, err) 94 95 var fileData []byte 96 for i := 0; i < 100; i++ { 97 // Writing the trace file is deliberately non-blocking, wait up to a second, checking every 10 ms to see if the file now exists. 98 time.Sleep(10 * time.Millisecond) 99 filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { 100 require.Nil(t, err) 101 if path == dir { 102 return nil 103 } 104 require.Nil(t, fileData, "Should only be one file") 105 fileData, err = ioutil.ReadFile(path) 106 require.Nil(t, err) 107 return nil 108 }) 109 if fileData != nil { 110 break 111 } 112 } 113 114 require.Equal(t, protoutil.MarshalOrPanic(msg), fileData) 115 } 116 117 func TestBroadcastMsgTrace(t *testing.T) { 118 testMsgTrace(func(dir string, msg *cb.Envelope) recvr { 119 return &broadcastMsgTracer{ 120 AtomicBroadcast_BroadcastServer: &mockBroadcastSrv{ 121 msg: msg, 122 }, 123 msgTracer: msgTracer{ 124 debug: &localconfig.Debug{ 125 BroadcastTraceDir: dir, 126 }, 127 function: "Broadcast", 128 }, 129 } 130 }, t) 131 } 132 133 func TestDeliverMsgTrace(t *testing.T) { 134 testMsgTrace(func(dir string, msg *cb.Envelope) recvr { 135 return &deliverMsgTracer{ 136 Receiver: &mockDeliverSrv{ 137 msg: msg, 138 }, 139 msgTracer: msgTracer{ 140 debug: &localconfig.Debug{ 141 DeliverTraceDir: dir, 142 }, 143 function: "Deliver", 144 }, 145 } 146 }, t) 147 } 148 149 func TestDeliverNoChannel(t *testing.T) { 150 r := &multichannel.Registrar{} 151 ds := &deliverSupport{Registrar: r} 152 chain := ds.GetChain("mychannel") 153 require.Nil(t, chain) 154 require.True(t, chain == nil) 155 }