github.com/osdi23p228/fabric@v0.0.0-20221218062954-77808885f5db/cmd/configtxgen/main_test.go (about)

     1  /*
     2  Copyright IBM Corp. 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/osdi23p228/fabric/bccsp/factory"
    18  	"github.com/osdi23p228/fabric/core/config/configtest"
    19  	"github.com/osdi23p228/fabric/internal/configtxgen/genesisconfig"
    20  	"github.com/stretchr/testify/assert"
    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  	assert.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  	assert.NoError(t, doOutputBlock(config, "foo", blockDest), "Good block generation request")
    47  	assert.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  	assert.EqualError(t, doOutputBlock(config, "foo", ""), "error writing genesis block: open : no such file or directory")
    54  	assert.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  	assert.EqualError(t, doOutputBlock(config, "foo", blockDest), "refusing to generate block which is missing orderer section")
    64  }
    65  
    66  func TestMissingConsortiumSection(t *testing.T) {
    67  	blockDest := filepath.Join(tmpDir, "block")
    68  
    69  	config := genesisconfig.Load(genesisconfig.SampleInsecureSoloProfile, configtest.GetDevConfigDir())
    70  	config.Consortiums = nil
    71  
    72  	assert.NoError(t, doOutputBlock(config, "foo", blockDest), "Missing consortiums section")
    73  }
    74  
    75  func TestMissingConsortiumValue(t *testing.T) {
    76  	configTxDest := filepath.Join(tmpDir, "configtx")
    77  
    78  	config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
    79  	config.Consortium = ""
    80  
    81  	assert.EqualError(t, doOutputChannelCreateTx(config, nil, "foo", configTxDest), "config update generation failure: cannot define a new channel with no Consortium value")
    82  }
    83  
    84  func TestUnsuccessfulChannelTxFileCreation(t *testing.T) {
    85  	configTxDest := filepath.Join(tmpDir, "configtx")
    86  
    87  	config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
    88  	assert.NoError(t, ioutil.WriteFile(configTxDest, []byte{}, 0440))
    89  	defer os.Remove(configTxDest)
    90  
    91  	assert.EqualError(t, doOutputChannelCreateTx(config, nil, "foo", configTxDest), fmt.Sprintf("error writing channel create tx: open %s: permission denied", configTxDest))
    92  }
    93  
    94  func TestMissingApplicationValue(t *testing.T) {
    95  	configTxDest := filepath.Join(tmpDir, "configtx")
    96  
    97  	config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
    98  	config.Application = nil
    99  
   100  	assert.EqualError(t, doOutputChannelCreateTx(config, nil, "foo", configTxDest), "could not generate default config template: channel template configs must contain an application section")
   101  }
   102  
   103  func TestInspectMissingConfigTx(t *testing.T) {
   104  	assert.EqualError(t, doInspectChannelCreateTx("ChannelCreateTxFileWhichDoesn'tReallyExist"), "could not read channel create tx: open ChannelCreateTxFileWhichDoesn'tReallyExist: no such file or directory")
   105  }
   106  
   107  func TestInspectConfigTx(t *testing.T) {
   108  	configTxDest := filepath.Join(tmpDir, "configtx")
   109  
   110  	config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
   111  
   112  	assert.NoError(t, doOutputChannelCreateTx(config, nil, "foo", configTxDest), "Good outputChannelCreateTx generation request")
   113  	assert.NoError(t, doInspectChannelCreateTx(configTxDest), "Good configtx inspection request")
   114  }
   115  
   116  func TestGenerateAnchorPeersUpdate(t *testing.T) {
   117  	configTxDest := filepath.Join(tmpDir, "anchorPeerUpdate")
   118  
   119  	config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
   120  
   121  	assert.NoError(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, genesisconfig.SampleOrgName), "Good anchorPeerUpdate request")
   122  }
   123  
   124  func TestBadAnchorPeersUpdates(t *testing.T) {
   125  	configTxDest := filepath.Join(tmpDir, "anchorPeerUpdate")
   126  
   127  	config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
   128  
   129  	assert.EqualError(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, ""), "must specify an organization to update the anchor peer for")
   130  
   131  	backupApplication := config.Application
   132  	config.Application = nil
   133  	assert.EqualError(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, genesisconfig.SampleOrgName), "cannot update anchor peers without an application section")
   134  	config.Application = backupApplication
   135  
   136  	config.Application.Organizations[0] = &genesisconfig.Organization{Name: "FakeOrg", ID: "FakeOrg"}
   137  	assert.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 ''")
   138  }
   139  
   140  func TestConfigTxFlags(t *testing.T) {
   141  	configTxDest := filepath.Join(tmpDir, "configtx")
   142  	configTxDestAnchorPeers := filepath.Join(tmpDir, "configtxAnchorPeers")
   143  
   144  	oldArgs := os.Args
   145  	defer func() {
   146  		os.Args = oldArgs
   147  		flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
   148  	}()
   149  
   150  	cleanup := configtest.SetDevFabricConfigPath(t)
   151  	defer cleanup()
   152  	devConfigDir := configtest.GetDevConfigDir()
   153  
   154  	os.Args = []string{
   155  		"cmd",
   156  		"-channelID=testchannelid",
   157  		"-outputCreateChannelTx=" + configTxDest,
   158  		"-channelCreateTxBaseProfile=" + genesisconfig.SampleSingleMSPSoloProfile,
   159  		"-profile=" + genesisconfig.SampleSingleMSPChannelProfile,
   160  		"-configPath=" + devConfigDir,
   161  		"-inspectChannelCreateTx=" + configTxDest,
   162  		"-outputAnchorPeersUpdate=" + configTxDestAnchorPeers,
   163  		"-asOrg=" + genesisconfig.SampleOrgName,
   164  	}
   165  
   166  	main()
   167  
   168  	_, err := os.Stat(configTxDest)
   169  	assert.NoError(t, err, "Configtx file is written successfully")
   170  	_, err = os.Stat(configTxDestAnchorPeers)
   171  	assert.NoError(t, err, "Configtx anchor peers file is written successfully")
   172  }
   173  
   174  func TestBlockFlags(t *testing.T) {
   175  	blockDest := filepath.Join(tmpDir, "block")
   176  	oldArgs := os.Args
   177  	defer func() {
   178  		os.Args = oldArgs
   179  		flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
   180  	}()
   181  	os.Args = []string{
   182  		"cmd",
   183  		"-channelID=testchannelid",
   184  		"-profile=" + genesisconfig.SampleSingleMSPSoloProfile,
   185  		"-outputBlock=" + blockDest,
   186  		"-inspectBlock=" + blockDest,
   187  	}
   188  	cleanup := configtest.SetDevFabricConfigPath(t)
   189  	defer cleanup()
   190  
   191  	main()
   192  
   193  	_, err := os.Stat(blockDest)
   194  	assert.NoError(t, err, "Block file is written successfully")
   195  }
   196  
   197  func TestPrintOrg(t *testing.T) {
   198  	factory.InitFactories(nil)
   199  	config := genesisconfig.LoadTopLevel(configtest.GetDevConfigDir())
   200  
   201  	assert.NoError(t, doPrintOrg(config, genesisconfig.SampleOrgName), "Good org to print")
   202  
   203  	err := doPrintOrg(config, genesisconfig.SampleOrgName+".wrong")
   204  	assert.Error(t, err, "Bad org name")
   205  	assert.Regexp(t, "organization [^ ]* not found", err.Error())
   206  
   207  	config.Organizations[0] = &genesisconfig.Organization{Name: "FakeOrg", ID: "FakeOrg"}
   208  	err = doPrintOrg(config, "FakeOrg")
   209  	assert.Error(t, err, "Fake org")
   210  	assert.Regexp(t, "bad org definition", err.Error())
   211  }