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 }