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  }