github.com/darrenli6/fabric-sdk-example@v0.0.0-20220109053535-94b13b56df8c/events/consumer/consumer_test.go (about)

     1  /*
     2  Copyright Hitachi America, Ltd. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package consumer
     8  
     9  import (
    10  	"fmt"
    11  	"net"
    12  	"os"
    13  	"sync"
    14  	"testing"
    15  	"time"
    16  
    17  	coreutil "github.com/hyperledger/fabric/core/testutil"
    18  	"github.com/hyperledger/fabric/events/producer"
    19  	"github.com/hyperledger/fabric/msp/mgmt/testtools"
    20  	ehpb "github.com/hyperledger/fabric/protos/peer"
    21  	"github.com/spf13/viper"
    22  	"github.com/stretchr/testify/assert"
    23  	"google.golang.org/grpc"
    24  )
    25  
    26  type MockAdapter struct {
    27  	sync.RWMutex
    28  	notify chan struct{}
    29  }
    30  
    31  type ZeroAdapter struct {
    32  	sync.RWMutex
    33  	notify chan struct{}
    34  }
    35  
    36  type BadAdapter struct {
    37  	sync.RWMutex
    38  	notify chan struct{}
    39  }
    40  
    41  var peerAddress = "0.0.0.0:7303"
    42  var ies = []*ehpb.Interest{{EventType: ehpb.EventType_CHAINCODE, RegInfo: &ehpb.Interest_ChaincodeRegInfo{ChaincodeRegInfo: &ehpb.ChaincodeReg{ChaincodeId: "0xffffffff", EventName: "event1"}}}}
    43  
    44  var adapter *MockAdapter
    45  var obcEHClient *EventsClient
    46  
    47  func (a *ZeroAdapter) GetInterestedEvents() ([]*ehpb.Interest, error) {
    48  	return []*ehpb.Interest{}, nil
    49  }
    50  func (a *ZeroAdapter) Recv(msg *ehpb.Event) (bool, error) {
    51  	panic("not implemented")
    52  }
    53  func (a *ZeroAdapter) Disconnected(err error) {
    54  	panic("not implemented")
    55  }
    56  
    57  func (a *BadAdapter) GetInterestedEvents() ([]*ehpb.Interest, error) {
    58  	return []*ehpb.Interest{}, fmt.Errorf("Error")
    59  }
    60  func (a *BadAdapter) Recv(msg *ehpb.Event) (bool, error) {
    61  	panic("not implemented")
    62  }
    63  func (a *BadAdapter) Disconnected(err error) {
    64  	panic("not implemented")
    65  }
    66  
    67  func (a *MockAdapter) GetInterestedEvents() ([]*ehpb.Interest, error) {
    68  	return []*ehpb.Interest{
    69  		&ehpb.Interest{EventType: ehpb.EventType_BLOCK},
    70  	}, nil
    71  }
    72  
    73  func (a *MockAdapter) Recv(msg *ehpb.Event) (bool, error) {
    74  	return true, nil
    75  }
    76  
    77  func (a *MockAdapter) Disconnected(err error) {}
    78  
    79  func TestNewEventsClient(t *testing.T) {
    80  	var cases = []struct {
    81  		name     string
    82  		time     int
    83  		expected bool
    84  	}{
    85  		{
    86  			name:     "success",
    87  			time:     5,
    88  			expected: true,
    89  		},
    90  		{
    91  			name:     "fail. regTimout < 100ms",
    92  			time:     0,
    93  			expected: false,
    94  		},
    95  		{
    96  			name:     "fail. regTimeout > 60s",
    97  			time:     61,
    98  			expected: false,
    99  		},
   100  	}
   101  
   102  	for _, test := range cases {
   103  		t.Run(test.name, func(t *testing.T) {
   104  			t.Logf("Running test: %s", test.name)
   105  			var regTimeout = time.Duration(test.time) * time.Second
   106  			done := make(chan struct{})
   107  			adapter = &MockAdapter{notify: done}
   108  
   109  			_, err := NewEventsClient(peerAddress, regTimeout, adapter)
   110  			if test.expected {
   111  				assert.NoError(t, err)
   112  			} else {
   113  				assert.Error(t, err)
   114  			}
   115  		})
   116  	}
   117  }
   118  
   119  func TestNewEventsClientConnectionWithAddress(t *testing.T) {
   120  	var cases = []struct {
   121  		name     string
   122  		address  string
   123  		expected bool
   124  	}{
   125  		{
   126  			name:     "success",
   127  			address:  peerAddress,
   128  			expected: true,
   129  		},
   130  		{
   131  			name:     "fail",
   132  			address:  "",
   133  			expected: false,
   134  		},
   135  	}
   136  
   137  	for _, test := range cases {
   138  		t.Run(test.name, func(t *testing.T) {
   139  			t.Logf("Running test: %s", test.name)
   140  			_, err := newEventsClientConnectionWithAddress(test.address)
   141  			if test.expected {
   142  				assert.NoError(t, err)
   143  			} else {
   144  				assert.Error(t, err)
   145  			}
   146  		})
   147  	}
   148  }
   149  
   150  func TestUnregisterAsync(t *testing.T) {
   151  	var err error
   152  	done := make(chan struct{})
   153  	adapter := &MockAdapter{notify: done}
   154  
   155  	obcEHClient, _ = NewEventsClient(peerAddress, 5, adapter)
   156  
   157  	if err = obcEHClient.Start(); err != nil {
   158  		obcEHClient.Stop()
   159  		t.Fail()
   160  	}
   161  
   162  	obcEHClient.RegisterAsync(ies)
   163  	err = obcEHClient.UnregisterAsync(ies)
   164  	assert.NoError(t, err)
   165  
   166  	obcEHClient.Stop()
   167  
   168  }
   169  
   170  func TestStart(t *testing.T) {
   171  	var err error
   172  	var regTimeout = 5 * time.Second
   173  	done := make(chan struct{})
   174  
   175  	var cases = []struct {
   176  		name     string
   177  		address  string
   178  		adapter  EventAdapter
   179  		expected bool
   180  	}{
   181  		{
   182  			name:     "success",
   183  			address:  peerAddress,
   184  			adapter:  &MockAdapter{notify: done},
   185  			expected: true,
   186  		},
   187  		{
   188  			name:     "fail no peerAddress",
   189  			address:  "",
   190  			adapter:  &MockAdapter{notify: done},
   191  			expected: false,
   192  		},
   193  		{
   194  			name:     "fail bad adapter",
   195  			address:  peerAddress,
   196  			adapter:  &BadAdapter{notify: done},
   197  			expected: false,
   198  		},
   199  		{
   200  			name:     "fail zero adapter",
   201  			address:  peerAddress,
   202  			adapter:  &ZeroAdapter{notify: done},
   203  			expected: false,
   204  		},
   205  	}
   206  
   207  	for _, test := range cases {
   208  		t.Run(test.name, func(t *testing.T) {
   209  			t.Logf("Running test: %s", test.name)
   210  			obcEHClient, _ = NewEventsClient(test.address, regTimeout, test.adapter)
   211  			err = obcEHClient.Start()
   212  			if test.expected {
   213  				assert.NoError(t, err)
   214  			} else {
   215  				assert.Error(t, err)
   216  			}
   217  			obcEHClient.Stop()
   218  		})
   219  	}
   220  }
   221  
   222  func TestStop(t *testing.T) {
   223  	var err error
   224  	var regTimeout = 5 * time.Second
   225  	done := make(chan struct{})
   226  	adapter := &MockAdapter{notify: done}
   227  
   228  	obcEHClient, _ = NewEventsClient(peerAddress, regTimeout, adapter)
   229  
   230  	if err = obcEHClient.Start(); err != nil {
   231  		t.Fail()
   232  		t.Logf("Error client start %s", err)
   233  	}
   234  	err = obcEHClient.Stop()
   235  	assert.NoError(t, err)
   236  
   237  }
   238  
   239  func TestMain(m *testing.M) {
   240  	err := msptesttools.LoadMSPSetupForTesting()
   241  	if err != nil {
   242  		fmt.Printf("Could not initialize msp, err %s", err)
   243  		os.Exit(-1)
   244  		return
   245  	}
   246  
   247  	coreutil.SetupTestConfig()
   248  	var opts []grpc.ServerOption
   249  	grpcServer := grpc.NewServer(opts...)
   250  
   251  	lis, err := net.Listen("tcp", peerAddress)
   252  	if err != nil {
   253  		fmt.Printf("Error starting events listener %s....not doing tests", err)
   254  		return
   255  	}
   256  
   257  	ehServer := producer.NewEventsServer(
   258  		uint(viper.GetInt("peer.events.buffersize")),
   259  		viper.GetDuration("peer.events.timeout"))
   260  	ehpb.RegisterEventsServer(grpcServer, ehServer)
   261  
   262  	go grpcServer.Serve(lis)
   263  
   264  	time.Sleep(2 * time.Second)
   265  	os.Exit(m.Run())
   266  }