go_study/fabric-main/core/scc/inprocstream_test.go

60 lines
1.3 KiB
Go

/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package scc
import (
"testing"
pb "github.com/hyperledger/fabric-protos-go/peer"
"github.com/stretchr/testify/require"
)
func TestSend(t *testing.T) {
ch := make(chan *pb.ChaincodeMessage)
stream := newInProcStream(ch, ch)
// good send (non-blocking send and receive)
msg := &pb.ChaincodeMessage{}
go stream.Send(msg)
msg2, _ := stream.Recv()
require.Equal(t, msg, msg2, "send != recv")
// close the channel
close(ch)
// bad send, should panic, unblock and return error
err := stream.Send(msg)
require.NotNil(t, err, "should have errored on panic")
}
func TestRecvChannelClosedError(t *testing.T) {
ch := make(chan *pb.ChaincodeMessage)
stream := newInProcStream(ch, ch)
// Close the channel
close(ch)
// Trying to call a closed receive channel should return an error
_, err := stream.Recv()
require.Error(t, err, "Should return an error")
require.Contains(t, err.Error(), "channel is closed")
}
func TestCloseSend(t *testing.T) {
send := make(chan *pb.ChaincodeMessage)
recv := make(chan *pb.ChaincodeMessage)
stream := newInProcStream(recv, send)
stream.CloseSend()
_, ok := <-send
require.False(t, ok, "send channel should be closed")
require.NotPanics(t, func() { stream.CloseSend() }, "CloseSend should be idempotent")
}