github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/cmd/configtxgen/main_test.go (about)

     1  /*
     2  Copyright hechain. 2017 All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package main
     8  
     9  import (
    10  	"flag"
    11  	"fmt"
    12  	"io/ioutil"
    13  	"os"
    14  	"path/filepath"
    15  	"testing"
    16  
    17  	"github.com/hechain20/hechain/bccsp/factory"
    18  	"github.com/hechain20/hechain/core/config/configtest"
    19  	"github.com/hechain20/hechain/internal/configtxgen/genesisconfig"
    20  	"github.com/stretchr/testify/require"
    21  )
    22  
    23  var tmpDir string
    24  
    25  func TestMain(m *testing.M) {
    26  	dir, err := ioutil.TempDir("", "configtxgen")
    27  	if err != nil {
    28  		panic("Error creating temp dir")
    29  	}
    30  	tmpDir = dir
    31  	testResult := m.Run()
    32  	os.RemoveAll(dir)
    33  
    34  	os.Exit(testResult)
    35  }
    36  
    37  func TestInspectMissing(t *testing.T) {
    38  	require.EqualError(t, doInspectBlock("NonSenseBlockFileThatDoesn'tActuallyExist"), "could not read block NonSenseBlockFileThatDoesn'tActuallyExist")
    39  }
    40  
    41  func TestInspectBlock(t *testing.T) {
    42  	blockDest := filepath.Join(tmpDir, "block")
    43  
    44  	config := genesisconfig.Load(genesisconfig.SampleInsecureSoloProfile, configtest.GetDevConfigDir())
    45  
    46  	require.NoError(t, doOutputBlock(config, "foo", blockDest), "Good block generation request")
    47  	require.NoError(t, doInspectBlock(blockDest), "Good block inspection request")
    48  }
    49  
    50  func TestInspectBlockErr(t *testing.T) {
    51  	config := genesisconfig.Load(genesisconfig.SampleInsecureSoloProfile, configtest.GetDevConfigDir())
    52  
    53  	require.EqualError(t, doOutputBlock(config, "foo", ""), "error writing genesis block: open : no such file or directory")
    54  	require.EqualError(t, doInspectBlock(""), "could not read block ")
    55  }
    56  
    57  func TestMissingOrdererSection(t *testing.T) {
    58  	blockDest := filepath.Join(tmpDir, "block")
    59  
    60  	config := genesisconfig.Load(genesisconfig.SampleInsecureSoloProfile, configtest.GetDevConfigDir())
    61  	config.Orderer = nil
    62  
    63  	require.EqualError(t, doOutputBlock(config, "foo", blockDest), "refusing to generate block which is missing orderer section")
    64  }
    65  
    66  func TestApplicationChannelGenesisBlock(t *testing.T) {
    67  	blockDest := filepath.Join(tmpDir, "block")
    68  
    69  	config := genesisconfig.Load(genesisconfig.SampleAppChannelInsecureSoloProfile, configtest.GetDevConfigDir())
    70  
    71  	require.NoError(t, doOutputBlock(config, "foo", blockDest))
    72  }
    73  
    74  func TestApplicationChannelMissingApplicationSection(t *testing.T) {
    75  	blockDest := filepath.Join(tmpDir, "block")
    76  
    77  	config := genesisconfig.Load(genesisconfig.SampleAppChannelInsecureSoloProfile, configtest.GetDevConfigDir())
    78  	config.Application = nil
    79  
    80  	require.EqualError(t, doOutputBlock(config, "foo", blockDest), "refusing to generate application channel block which is missing application section")
    81  }
    82  
    83  func TestMissingConsortiumValue(t *testing.T) {
    84  	configTxDest := filepath.Join(tmpDir, "configtx")
    85  
    86  	config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
    87  	config.Consortium = ""
    88  
    89  	require.EqualError(t, doOutputChannelCreateTx(config, nil, "foo", configTxDest), "config update generation failure: cannot define a new channel with no Consortium value")
    90  }
    91  
    92  func TestUnsuccessfulChannelTxFileCreation(t *testing.T) {
    93  	configTxDest := filepath.Join(tmpDir, "configtx")
    94  
    95  	config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
    96  	require.NoError(t, ioutil.WriteFile(configTxDest, []byte{}, 0o440))
    97  	defer os.Remove(configTxDest)
    98  
    99  	require.EqualError(t, doOutputChannelCreateTx(config, nil, "foo", configTxDest), fmt.Sprintf("error writing channel create tx: open %s: permission denied", configTxDest))
   100  }
   101  
   102  func TestMissingApplicationValue(t *testing.T) {
   103  	configTxDest := filepath.Join(tmpDir, "configtx")
   104  
   105  	config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
   106  	config.Application = nil
   107  
   108  	require.EqualError(t, doOutputChannelCreateTx(config, nil, "foo", configTxDest), "could not generate default config template: channel template configs must contain an application section")
   109  }
   110  
   111  func TestInspectMissingConfigTx(t *testing.T) {
   112  	require.EqualError(t, doInspectChannelCreateTx("ChannelCreateTxFileWhichDoesn'tReallyExist"), "could not read channel create tx: open ChannelCreateTxFileWhichDoesn'tReallyExist: no such file or directory")
   113  }
   114  
   115  func TestInspectConfigTx(t *testing.T) {
   116  	configTxDest := filepath.Join(tmpDir, "configtx")
   117  
   118  	config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
   119  
   120  	require.NoError(t, doOutputChannelCreateTx(config, nil, "foo", configTxDest), "Good outputChannelCreateTx generation request")
   121  	require.NoError(t, doInspectChannelCreateTx(configTxDest), "Good configtx inspection request")
   122  }
   123  
   124  func TestGenerateAnchorPeersUpdate(t *testing.T) {
   125  	configTxDest := filepath.Join(tmpDir, "anchorPeerUpdate")
   126  
   127  	config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
   128  
   129  	require.NoError(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, genesisconfig.SampleOrgName), "Good anchorPeerUpdate request")
   130  }
   131  
   132  func TestBadAnchorPeersUpdates(t *testing.T) {
   133  	configTxDest := filepath.Join(tmpDir, "anchorPeerUpdate")
   134  
   135  	config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
   136  
   137  	require.EqualError(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, ""), "must specify an organization to update the anchor peer for")
   138  
   139  	backupApplication := config.Application
   140  	config.Application = nil
   141  	require.EqualError(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, genesisconfig.SampleOrgName), "cannot update anchor peers without an application section")
   142  	config.Application = backupApplication
   143  
   144  	config.Application.Organizations[0] = &genesisconfig.Organization{Name: "FakeOrg", ID: "FakeOrg"}
   145  	require.EqualError(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, genesisconfig.SampleOrgName), "error parsing profile as channel group: could not create application group: failed to create application org: 1 - Error loading MSP configuration for org FakeOrg: unknown MSP type ''")
   146  }
   147  
   148  func TestConfigTxFlags(t *testing.T) {
   149  	configTxDest := filepath.Join(tmpDir, "configtx")
   150  	configTxDestAnchorPeers := filepath.Join(tmpDir, "configtxAnchorPeers")
   151  
   152  	oldArgs := os.Args
   153  	defer func() {
   154  		os.Args = oldArgs
   155  		flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
   156  	}()
   157  
   158  	cleanup := configtest.SetDevFabricConfigPath(t)
   159  	defer cleanup()
   160  	devConfigDir := configtest.GetDevConfigDir()
   161  
   162  	os.Args = []string{
   163  		"cmd",
   164  		"-channelID=testchannelid",
   165  		"-outputCreateChannelTx=" + configTxDest,
   166  		"-channelCreateTxBaseProfile=" + genesisconfig.SampleSingleMSPSoloProfile,
   167  		"-profile=" + genesisconfig.SampleSingleMSPChannelProfile,
   168  		"-configPath=" + devConfigDir,
   169  		"-inspectChannelCreateTx=" + configTxDest,
   170  		"-outputAnchorPeersUpdate=" + configTxDestAnchorPeers,
   171  		"-asOrg=" + genesisconfig.SampleOrgName,
   172  	}
   173  
   174  	main()
   175  
   176  	_, err := os.Stat(configTxDest)
   177  	require.NoError(t, err, "Configtx file is written successfully")
   178  	_, err = os.Stat(configTxDestAnchorPeers)
   179  	require.NoError(t, err, "Configtx anchor peers file is written successfully")
   180  }
   181  
   182  func TestBlockFlags(t *testing.T) {
   183  	blockDest := filepath.Join(tmpDir, "block")
   184  	oldArgs := os.Args
   185  	defer func() {
   186  		os.Args = oldArgs
   187  		flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
   188  	}()
   189  	os.Args = []string{
   190  		"cmd",
   191  		"-channelID=testchannelid",
   192  		"-profile=" + genesisconfig.SampleSingleMSPSoloProfile,
   193  		"-outputBlock=" + blockDest,
   194  		"-inspectBlock=" + blockDest,
   195  	}
   196  	cleanup := configtest.SetDevFabricConfigPath(t)
   197  	defer cleanup()
   198  
   199  	main()
   200  
   201  	_, err := os.Stat(blockDest)
   202  	require.NoError(t, err, "Block file is written successfully")
   203  }
   204  
   205  func TestPrintOrg(t *testing.T) {
   206  	factory.InitFactories(nil)
   207  	config := genesisconfig.LoadTopLevel(configtest.GetDevConfigDir())
   208  
   209  	require.NoError(t, doPrintOrg(config, genesisconfig.SampleOrgName), "Good org to print")
   210  
   211  	err := doPrintOrg(config, genesisconfig.SampleOrgName+".wrong")
   212  	require.Error(t, err, "Bad org name")
   213  	require.Regexp(t, "organization [^ ]* not found", err.Error())
   214  
   215  	config.Organizations[0] = &genesisconfig.Organization{Name: "FakeOrg", ID: "FakeOrg"}
   216  	err = doPrintOrg(config, "FakeOrg")
   217  	require.Error(t, err, "Fake org")
   218  	require.Regexp(t, "bad org definition", err.Error())
   219  }