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 }