go_study/fabric-main/common/policies/implicitmeta_test.go

118 lines
4.0 KiB
Go

/*
Copyright IBM Corp. 2017 All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package policies
import (
"fmt"
"testing"
"github.com/hyperledger/fabric/msp"
cb "github.com/hyperledger/fabric-protos-go/common"
"github.com/hyperledger/fabric/protoutil"
"github.com/stretchr/testify/require"
)
const TestPolicyName = "TestPolicyName"
type acceptPolicy struct{}
func (ap acceptPolicy) EvaluateSignedData(signedData []*protoutil.SignedData) error {
return nil
}
func (ap acceptPolicy) EvaluateIdentities(identity []msp.Identity) error {
return nil
}
func TestImplicitMarshalError(t *testing.T) {
_, err := NewImplicitMetaPolicy([]byte("GARBAGE"), nil)
require.Error(t, err, "Should have errored unmarshalling garbage")
}
func makeManagers(count, passing int) map[string]*ManagerImpl {
result := make(map[string]*ManagerImpl)
remaining := passing
for i := 0; i < count; i++ {
policyMap := make(map[string]Policy)
if remaining > 0 {
policyMap[TestPolicyName] = acceptPolicy{}
}
remaining--
result[fmt.Sprintf("%d", i)] = &ManagerImpl{
Policies: policyMap,
}
}
return result
}
// makePolicyTest creates an implicitMetaPolicy with a set of
func runPolicyTest(t *testing.T, rule cb.ImplicitMetaPolicy_Rule, managerCount int, passingCount int) error {
imp, err := NewImplicitMetaPolicy(protoutil.MarshalOrPanic(&cb.ImplicitMetaPolicy{
Rule: rule,
SubPolicy: TestPolicyName,
}), makeManagers(managerCount, passingCount))
if err != nil {
panic(err)
}
errSD := imp.EvaluateSignedData(nil)
imp, err = NewImplicitMetaPolicy(protoutil.MarshalOrPanic(&cb.ImplicitMetaPolicy{
Rule: rule,
SubPolicy: TestPolicyName,
}), makeManagers(managerCount, passingCount))
if err != nil {
panic(err)
}
errI := imp.EvaluateIdentities(nil)
require.False(t, ((errI == nil && errSD != nil) || (errSD == nil && errI != nil)))
if errI != nil && errSD != nil {
require.Equal(t, errI.Error(), errSD.Error())
}
return errI
}
func TestImplicitMetaAny(t *testing.T) {
require.NoError(t, runPolicyTest(t, cb.ImplicitMetaPolicy_ANY, 1, 1))
require.NoError(t, runPolicyTest(t, cb.ImplicitMetaPolicy_ANY, 10, 1))
require.NoError(t, runPolicyTest(t, cb.ImplicitMetaPolicy_ANY, 10, 8))
require.NoError(t, runPolicyTest(t, cb.ImplicitMetaPolicy_ANY, 0, 0))
err := runPolicyTest(t, cb.ImplicitMetaPolicy_ANY, 10, 0)
require.EqualError(t, err, "implicit policy evaluation failed - 0 sub-policies were satisfied, but this policy requires 1 of the 'TestPolicyName' sub-policies to be satisfied")
}
func TestImplicitMetaAll(t *testing.T) {
require.NoError(t, runPolicyTest(t, cb.ImplicitMetaPolicy_ALL, 1, 1))
require.NoError(t, runPolicyTest(t, cb.ImplicitMetaPolicy_ALL, 10, 10))
require.NoError(t, runPolicyTest(t, cb.ImplicitMetaPolicy_ALL, 0, 0))
err := runPolicyTest(t, cb.ImplicitMetaPolicy_ALL, 10, 1)
require.EqualError(t, err, "implicit policy evaluation failed - 1 sub-policies were satisfied, but this policy requires 10 of the 'TestPolicyName' sub-policies to be satisfied")
err = runPolicyTest(t, cb.ImplicitMetaPolicy_ALL, 10, 0)
require.EqualError(t, err, "implicit policy evaluation failed - 0 sub-policies were satisfied, but this policy requires 10 of the 'TestPolicyName' sub-policies to be satisfied")
}
func TestImplicitMetaMajority(t *testing.T) {
require.NoError(t, runPolicyTest(t, cb.ImplicitMetaPolicy_MAJORITY, 1, 1))
require.NoError(t, runPolicyTest(t, cb.ImplicitMetaPolicy_MAJORITY, 10, 6))
require.NoError(t, runPolicyTest(t, cb.ImplicitMetaPolicy_MAJORITY, 3, 2))
require.NoError(t, runPolicyTest(t, cb.ImplicitMetaPolicy_MAJORITY, 0, 0))
err := runPolicyTest(t, cb.ImplicitMetaPolicy_MAJORITY, 10, 5)
require.EqualError(t, err, "implicit policy evaluation failed - 5 sub-policies were satisfied, but this policy requires 6 of the 'TestPolicyName' sub-policies to be satisfied")
err = runPolicyTest(t, cb.ImplicitMetaPolicy_MAJORITY, 10, 0)
require.EqualError(t, err, "implicit policy evaluation failed - 0 sub-policies were satisfied, but this policy requires 6 of the 'TestPolicyName' sub-policies to be satisfied")
}