go_study/fabric-main/common/configtx/configmap_test.go

126 lines
5.5 KiB
Go

/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package configtx
import (
"testing"
cb "github.com/hyperledger/fabric-protos-go/common"
"github.com/hyperledger/fabric/protoutil"
"github.com/stretchr/testify/require"
)
func TestBadKey(t *testing.T) {
require.Error(t, addToMap(comparable{key: "[Label]", path: []string{}}, make(map[string]comparable)),
"Should have errored on key with illegal characters")
}
func TestConfigMapMultiGroup(t *testing.T) {
config := protoutil.NewConfigGroup()
config.Groups["0"] = protoutil.NewConfigGroup()
config.Groups["0"].Groups["1"] = protoutil.NewConfigGroup()
config.Groups["0"].Groups["1"].Groups["2.1"] = protoutil.NewConfigGroup()
config.Groups["0"].Groups["1"].Groups["2.1"].Values["Value"] = &cb.ConfigValue{}
config.Groups["0"].Groups["1"].Groups["2.2"] = protoutil.NewConfigGroup()
config.Groups["0"].Groups["1"].Groups["2.2"].Values["Value"] = &cb.ConfigValue{}
confMap, err := mapConfig(config, "Channel")
require.NoError(t, err)
require.Equal(t, []string{"Channel", "0", "1", "2.1"}, confMap["[Value] /Channel/0/1/2.1/Value"].path)
require.Equal(t, []string{"Channel", "0", "1", "2.2"}, confMap["[Value] /Channel/0/1/2.2/Value"].path)
}
func TestConfigMap(t *testing.T) {
config := protoutil.NewConfigGroup()
config.Groups["0DeepGroup"] = protoutil.NewConfigGroup()
config.Values["0DeepValue1"] = &cb.ConfigValue{}
config.Values["0DeepValue2"] = &cb.ConfigValue{}
config.Groups["0DeepGroup"].Policies["1DeepPolicy"] = &cb.ConfigPolicy{}
config.Groups["0DeepGroup"].Groups["1DeepGroup"] = protoutil.NewConfigGroup()
config.Groups["0DeepGroup"].Groups["1DeepGroup"].Values["2DeepValue"] = &cb.ConfigValue{}
confMap, err := mapConfig(config, "Channel")
require.NoError(t, err, "Should not have errored building map")
require.Len(t, confMap, 7, "There should be 7 entries in the config map")
require.Equal(t, comparable{key: "Channel", path: []string{}, ConfigGroup: config},
confMap["[Group] /Channel"])
require.Equal(t, comparable{key: "0DeepGroup", path: []string{"Channel"}, ConfigGroup: config.Groups["0DeepGroup"]},
confMap["[Group] /Channel/0DeepGroup"])
require.Equal(t, comparable{key: "0DeepValue1", path: []string{"Channel"}, ConfigValue: config.Values["0DeepValue1"]},
confMap["[Value] /Channel/0DeepValue1"])
require.Equal(t, comparable{key: "0DeepValue2", path: []string{"Channel"}, ConfigValue: config.Values["0DeepValue2"]},
confMap["[Value] /Channel/0DeepValue2"])
require.Equal(t, comparable{key: "1DeepPolicy", path: []string{"Channel", "0DeepGroup"}, ConfigPolicy: config.Groups["0DeepGroup"].Policies["1DeepPolicy"]},
confMap["[Policy] /Channel/0DeepGroup/1DeepPolicy"])
require.Equal(t, comparable{key: "1DeepGroup", path: []string{"Channel", "0DeepGroup"}, ConfigGroup: config.Groups["0DeepGroup"].Groups["1DeepGroup"]},
confMap["[Group] /Channel/0DeepGroup/1DeepGroup"])
require.Equal(t, comparable{key: "2DeepValue", path: []string{"Channel", "0DeepGroup", "1DeepGroup"}, ConfigValue: config.Groups["0DeepGroup"].Groups["1DeepGroup"].Values["2DeepValue"]},
confMap["[Value] /Channel/0DeepGroup/1DeepGroup/2DeepValue"])
}
func TestMapConfigBack(t *testing.T) {
config := protoutil.NewConfigGroup()
config.Groups["0DeepGroup"] = protoutil.NewConfigGroup()
config.Values["0DeepValue1"] = &cb.ConfigValue{}
config.Values["0DeepValue2"] = &cb.ConfigValue{}
config.Groups["0DeepGroup"].Policies["1DeepPolicy"] = &cb.ConfigPolicy{}
config.Groups["0DeepGroup"].Groups["1DeepGroup"] = protoutil.NewConfigGroup()
config.Groups["0DeepGroup"].Groups["1DeepGroup"].Values["2DeepValue"] = &cb.ConfigValue{}
confMap, err := mapConfig(config, "Channel")
require.NoError(t, err, "Should not have errored building map")
newConfig, err := configMapToConfig(confMap, "Channel")
require.NoError(t, err, "Should not have errored building config")
require.Equal(t, config, newConfig, "Should have transformed config map back from confMap")
newConfig.Values["Value"] = &cb.ConfigValue{}
require.NotEqual(t, config, newConfig, "Mutating the new config should not mutate the existing config")
}
func TestHackInmapConfigBack(t *testing.T) {
config := protoutil.NewConfigGroup()
config.Values["ChannelValue1"] = &cb.ConfigValue{}
config.Values["ChannelValue2"] = &cb.ConfigValue{}
config.Groups["Orderer"] = protoutil.NewConfigGroup()
config.Groups["Orderer"].Values["Capabilities"] = &cb.ConfigValue{}
config.Groups["Orderer"].Policies["OrdererPolicy"] = &cb.ConfigPolicy{}
config.Groups["Orderer"].Groups["OrdererOrg"] = protoutil.NewConfigGroup()
config.Groups["Orderer"].Groups["OrdererOrg"].Values["OrdererOrgValue"] = &cb.ConfigValue{}
config.Groups["Application"] = protoutil.NewConfigGroup()
config.Groups["Application"].Policies["ApplicationPolicy"] = &cb.ConfigPolicy{}
config.Groups["Application"].Policies["ApplicationValue"] = &cb.ConfigPolicy{}
confMap, err := mapConfig(config, "Channel")
require.NoError(t, err, "Should not have errored building map")
newConfig, err := configMapToConfig(confMap, "Channel")
require.NoError(t, err, "Should not have errored building config")
var checkModPolicy func(cg *cb.ConfigGroup)
checkModPolicy = func(cg *cb.ConfigGroup) {
require.NotEmpty(t, cg.ModPolicy, "empty group mod_policy")
for key, value := range cg.Values {
require.NotEmpty(t, value.ModPolicy, "empty value mod_policy %s", key)
}
for key, policy := range cg.Policies {
require.NotEmpty(t, policy.ModPolicy, "empty policy mod_policy %s", key)
}
for _, group := range cg.Groups {
checkModPolicy(group)
}
}
checkModPolicy(newConfig)
}