github.com/kaituanwang/hyperledger@v2.0.1+incompatible/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  	"io/ioutil"
    12  	"os"
    13  	"path/filepath"
    14  	"testing"
    15  
    16  	"github.com/hyperledger/fabric/bccsp/factory"
    17  	"github.com/hyperledger/fabric/core/config/configtest"
    18  	"github.com/hyperledger/fabric/internal/configtxgen/genesisconfig"
    19  	"github.com/stretchr/testify/assert"
    20  )
    21  
    22  var tmpDir string
    23  
    24  func TestMain(m *testing.M) {
    25  	dir, err := ioutil.TempDir("", "configtxgen")
    26  	if err != nil {
    27  		panic("Error creating temp dir")
    28  	}
    29  	tmpDir = dir
    30  	testResult := m.Run()
    31  	os.RemoveAll(dir)
    32  
    33  	os.Exit(testResult)
    34  }
    35  
    36  func TestInspectMissing(t *testing.T) {
    37  	assert.Error(t, doInspectBlock("NonSenseBlockFileThatDoesn'tActuallyExist"), "Missing block")
    38  }
    39  
    40  func TestInspectBlock(t *testing.T) {
    41  	blockDest := filepath.Join(tmpDir, "block")
    42  
    43  	config := genesisconfig.Load(genesisconfig.SampleInsecureSoloProfile, configtest.GetDevConfigDir())
    44  
    45  	assert.NoError(t, doOutputBlock(config, "foo", blockDest), "Good block generation request")
    46  	assert.NoError(t, doInspectBlock(blockDest), "Good block inspection request")
    47  }
    48  
    49  func TestMissingOrdererSection(t *testing.T) {
    50  	blockDest := filepath.Join(tmpDir, "block")
    51  
    52  	config := genesisconfig.Load(genesisconfig.SampleInsecureSoloProfile, configtest.GetDevConfigDir())
    53  	config.Orderer = nil
    54  
    55  	assert.Error(t, doOutputBlock(config, "foo", blockDest), "Missing orderer section")
    56  }
    57  
    58  func TestMissingConsortiumSection(t *testing.T) {
    59  	blockDest := filepath.Join(tmpDir, "block")
    60  
    61  	config := genesisconfig.Load(genesisconfig.SampleInsecureSoloProfile, configtest.GetDevConfigDir())
    62  	config.Consortiums = nil
    63  
    64  	assert.NoError(t, doOutputBlock(config, "foo", blockDest), "Missing consortiums section")
    65  }
    66  
    67  func TestMissingConsortiumValue(t *testing.T) {
    68  	configTxDest := filepath.Join(tmpDir, "configtx")
    69  
    70  	config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
    71  	config.Consortium = ""
    72  
    73  	assert.Error(t, doOutputChannelCreateTx(config, nil, "foo", configTxDest), "Missing Consortium value in Application Profile definition")
    74  }
    75  
    76  func TestMissingApplicationValue(t *testing.T) {
    77  	configTxDest := filepath.Join(tmpDir, "configtx")
    78  
    79  	config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
    80  	config.Application = nil
    81  
    82  	assert.Error(t, doOutputChannelCreateTx(config, nil, "foo", configTxDest), "Missing Application value in Application Profile definition")
    83  }
    84  
    85  func TestInspectMissingConfigTx(t *testing.T) {
    86  	assert.Error(t, doInspectChannelCreateTx("ChannelCreateTxFileWhichDoesn'tReallyExist"), "Missing channel create tx file")
    87  }
    88  
    89  func TestInspectConfigTx(t *testing.T) {
    90  	configTxDest := filepath.Join(tmpDir, "configtx")
    91  
    92  	config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
    93  
    94  	assert.NoError(t, doOutputChannelCreateTx(config, nil, "foo", configTxDest), "Good outputChannelCreateTx generation request")
    95  	assert.NoError(t, doInspectChannelCreateTx(configTxDest), "Good configtx inspection request")
    96  }
    97  
    98  func TestGenerateAnchorPeersUpdate(t *testing.T) {
    99  	configTxDest := filepath.Join(tmpDir, "anchorPeerUpdate")
   100  
   101  	config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
   102  
   103  	assert.NoError(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, genesisconfig.SampleOrgName), "Good anchorPeerUpdate request")
   104  }
   105  
   106  func TestBadAnchorPeersUpdates(t *testing.T) {
   107  	configTxDest := filepath.Join(tmpDir, "anchorPeerUpdate")
   108  
   109  	config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
   110  
   111  	assert.Error(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, ""), "Bad anchorPeerUpdate request - asOrg empty")
   112  
   113  	backupApplication := config.Application
   114  	config.Application = nil
   115  	assert.Error(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, genesisconfig.SampleOrgName), "Bad anchorPeerUpdate request")
   116  	config.Application = backupApplication
   117  
   118  	config.Application.Organizations[0] = &genesisconfig.Organization{Name: "FakeOrg", ID: "FakeOrg"}
   119  	assert.Error(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, genesisconfig.SampleOrgName), "Bad anchorPeerUpdate request - fake org")
   120  }
   121  
   122  func TestConfigTxFlags(t *testing.T) {
   123  	configTxDest := filepath.Join(tmpDir, "configtx")
   124  	configTxDestAnchorPeers := filepath.Join(tmpDir, "configtxAnchorPeers")
   125  
   126  	oldArgs := os.Args
   127  	defer func() {
   128  		os.Args = oldArgs
   129  		flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
   130  	}()
   131  
   132  	cleanup := configtest.SetDevFabricConfigPath(t)
   133  	defer cleanup()
   134  	devConfigDir := configtest.GetDevConfigDir()
   135  
   136  	os.Args = []string{
   137  		"cmd",
   138  		"-channelID=testchannelid",
   139  		"-outputCreateChannelTx=" + configTxDest,
   140  		"-channelCreateTxBaseProfile=" + genesisconfig.SampleSingleMSPSoloProfile,
   141  		"-profile=" + genesisconfig.SampleSingleMSPChannelProfile,
   142  		"-configPath=" + devConfigDir,
   143  		"-inspectChannelCreateTx=" + configTxDest,
   144  		"-outputAnchorPeersUpdate=" + configTxDestAnchorPeers,
   145  		"-asOrg=" + genesisconfig.SampleOrgName,
   146  	}
   147  
   148  	main()
   149  
   150  	_, err := os.Stat(configTxDest)
   151  	assert.NoError(t, err, "Configtx file is written successfully")
   152  	_, err = os.Stat(configTxDestAnchorPeers)
   153  	assert.NoError(t, err, "Configtx anchor peers file is written successfully")
   154  }
   155  
   156  func TestBlockFlags(t *testing.T) {
   157  	blockDest := filepath.Join(tmpDir, "block")
   158  	oldArgs := os.Args
   159  	defer func() {
   160  		os.Args = oldArgs
   161  		flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
   162  	}()
   163  	os.Args = []string{
   164  		"cmd",
   165  		"-channelID=testchannelid",
   166  		"-profile=" + genesisconfig.SampleSingleMSPSoloProfile,
   167  		"-outputBlock=" + blockDest,
   168  		"-inspectBlock=" + blockDest,
   169  	}
   170  	cleanup := configtest.SetDevFabricConfigPath(t)
   171  	defer cleanup()
   172  
   173  	main()
   174  
   175  	_, err := os.Stat(blockDest)
   176  	assert.NoError(t, err, "Block file is written successfully")
   177  }
   178  
   179  func TestPrintOrg(t *testing.T) {
   180  	factory.InitFactories(nil)
   181  	config := genesisconfig.LoadTopLevel(configtest.GetDevConfigDir())
   182  
   183  	assert.NoError(t, doPrintOrg(config, genesisconfig.SampleOrgName), "Good org to print")
   184  
   185  	err := doPrintOrg(config, genesisconfig.SampleOrgName+".wrong")
   186  	assert.Error(t, err, "Bad org name")
   187  	assert.Regexp(t, "organization [^ ]* not found", err.Error())
   188  
   189  	config.Organizations[0] = &genesisconfig.Organization{Name: "FakeOrg", ID: "FakeOrg"}
   190  	err = doPrintOrg(config, "FakeOrg")
   191  	assert.Error(t, err, "Fake org")
   192  	assert.Regexp(t, "bad org definition", err.Error())
   193  }