go_study/fabric-main/cmd/common/cli_test.go

128 lines
3.8 KiB
Go

/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package common
import (
"bytes"
"fmt"
"math/rand"
"os"
"path/filepath"
"testing"
"github.com/hyperledger/fabric/cmd/common/signer"
"github.com/pkg/errors"
"github.com/stretchr/testify/require"
)
func TestCLI(t *testing.T) {
var testCmdInvoked bool
var exited bool
// Overwrite exit
terminate = func(_ int) {
exited = true
}
// Overwrite stdout with writing to this buffer
testBuff := &bytes.Buffer{}
outWriter = testBuff
var returnValue error
cli := NewCLI("cli", "cli help")
testCommand := func(conf Config) error {
// If we exited, the command wasn't executed
if exited {
return nil
}
// Else, the command was executed - so ensure it was executed
// with the expected config
require.Equal(t, Config{
SignerConfig: signer.Config{
MSPID: "SampleOrg",
KeyPath: "key.pem",
IdentityPath: "cert.pem",
},
}, conf)
testCmdInvoked = true
return returnValue
}
cli.Command("test", "test help", testCommand)
t.Run("Loading a non existent config", func(t *testing.T) {
defer testBuff.Reset()
// Overwrite user home directory with testdata
dir := filepath.Join("testdata", "non_existent_config")
cli.Run([]string{"test", "--configFile", filepath.Join(dir, "config.yaml")})
require.Contains(t, testBuff.String(), fmt.Sprint("Failed loading config open ", dir))
require.Contains(t, testBuff.String(), "config.yaml: no such file or directory")
require.True(t, exited)
})
t.Run("Loading a valid config and the command succeeds", func(t *testing.T) {
defer testBuff.Reset()
testCmdInvoked = false
exited = false
// Overwrite user home directory with testdata
dir := filepath.Join("testdata", "valid_config")
// Ensure that a valid config results in running our command
cli.Run([]string{"test", "--configFile", filepath.Join(dir, "config.yaml")})
require.True(t, testCmdInvoked)
require.False(t, exited)
})
t.Run("Loading a valid config but the command fails", func(t *testing.T) {
returnValue = errors.New("something went wrong")
defer func() {
returnValue = nil
}()
defer testBuff.Reset()
testCmdInvoked = false
exited = false
// Overwrite user home directory with testdata
dir := filepath.Join("testdata", "valid_config")
// Ensure that a valid config results in running our command
cli.Run([]string{"test", "--configFile", filepath.Join(dir, "config.yaml")})
require.True(t, testCmdInvoked)
require.True(t, exited)
require.Contains(t, testBuff.String(), "something went wrong")
})
t.Run("Saving a config", func(t *testing.T) {
defer testBuff.Reset()
testCmdInvoked = false
exited = false
dir := filepath.Join(os.TempDir(), fmt.Sprintf("config%d", rand.Int()))
os.Mkdir(dir, 0o700)
defer os.RemoveAll(dir)
userCert := filepath.Join(dir, "cert.pem")
userKey := filepath.Join(dir, "key.pem")
userCertFlag := fmt.Sprintf("--userCert=%s", userCert)
userKeyFlag := fmt.Sprintf("--userKey=%s", userKey)
os.Create(userCert)
os.Create(userKey)
cli.Run([]string{saveConfigCommand, "--MSP=SampleOrg", userCertFlag, userKeyFlag})
require.Contains(t, testBuff.String(), "--configFile must be used to specify the configuration file")
testBuff.Reset()
// Persist the config
cli.Run([]string{saveConfigCommand, "--MSP=SampleOrg", userCertFlag, userKeyFlag, "--configFile", filepath.Join(dir, "config.yaml")})
// Run a different command and ensure the config was successfully persisted
cli.Command("assert", "", func(conf Config) error {
require.Equal(t, Config{
SignerConfig: signer.Config{
MSPID: "SampleOrg",
KeyPath: userKey,
IdentityPath: userCert,
},
}, conf)
return nil
})
cli.Run([]string{"assert", "--configFile", filepath.Join(dir, "config.yaml")})
})
}