go_study/fabric-main/cmd/configtxgen/main_test.go

249 lines
9.2 KiB
Go

/*
Copyright IBM Corp. 2017 All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package main
import (
"flag"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"testing"
"github.com/hyperledger/fabric/bccsp/factory"
"github.com/hyperledger/fabric/core/config/configtest"
"github.com/hyperledger/fabric/internal/configtxgen/genesisconfig"
"github.com/stretchr/testify/require"
)
var tmpDir string
func TestMain(m *testing.M) {
dir, err := ioutil.TempDir("", "configtxgen")
if err != nil {
panic("Error creating temp dir")
}
tmpDir = dir
testResult := m.Run()
os.RemoveAll(dir)
os.Exit(testResult)
}
func TestInspectMissing(t *testing.T) {
require.EqualError(t, doInspectBlock("NonSenseBlockFileThatDoesn'tActuallyExist"), "could not read block NonSenseBlockFileThatDoesn'tActuallyExist")
}
func TestInspectBlock(t *testing.T) {
blockDest := filepath.Join(tmpDir, "block")
config := genesisconfig.Load(genesisconfig.SampleAppChannelInsecureSoloProfile, configtest.GetDevConfigDir())
require.NoError(t, doOutputBlock(config, "foo", blockDest), "Good block generation request")
require.NoError(t, doInspectBlock(blockDest), "Good block inspection request")
}
func TestInspectBlockErr(t *testing.T) {
config := genesisconfig.Load(genesisconfig.SampleAppChannelInsecureSoloProfile, configtest.GetDevConfigDir())
require.EqualError(t, doOutputBlock(config, "foo", ""), "error writing genesis block: open : no such file or directory")
require.EqualError(t, doInspectBlock(""), "could not read block ")
}
func TestMissingOrdererSection(t *testing.T) {
blockDest := filepath.Join(tmpDir, "block")
config := genesisconfig.Load(genesisconfig.SampleAppChannelInsecureSoloProfile, configtest.GetDevConfigDir())
config.Orderer = nil
require.EqualError(t, doOutputBlock(config, "foo", blockDest), "refusing to generate block which is missing orderer section")
}
func TestApplicationChannelGenesisBlock(t *testing.T) {
blockDest := filepath.Join(tmpDir, "block")
config := genesisconfig.Load(genesisconfig.SampleAppChannelInsecureSoloProfile, configtest.GetDevConfigDir())
require.NoError(t, doOutputBlock(config, "foo", blockDest))
}
func TestApplicationChannelMissingApplicationSection(t *testing.T) {
blockDest := filepath.Join(tmpDir, "block")
config := genesisconfig.Load(genesisconfig.SampleAppChannelInsecureSoloProfile, configtest.GetDevConfigDir())
config.Application = nil
require.EqualError(t, doOutputBlock(config, "foo", blockDest), "refusing to generate application channel block which is missing application section")
}
func TestMissingConsortiumValue(t *testing.T) {
configTxDest := filepath.Join(tmpDir, "configtx")
config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
config.Consortium = ""
require.EqualError(t, doOutputChannelCreateTx(config, nil, "foo", configTxDest), "config update generation failure: cannot define a new channel with no Consortium value")
}
func TestUnsuccessfulChannelTxFileCreation(t *testing.T) {
configTxDest := filepath.Join(tmpDir, "configtx")
config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
require.NoError(t, ioutil.WriteFile(configTxDest, []byte{}, 0o440))
defer os.Remove(configTxDest)
require.EqualError(t, doOutputChannelCreateTx(config, nil, "foo", configTxDest), fmt.Sprintf("error writing channel create tx: open %s: permission denied", configTxDest))
}
func TestMissingApplicationValue(t *testing.T) {
configTxDest := filepath.Join(tmpDir, "configtx")
config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
config.Application = nil
require.EqualError(t, doOutputChannelCreateTx(config, nil, "foo", configTxDest), "could not generate default config template: channel template configs must contain an application section")
}
func TestInspectMissingConfigTx(t *testing.T) {
require.EqualError(t, doInspectChannelCreateTx("ChannelCreateTxFileWhichDoesn'tReallyExist"), "could not read channel create tx: open ChannelCreateTxFileWhichDoesn'tReallyExist: no such file or directory")
}
func TestInspectConfigTx(t *testing.T) {
configTxDest := filepath.Join(tmpDir, "configtx")
config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
require.NoError(t, doOutputChannelCreateTx(config, nil, "foo", configTxDest), "Good outputChannelCreateTx generation request")
require.NoError(t, doInspectChannelCreateTx(configTxDest), "Good configtx inspection request")
}
func TestGenerateAnchorPeersUpdate(t *testing.T) {
configTxDest := filepath.Join(tmpDir, "anchorPeerUpdate")
config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
require.NoError(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, genesisconfig.SampleOrgName), "Good anchorPeerUpdate request")
}
func TestBadAnchorPeersUpdates(t *testing.T) {
configTxDest := filepath.Join(tmpDir, "anchorPeerUpdate")
config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile, configtest.GetDevConfigDir())
require.EqualError(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, ""), "must specify an organization to update the anchor peer for")
backupApplication := config.Application
config.Application = nil
require.EqualError(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, genesisconfig.SampleOrgName), "cannot update anchor peers without an application section")
config.Application = backupApplication
config.Application.Organizations[0] = &genesisconfig.Organization{Name: "FakeOrg", ID: "FakeOrg"}
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 ''")
}
func TestConfigTxFlags(t *testing.T) {
configTxDest := filepath.Join(tmpDir, "configtx")
configTxDestAnchorPeers := filepath.Join(tmpDir, "configtxAnchorPeers")
oldArgs := os.Args
defer func() {
os.Args = oldArgs
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
}()
configtest.SetDevFabricConfigPath(t)
devConfigDir := configtest.GetDevConfigDir()
os.Args = []string{
"cmd",
"-channelID=testchannelid",
"-outputCreateChannelTx=" + configTxDest,
"-profile=" + genesisconfig.SampleSingleMSPChannelProfile,
"-configPath=" + devConfigDir,
"-inspectChannelCreateTx=" + configTxDest,
"-outputAnchorPeersUpdate=" + configTxDestAnchorPeers,
"-asOrg=" + genesisconfig.SampleOrgName,
}
main()
_, err := os.Stat(configTxDest)
require.NoError(t, err, "Configtx file is written successfully")
_, err = os.Stat(configTxDestAnchorPeers)
require.NoError(t, err, "Configtx anchor peers file is written successfully")
}
func TestBlockFlags(t *testing.T) {
blockDest := filepath.Join(tmpDir, "block")
oldArgs := os.Args
defer func() {
os.Args = oldArgs
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
}()
os.Args = []string{
"cmd",
"-channelID=testchannelid",
"-profile=" + genesisconfig.SampleSingleMSPSoloProfile,
"-outputBlock=" + blockDest,
"-inspectBlock=" + blockDest,
}
configtest.SetDevFabricConfigPath(t)
main()
_, err := os.Stat(blockDest)
require.NoError(t, err, "Block file is written successfully")
}
func TestPrintOrg(t *testing.T) {
factory.InitFactories(nil)
config := genesisconfig.LoadTopLevel(configtest.GetDevConfigDir())
require.NoError(t, doPrintOrg(config, genesisconfig.SampleOrgName), "Good org to print")
err := doPrintOrg(config, genesisconfig.SampleOrgName+".wrong")
require.Error(t, err, "Bad org name")
require.Regexp(t, "organization [^ ]* not found", err.Error())
config.Organizations[0] = &genesisconfig.Organization{Name: "FakeOrg", ID: "FakeOrg"}
err = doPrintOrg(config, "FakeOrg")
require.Error(t, err, "Fake org")
require.Regexp(t, "bad org definition", err.Error())
}
func createBftOrdererConfig() *genesisconfig.Profile {
// Load the BFT config from the sample, and use some TLS CA Cert as crypto material
config := genesisconfig.Load(genesisconfig.SampleAppChannelSmartBftProfile, configtest.GetDevConfigDir())
tlsCertPath := filepath.Join(configtest.GetDevConfigDir(), "msp", "tlscacerts", "tlsroot.pem")
for _, consenter := range config.Orderer.ConsenterMapping {
consenter.Identity = tlsCertPath
consenter.ClientTLSCert = tlsCertPath
consenter.ServerTLSCert = tlsCertPath
}
return config
}
func TestBftOrdererTypeWithoutV3CapabilitiesShouldRaiseAnError(t *testing.T) {
// ### Arrange
blockDest := filepath.Join(tmpDir, "block")
config := createBftOrdererConfig()
config.Capabilities["V3_0"] = false
// ### Act & Assert
require.EqualError(t, doOutputBlock(config, "testChannelId", blockDest), "could not create bootstrapper: could not create channel group: could not create orderer group: orderer type BFT must be used with V3_0 capability")
}
func TestBftOrdererTypeWithV3CapabilitiesShouldNotRaiseAnError(t *testing.T) {
// ### Arrange
blockDest := filepath.Join(tmpDir, "block")
config := createBftOrdererConfig()
config.Capabilities["V3_0"] = true
// ### Act & Assert
require.NoError(t, doOutputBlock(config, "testChannelId", blockDest))
}