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  }