github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/internal/peer/common/ordererclient_test.go (about)

     1  /*
     2  Copyright hechain. 2016-2017 All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  package common_test
     7  
     8  import (
     9  	"io/ioutil"
    10  	"net"
    11  	"os"
    12  	"path"
    13  	"path/filepath"
    14  	"testing"
    15  	"time"
    16  
    17  	"github.com/hechain20/hechain/common/crypto/tlsgen"
    18  	"github.com/hechain20/hechain/internal/peer/common"
    19  	"github.com/hechain20/hechain/internal/pkg/comm"
    20  	"github.com/spf13/viper"
    21  	"github.com/stretchr/testify/require"
    22  )
    23  
    24  func initOrdererTestEnv(t *testing.T) (cleanup func()) {
    25  	t.Helper()
    26  	cfgPath, err := ioutil.TempDir("", "ordererTestEnv")
    27  	require.NoError(t, err)
    28  	certsDir := filepath.Join(cfgPath, "certs")
    29  	err = os.Mkdir(certsDir, 0o755)
    30  	require.NoError(t, err)
    31  
    32  	configFile, err := os.Create(filepath.Join(cfgPath, "test.yaml"))
    33  	require.NoError(t, err)
    34  	defer configFile.Close()
    35  
    36  	configStr := `
    37  peer:
    38    tls:
    39      rootcert:
    40        file: "certs/ca.crt"
    41      clientKey:
    42        file: "certs/client.key"
    43      clientCert:
    44        file: "certs/client.crt"
    45    client:
    46      connTimeout: 1s
    47  
    48  orderer:
    49    tls:
    50      rootcert:
    51        file: "certs/ca.crt"
    52      clientKey:
    53        file: "certs/client.key"
    54      clientCert:
    55        file: "certs/client.crt"
    56    client:
    57      connTimeout: 1s
    58  `
    59  	_, err = configFile.WriteString(configStr)
    60  	require.NoError(t, err)
    61  
    62  	os.Setenv("FABRIC_CFG_PATH", cfgPath)
    63  	viper.Reset()
    64  	_ = common.InitConfig("test")
    65  	ca, err := tlsgen.NewCA()
    66  	require.NoError(t, err)
    67  
    68  	caCrtFile := path.Join(certsDir, "ca.crt")
    69  	err = ioutil.WriteFile(caCrtFile, ca.CertBytes(), 0o644)
    70  	require.NoError(t, err)
    71  
    72  	kp, err := ca.NewClientCertKeyPair()
    73  	require.NoError(t, err)
    74  
    75  	key := path.Join(certsDir, "client.key")
    76  	err = ioutil.WriteFile(key, kp.Key, 0o644)
    77  	require.NoError(t, err)
    78  
    79  	crt := path.Join(certsDir, "client.crt")
    80  	err = ioutil.WriteFile(crt, kp.Cert, 0o644)
    81  	require.NoError(t, err)
    82  
    83  	ekey := path.Join(certsDir, "empty.key")
    84  	err = ioutil.WriteFile(ekey, []byte{}, 0o644)
    85  	require.NoError(t, err)
    86  
    87  	ecrt := path.Join(certsDir, "empty.crt")
    88  	err = ioutil.WriteFile(ecrt, []byte{}, 0o644)
    89  	require.NoError(t, err)
    90  
    91  	configFile, err = os.Create(filepath.Join(certsDir, "bad.key"))
    92  	require.NoError(t, err)
    93  	defer configFile.Close()
    94  
    95  	_, err = configFile.WriteString(`
    96  -----BEGIN PRIVATE KEY-----
    97  MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgg6BAaCpwlmg/hEP4
    98  QjUeWEu3crkxMvjq4vYh3LaDREuhRANCAAR+FujNKcGQW/CEpMU6Yp45ye2cbOwJ
    99  -----END PRIVATE KEY-----
   100  	`)
   101  	require.NoError(t, err)
   102  
   103  	return func() {
   104  		err := os.Unsetenv("FABRIC_CFG_PATH")
   105  		require.NoError(t, err)
   106  		defer os.RemoveAll(cfgPath)
   107  		viper.Reset()
   108  	}
   109  }
   110  
   111  func TestNewOrdererClientFromEnv(t *testing.T) {
   112  	cleanup := initOrdererTestEnv(t)
   113  	defer cleanup()
   114  
   115  	oClient, err := common.NewOrdererClientFromEnv()
   116  	require.NoError(t, err)
   117  	require.NotNil(t, oClient)
   118  
   119  	viper.Set("orderer.tls.enabled", true)
   120  	oClient, err = common.NewOrdererClientFromEnv()
   121  	require.NoError(t, err)
   122  	require.NotNil(t, oClient)
   123  
   124  	viper.Set("orderer.tls.enabled", true)
   125  	viper.Set("orderer.tls.clientAuthRequired", true)
   126  	oClient, err = common.NewOrdererClientFromEnv()
   127  	require.NoError(t, err)
   128  	require.NotNil(t, oClient)
   129  
   130  	// bad key file
   131  	badKeyFile := filepath.Join("certs", "bad.key")
   132  	viper.Set("orderer.tls.clientKey.file", badKeyFile)
   133  	oClient, err = common.NewOrdererClientFromEnv()
   134  	require.NoError(t, err)
   135  	_, err = oClient.Dial("127.0.0.1:0")
   136  	require.ErrorContains(t, err, "failed to load client certificate:")
   137  	require.ErrorContains(t, err, "tls: failed to parse private key")
   138  
   139  	// bad cert file path
   140  	viper.Set("orderer.tls.clientCert.file", "./nocert.crt")
   141  	oClient, err = common.NewOrdererClientFromEnv()
   142  	require.ErrorContains(t, err, "unable to load orderer.tls.clientCert.file")
   143  	require.ErrorContains(t, err, "failed to load config for OrdererClient")
   144  	require.Nil(t, oClient)
   145  
   146  	// bad key file path
   147  	viper.Set("orderer.tls.clientKey.file", "./nokey.key")
   148  	oClient, err = common.NewOrdererClientFromEnv()
   149  	require.ErrorContains(t, err, "unable to load orderer.tls.clientKey.file")
   150  	require.Nil(t, oClient)
   151  
   152  	// bad ca path
   153  	viper.Set("orderer.tls.rootcert.file", "noroot.crt")
   154  	oClient, err = common.NewOrdererClientFromEnv()
   155  	require.ErrorContains(t, err, "unable to load orderer.tls.rootcert.file")
   156  	require.Nil(t, oClient)
   157  }
   158  
   159  func TestOrdererClient(t *testing.T) {
   160  	cleanup := initOrdererTestEnv(t)
   161  	defer cleanup()
   162  
   163  	lis, err := net.Listen("tcp", "localhost:0")
   164  	if err != nil {
   165  		t.Fatalf("error creating listener for test: %v", err)
   166  	}
   167  	defer lis.Close()
   168  	srv, err := comm.NewGRPCServerFromListener(lis, comm.ServerConfig{})
   169  	if err != nil {
   170  		t.Fatalf("error creating gRPC server for test: %v", err)
   171  	}
   172  	go srv.Start()
   173  	defer srv.Stop()
   174  	viper.Set("orderer.address", lis.Addr().String())
   175  	oClient, err := common.NewOrdererClientFromEnv()
   176  	if err != nil {
   177  		t.Fatalf("failed to create OrdererClient for test: %v", err)
   178  	}
   179  	bc, err := oClient.Broadcast()
   180  	require.NoError(t, err)
   181  	require.NotNil(t, bc)
   182  	dc, err := oClient.Deliver()
   183  	require.NoError(t, err)
   184  	require.NotNil(t, dc)
   185  }
   186  
   187  func TestOrdererClientTimeout(t *testing.T) {
   188  	t.Run("OrdererClient.Broadcast() timeout", func(t *testing.T) {
   189  		cleanup := initOrdererTestEnv(t)
   190  		viper.Set("orderer.client.connTimeout", 10*time.Millisecond)
   191  		defer cleanup()
   192  		oClient, err := common.NewOrdererClientFromEnv()
   193  		if err != nil {
   194  			t.Fatalf("failed to create OrdererClient for test: %v", err)
   195  		}
   196  		_, err = oClient.Broadcast()
   197  		require.Contains(t, err.Error(), "orderer client failed to connect")
   198  	})
   199  	t.Run("OrdererClient.Deliver() timeout", func(t *testing.T) {
   200  		cleanup := initOrdererTestEnv(t)
   201  		viper.Set("orderer.client.connTimeout", 10*time.Millisecond)
   202  		defer cleanup()
   203  		oClient, err := common.NewOrdererClientFromEnv()
   204  		if err != nil {
   205  			t.Fatalf("failed to create OrdererClient for test: %v", err)
   206  		}
   207  		_, err = oClient.Deliver()
   208  		require.Contains(t, err.Error(), "orderer client failed to connect")
   209  	})
   210  }