github.com/darrenli6/fabric-sdk-example@v0.0.0-20220109053535-94b13b56df8c/common/policies/policy_test.go (about) 1 /* 2 Copyright IBM Corp. 2017 All Rights Reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package policies 18 19 import ( 20 "testing" 21 22 cb "github.com/hyperledger/fabric/protos/common" 23 24 "github.com/golang/protobuf/proto" 25 logging "github.com/op/go-logging" 26 "github.com/stretchr/testify/assert" 27 ) 28 29 func init() { 30 logging.SetLevel(logging.DEBUG, "") 31 } 32 33 type mockProvider struct{} 34 35 func (mpp mockProvider) NewPolicy(data []byte) (Policy, proto.Message, error) { 36 return nil, nil, nil 37 } 38 39 const mockType = int32(0) 40 41 func defaultProviders() map[int32]Provider { 42 providers := make(map[int32]Provider) 43 providers[mockType] = &mockProvider{} 44 return providers 45 } 46 47 func TestUnnestedManager(t *testing.T) { 48 m := NewManagerImpl("test", defaultProviders()) 49 handlers, err := m.BeginPolicyProposals(t, []string{}) 50 assert.NoError(t, err) 51 assert.Empty(t, handlers, "Should not have returned additional handlers") 52 53 policyNames := []string{"1", "2", "3"} 54 55 for _, policyName := range policyNames { 56 _, err := m.ProposePolicy(t, policyName, &cb.ConfigPolicy{Policy: &cb.Policy{Type: mockType}}) 57 assert.NoError(t, err) 58 } 59 60 m.CommitProposals(t) 61 62 _, ok := m.Manager([]string{"subGroup"}) 63 assert.False(t, ok, "Should not have found a subgroup manager") 64 65 r, ok := m.Manager([]string{}) 66 assert.True(t, ok, "Should have found the root manager") 67 assert.Equal(t, m, r) 68 69 for _, policyName := range policyNames { 70 _, ok := m.GetPolicy(policyName) 71 assert.True(t, ok, "Should have found policy %s", policyName) 72 } 73 } 74 75 func TestNestedManager(t *testing.T) { 76 m := NewManagerImpl("test", defaultProviders()) 77 absPrefix := "/test/" 78 nesting1, err := m.BeginPolicyProposals(t, []string{"nest1"}) 79 assert.NoError(t, err) 80 assert.Len(t, nesting1, 1, "Should not have returned exactly one additional manager") 81 82 nesting2, err := nesting1[0].BeginPolicyProposals(t, []string{"nest2a", "nest2b"}) 83 assert.NoError(t, err) 84 assert.Len(t, nesting2, 2, "Should not have returned two one additional managers") 85 86 _, err = nesting2[0].BeginPolicyProposals(t, []string{}) 87 assert.NoError(t, err) 88 _, err = nesting2[1].BeginPolicyProposals(t, []string{}) 89 assert.NoError(t, err) 90 91 policyNames := []string{"n0a", "n0b", "n0c"} 92 for _, policyName := range policyNames { 93 _, err := m.ProposePolicy(t, policyName, &cb.ConfigPolicy{Policy: &cb.Policy{Type: mockType}}) 94 assert.NoError(t, err) 95 } 96 97 n1PolicyNames := []string{"n1a", "n1b", "n1c"} 98 for _, policyName := range n1PolicyNames { 99 _, err := nesting1[0].ProposePolicy(t, policyName, &cb.ConfigPolicy{Policy: &cb.Policy{Type: mockType}}) 100 assert.NoError(t, err) 101 } 102 103 n2aPolicyNames := []string{"n2a_1", "n2a_2", "n2a_3"} 104 for _, policyName := range n2aPolicyNames { 105 _, err := nesting2[0].ProposePolicy(t, policyName, &cb.ConfigPolicy{Policy: &cb.Policy{Type: mockType}}) 106 assert.NoError(t, err) 107 } 108 109 n2bPolicyNames := []string{"n2b_1", "n2b_2", "n2b_3"} 110 for _, policyName := range n2bPolicyNames { 111 _, err := nesting2[1].ProposePolicy(t, policyName, &cb.ConfigPolicy{Policy: &cb.Policy{Type: mockType}}) 112 assert.NoError(t, err) 113 } 114 115 nesting2[0].CommitProposals(t) 116 nesting2[1].CommitProposals(t) 117 nesting1[0].CommitProposals(t) 118 m.CommitProposals(t) 119 120 r, ok := m.Manager([]string{}) 121 assert.True(t, ok, "Should have found the root manager") 122 assert.Equal(t, m, r) 123 124 n1, ok := m.Manager([]string{"nest1"}) 125 assert.True(t, ok) 126 n2a, ok := m.Manager([]string{"nest1", "nest2a"}) 127 assert.True(t, ok) 128 n2b, ok := m.Manager([]string{"nest1", "nest2b"}) 129 assert.True(t, ok) 130 131 n2as, ok := n1.Manager([]string{"nest2a"}) 132 assert.True(t, ok) 133 assert.Equal(t, n2a, n2as) 134 n2bs, ok := n1.Manager([]string{"nest2b"}) 135 assert.True(t, ok) 136 assert.Equal(t, n2b, n2bs) 137 138 for _, policyName := range policyNames { 139 _, ok := m.GetPolicy(policyName) 140 assert.True(t, ok, "Should have found policy %s", policyName) 141 142 absName := absPrefix + policyName 143 _, ok = m.GetPolicy(absName) 144 assert.True(t, ok, "Should have found absolute policy %s", absName) 145 } 146 147 for _, policyName := range n1PolicyNames { 148 _, ok := n1.GetPolicy(policyName) 149 assert.True(t, ok, "Should have found policy %s", policyName) 150 151 _, ok = m.GetPolicy(n1.BasePath() + "/" + policyName) 152 assert.True(t, ok, "Should have found policy %s", policyName) 153 154 for i, abs := range []Manager{n1, m} { 155 absName := absPrefix + n1.BasePath() + "/" + policyName 156 _, ok = abs.GetPolicy(absName) 157 assert.True(t, ok, "Should have found absolutely policy for manager %d", i) 158 } 159 } 160 161 for _, policyName := range n2aPolicyNames { 162 _, ok := n2a.GetPolicy(policyName) 163 assert.True(t, ok, "Should have found policy %s", policyName) 164 165 _, ok = n1.GetPolicy(n2a.BasePath() + "/" + policyName) 166 assert.True(t, ok, "Should have found policy %s", policyName) 167 168 _, ok = m.GetPolicy(n1.BasePath() + "/" + n2a.BasePath() + "/" + policyName) 169 assert.True(t, ok, "Should have found policy %s", policyName) 170 171 for i, abs := range []Manager{n2a, n1, m} { 172 absName := absPrefix + n1.BasePath() + "/" + n2a.BasePath() + "/" + policyName 173 _, ok = abs.GetPolicy(absName) 174 assert.True(t, ok, "Should have found absolutely policy for manager %d", i) 175 } 176 } 177 178 for _, policyName := range n2bPolicyNames { 179 _, ok := n2b.GetPolicy(policyName) 180 assert.True(t, ok, "Should have found policy %s", policyName) 181 182 _, ok = n1.GetPolicy(n2b.BasePath() + "/" + policyName) 183 assert.True(t, ok, "Should have found policy %s", policyName) 184 185 _, ok = m.GetPolicy(n1.BasePath() + "/" + n2b.BasePath() + "/" + policyName) 186 assert.True(t, ok, "Should have found policy %s", policyName) 187 188 for i, abs := range []Manager{n2b, n1, m} { 189 absName := absPrefix + n1.BasePath() + "/" + n2b.BasePath() + "/" + policyName 190 _, ok = abs.GetPolicy(absName) 191 assert.True(t, ok, "Should have found absolutely policy for manager %d", i) 192 } 193 } 194 }