go_study/fabric-main/common/cauthdsl/policy_test.go

155 lines
4.6 KiB
Go

/*
Copyright IBM Corp. 2016 All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package cauthdsl
import (
"fmt"
"testing"
"github.com/golang/protobuf/proto"
cb "github.com/hyperledger/fabric-protos-go/common"
"github.com/hyperledger/fabric/common/policies"
"github.com/hyperledger/fabric/common/policydsl"
"github.com/hyperledger/fabric/protoutil"
"github.com/stretchr/testify/require"
)
var (
acceptAllPolicy *cb.Policy
rejectAllPolicy *cb.Policy
)
func init() {
acceptAllPolicy = makePolicySource(true)
rejectAllPolicy = makePolicySource(false)
}
// The proto utils has become a dumping ground of cyclic imports, it's easier to define this locally
func marshalOrPanic(msg proto.Message) []byte {
data, err := proto.Marshal(msg)
if err != nil {
panic(fmt.Errorf("Error marshaling messages: %s, %s", msg, err))
}
return data
}
func makePolicySource(policyResult bool) *cb.Policy {
var policyData *cb.SignaturePolicyEnvelope
if policyResult {
policyData = policydsl.AcceptAllPolicy
} else {
policyData = policydsl.RejectAllPolicy
}
return &cb.Policy{
Type: int32(cb.Policy_SIGNATURE),
Value: marshalOrPanic(policyData),
}
}
func providerMap() map[int32]policies.Provider {
r := make(map[int32]policies.Provider)
r[int32(cb.Policy_SIGNATURE)] = NewPolicyProvider(&mockDeserializer{})
return r
}
func TestAccept(t *testing.T) {
policyID := "policyID"
m, err := policies.NewManagerImpl("test", providerMap(), &cb.ConfigGroup{
Policies: map[string]*cb.ConfigPolicy{
policyID: {Policy: acceptAllPolicy},
},
})
require.NoError(t, err)
require.NotNil(t, m)
policy, ok := m.GetPolicy(policyID)
require.True(t, ok, "Should have found policy which was just added, but did not")
err = policy.EvaluateSignedData([]*protoutil.SignedData{{Identity: []byte("identity"), Data: []byte("data"), Signature: []byte("sig")}})
require.NoError(t, err, "Should not have errored evaluating an acceptAll policy")
}
func TestReject(t *testing.T) {
policyID := "policyID"
m, err := policies.NewManagerImpl("test", providerMap(), &cb.ConfigGroup{
Policies: map[string]*cb.ConfigPolicy{
policyID: {Policy: rejectAllPolicy},
},
})
require.NoError(t, err)
require.NotNil(t, m)
policy, ok := m.GetPolicy(policyID)
require.True(t, ok, "Should have found policy which was just added, but did not")
err = policy.EvaluateSignedData([]*protoutil.SignedData{{Identity: []byte("identity"), Data: []byte("data"), Signature: []byte("sig")}})
require.Error(t, err, "Should have errored evaluating an rejectAll policy")
}
func TestRejectOnUnknown(t *testing.T) {
m, err := policies.NewManagerImpl("test", providerMap(), &cb.ConfigGroup{})
require.NoError(t, err)
require.NotNil(t, m)
policy, ok := m.GetPolicy("FakePolicyID")
require.False(t, ok, "Should not have found policy which was never added, but did")
err = policy.EvaluateSignedData([]*protoutil.SignedData{{Identity: []byte("identity"), Data: []byte("data"), Signature: []byte("sig")}})
require.Error(t, err, "Should have errored evaluating the default policy")
}
func TestNewPolicyErrorCase(t *testing.T) {
provider := NewPolicyProvider(nil)
pol1, msg1, err1 := provider.NewPolicy([]byte{0})
require.Nil(t, pol1)
require.Nil(t, msg1)
require.ErrorContains(t, err1, "Error unmarshalling to SignaturePolicy")
sigPolicy2 := &cb.SignaturePolicyEnvelope{Version: -1}
data2 := marshalOrPanic(sigPolicy2)
pol2, msg2, err2 := provider.NewPolicy(data2)
require.Nil(t, pol2)
require.Nil(t, msg2)
require.EqualError(t, err2, "This evaluator only understands messages of version 0, but version was -1")
pol3, msg3, err3 := provider.NewPolicy([]byte{})
require.Nil(t, pol3)
require.Nil(t, msg3)
require.EqualError(t, err3, "Empty policy element")
var pol4 *policy
err4 := pol4.EvaluateSignedData([]*protoutil.SignedData{})
require.EqualError(t, err4, "no such policy")
}
func TestEnvelopeBasedPolicyProvider(t *testing.T) {
pp := &EnvelopeBasedPolicyProvider{Deserializer: &mockDeserializer{}}
p, err := pp.NewPolicy(nil)
require.Nil(t, p)
require.Error(t, err, "invalid arguments")
p, err = pp.NewPolicy(&cb.SignaturePolicyEnvelope{})
require.Nil(t, p)
require.Error(t, err, "Empty policy element")
p, err = pp.NewPolicy(policydsl.SignedByMspPeer("primus inter pares"))
require.NotNil(t, p)
require.NoError(t, err)
}
func TestConverter(t *testing.T) {
p := policy{}
cp, err := p.Convert()
require.Nil(t, cp)
require.Error(t, err)
require.Contains(t, err.Error(), "nil policy field")
p.signaturePolicyEnvelope = policydsl.RejectAllPolicy
cp, err = p.Convert()
require.NotNil(t, cp)
require.NoError(t, err)
require.Equal(t, cp, policydsl.RejectAllPolicy)
}