github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/deliverservice/deliveryclient_test.go (about) 1 /* 2 Copyright hechain. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package deliverservice 8 9 import ( 10 "fmt" 11 "testing" 12 "time" 13 14 "github.com/hechain20/hechain/core/deliverservice/fake" 15 "github.com/hechain20/hechain/internal/pkg/comm" 16 "github.com/hechain20/hechain/internal/pkg/peer/blocksprovider" 17 18 "github.com/stretchr/testify/require" 19 ) 20 21 //go:generate counterfeiter -o fake/ledger_info.go --fake-name LedgerInfo . ledgerInfo 22 type ledgerInfo interface { 23 blocksprovider.LedgerInfo 24 } 25 26 func TestStartDeliverForChannel(t *testing.T) { 27 fakeLedgerInfo := &fake.LedgerInfo{} 28 fakeLedgerInfo.LedgerHeightReturns(0, fmt.Errorf("fake-ledger-error")) 29 30 secOpts := comm.SecureOptions{ 31 UseTLS: true, 32 RequireClientCert: true, 33 // The below certificates were taken from the peer TLS 34 // dir as output by cryptogen. 35 // They are server.crt and server.key respectively. 36 Certificate: []byte(`-----BEGIN CERTIFICATE----- 37 MIIChTCCAiygAwIBAgIQOrr7/tDzKhhCba04E6QVWzAKBggqhkjOPQQDAjB2MQsw 38 CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy 39 YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz 40 Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0xOTA4MjcyMDA2MDBaFw0yOTA4MjQyMDA2 41 MDBaMFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH 42 Ew1TYW4gRnJhbmNpc2NvMR8wHQYDVQQDExZwZWVyMC5vcmcxLmV4YW1wbGUuY29t 43 MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExglppLxiAYSasrdFsrZJDxRULGBb 44 wHlArrap9SmAzGIeeIuqe9t3F23Q5Jry9lAnIh8h3UlkvZZpClXcjRiCeqOBtjCB 45 szAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC 46 MAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAgL35aqafj6SNnWdI4aMLh+oaFJvsA 47 aoHgYMkcPvvkiWcwRwYDVR0RBEAwPoIWcGVlcjAub3JnMS5leGFtcGxlLmNvbYIF 48 cGVlcjCCFnBlZXIwLm9yZzEuZXhhbXBsZS5jb22CBXBlZXIwMAoGCCqGSM49BAMC 49 A0cAMEQCIAiAGoYeKPMd3bqtixZji8q2zGzLmIzq83xdTJoZqm50AiAKleso2EVi 50 2TwsekWGpMaCOI6JV1+ZONyti6vBChhUYg== 51 -----END CERTIFICATE-----`), 52 Key: []byte(`-----BEGIN PRIVATE KEY----- 53 MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgxiyAFyD0Eg1NxjbS 54 U2EKDLoTQr3WPK8z7WyeOSzr+GGhRANCAATGCWmkvGIBhJqyt0WytkkPFFQsYFvA 55 eUCutqn1KYDMYh54i6p723cXbdDkmvL2UCciHyHdSWS9lmkKVdyNGIJ6 56 -----END PRIVATE KEY-----`, 57 ), 58 } 59 60 t.Run("Green Path With Mutual TLS", func(t *testing.T) { 61 ds := NewDeliverService(&Config{ 62 DeliverServiceConfig: &DeliverServiceConfig{ 63 SecOpts: secOpts, 64 }, 65 }).(*deliverServiceImpl) 66 67 finalized := make(chan struct{}) 68 err := ds.StartDeliverForChannel("channel-id", fakeLedgerInfo, func() { 69 close(finalized) 70 }) 71 require.NoError(t, err) 72 73 select { 74 case <-finalized: 75 case <-time.After(time.Second): 76 require.FailNow(t, "finalizer should have executed") 77 } 78 79 bp, ok := ds.blockProviders["channel-id"] 80 require.True(t, ok, "map entry must exist") 81 require.Equal(t, "76f7a03f8dfdb0ef7c4b28b3901fe163c730e906c70e4cdf887054ad5f608bed", fmt.Sprintf("%x", bp.TLSCertHash)) 82 }) 83 84 t.Run("Green Path without mutual TLS", func(t *testing.T) { 85 ds := NewDeliverService(&Config{ 86 DeliverServiceConfig: &DeliverServiceConfig{}, 87 }).(*deliverServiceImpl) 88 89 finalized := make(chan struct{}) 90 err := ds.StartDeliverForChannel("channel-id", fakeLedgerInfo, func() { 91 close(finalized) 92 }) 93 require.NoError(t, err) 94 95 select { 96 case <-finalized: 97 case <-time.After(time.Second): 98 require.FailNow(t, "finalizer should have executed") 99 } 100 101 bp, ok := ds.blockProviders["channel-id"] 102 require.True(t, ok, "map entry must exist") 103 require.Nil(t, bp.TLSCertHash) 104 }) 105 106 t.Run("Exists", func(t *testing.T) { 107 ds := NewDeliverService(&Config{ 108 DeliverServiceConfig: &DeliverServiceConfig{}, 109 }).(*deliverServiceImpl) 110 111 err := ds.StartDeliverForChannel("channel-id", fakeLedgerInfo, func() {}) 112 require.NoError(t, err) 113 114 err = ds.StartDeliverForChannel("channel-id", fakeLedgerInfo, func() {}) 115 require.EqualError(t, err, "Delivery service - block provider already exists for channel-id found, can't start delivery") 116 }) 117 118 t.Run("Stopping", func(t *testing.T) { 119 ds := NewDeliverService(&Config{ 120 DeliverServiceConfig: &DeliverServiceConfig{}, 121 }).(*deliverServiceImpl) 122 123 ds.Stop() 124 125 err := ds.StartDeliverForChannel("channel-id", fakeLedgerInfo, func() {}) 126 require.EqualError(t, err, "Delivery service is stopping cannot join a new channel channel-id") 127 }) 128 } 129 130 func TestStopDeliverForChannel(t *testing.T) { 131 t.Run("Green path", func(t *testing.T) { 132 ds := NewDeliverService(&Config{}).(*deliverServiceImpl) 133 doneA := make(chan struct{}) 134 ds.blockProviders = map[string]*blocksprovider.Deliverer{ 135 "a": { 136 DoneC: doneA, 137 }, 138 "b": { 139 DoneC: make(chan struct{}), 140 }, 141 } 142 err := ds.StopDeliverForChannel("a") 143 require.NoError(t, err) 144 require.Len(t, ds.blockProviders, 1) 145 _, ok := ds.blockProviders["a"] 146 require.False(t, ok) 147 select { 148 case <-doneA: 149 default: 150 require.Fail(t, "should have stopped the blocksprovider") 151 } 152 }) 153 154 t.Run("Already stopping", func(t *testing.T) { 155 ds := NewDeliverService(&Config{}).(*deliverServiceImpl) 156 ds.blockProviders = map[string]*blocksprovider.Deliverer{ 157 "a": { 158 DoneC: make(chan struct{}), 159 }, 160 "b": { 161 DoneC: make(chan struct{}), 162 }, 163 } 164 165 ds.Stop() 166 err := ds.StopDeliverForChannel("a") 167 require.EqualError(t, err, "Delivery service is stopping, cannot stop delivery for channel a") 168 }) 169 170 t.Run("Non-existent", func(t *testing.T) { 171 ds := NewDeliverService(&Config{}).(*deliverServiceImpl) 172 ds.blockProviders = map[string]*blocksprovider.Deliverer{ 173 "a": { 174 DoneC: make(chan struct{}), 175 }, 176 "b": { 177 DoneC: make(chan struct{}), 178 }, 179 } 180 181 err := ds.StopDeliverForChannel("c") 182 require.EqualError(t, err, "Delivery service - no block provider for c found, can't stop delivery") 183 }) 184 } 185 186 func TestStop(t *testing.T) { 187 ds := NewDeliverService(&Config{}).(*deliverServiceImpl) 188 ds.blockProviders = map[string]*blocksprovider.Deliverer{ 189 "a": { 190 DoneC: make(chan struct{}), 191 }, 192 "b": { 193 DoneC: make(chan struct{}), 194 }, 195 } 196 require.False(t, ds.stopping) 197 for _, bp := range ds.blockProviders { 198 select { 199 case <-bp.DoneC: 200 require.Fail(t, "block providers should not be closed") 201 default: 202 } 203 } 204 205 ds.Stop() 206 require.True(t, ds.stopping) 207 require.Len(t, ds.blockProviders, 2) 208 for _, bp := range ds.blockProviders { 209 select { 210 case <-bp.DoneC: 211 default: 212 require.Fail(t, "block providers should te closed") 213 } 214 } 215 }