118 lines
4.0 KiB
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")
|
|
}
|