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  }