github.com/defanghe/fabric@v2.1.1+incompatible/internal/configtxlator/update/update_test.go (about)

     1  /*
     2  Copyright IBM Corp. 2017 All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package update
     8  
     9  import (
    10  	"testing"
    11  
    12  	cb "github.com/hyperledger/fabric-protos-go/common"
    13  	"github.com/stretchr/testify/assert"
    14  )
    15  
    16  func TestNoUpdate(t *testing.T) {
    17  	original := &cb.ConfigGroup{
    18  		Version: 7,
    19  	}
    20  	updated := &cb.ConfigGroup{}
    21  
    22  	_, err := Compute(&cb.Config{
    23  		ChannelGroup: original,
    24  	}, &cb.Config{
    25  		ChannelGroup: updated,
    26  	})
    27  
    28  	assert.Error(t, err)
    29  }
    30  
    31  func TestMissingGroup(t *testing.T) {
    32  	group := &cb.ConfigGroup{}
    33  	t.Run("MissingOriginal", func(t *testing.T) {
    34  		_, err := Compute(&cb.Config{}, &cb.Config{ChannelGroup: group})
    35  
    36  		assert.Error(t, err)
    37  		assert.Regexp(t, "no channel group included for original config", err.Error())
    38  	})
    39  	t.Run("MissingOriginal", func(t *testing.T) {
    40  		_, err := Compute(&cb.Config{ChannelGroup: group}, &cb.Config{})
    41  
    42  		assert.Error(t, err)
    43  		assert.Regexp(t, "no channel group included for updated config", err.Error())
    44  	})
    45  }
    46  
    47  func TestGroupModPolicyUpdate(t *testing.T) {
    48  	original := &cb.ConfigGroup{
    49  		Version:   7,
    50  		ModPolicy: "foo",
    51  	}
    52  	updated := &cb.ConfigGroup{
    53  		ModPolicy: "bar",
    54  	}
    55  
    56  	cu, err := Compute(&cb.Config{
    57  		ChannelGroup: original,
    58  	}, &cb.Config{
    59  		ChannelGroup: updated,
    60  	})
    61  
    62  	assert.NoError(t, err)
    63  
    64  	expectedReadSet := &cb.ConfigGroup{
    65  		Version:  original.Version,
    66  		Groups:   map[string]*cb.ConfigGroup{},
    67  		Policies: map[string]*cb.ConfigPolicy{},
    68  		Values:   map[string]*cb.ConfigValue{},
    69  	}
    70  
    71  	assert.Equal(t, expectedReadSet, cu.ReadSet, "Mismatched read set")
    72  
    73  	expectedWriteSet := &cb.ConfigGroup{
    74  		Version:   original.Version + 1,
    75  		Groups:    map[string]*cb.ConfigGroup{},
    76  		Policies:  map[string]*cb.ConfigPolicy{},
    77  		Values:    map[string]*cb.ConfigValue{},
    78  		ModPolicy: updated.ModPolicy,
    79  	}
    80  
    81  	assert.Equal(t, expectedWriteSet, cu.WriteSet, "Mismatched write set")
    82  }
    83  
    84  func TestGroupPolicyModification(t *testing.T) {
    85  
    86  	policy1Name := "foo"
    87  	policy2Name := "bar"
    88  	original := &cb.ConfigGroup{
    89  		Version: 4,
    90  		Policies: map[string]*cb.ConfigPolicy{
    91  			policy1Name: {
    92  				Version: 2,
    93  				Policy: &cb.Policy{
    94  					Type: 3,
    95  				},
    96  			},
    97  			policy2Name: {
    98  				Version: 1,
    99  				Policy: &cb.Policy{
   100  					Type: 5,
   101  				},
   102  			},
   103  		},
   104  	}
   105  	updated := &cb.ConfigGroup{
   106  		Policies: map[string]*cb.ConfigPolicy{
   107  			policy1Name: original.Policies[policy1Name],
   108  			policy2Name: {
   109  				Policy: &cb.Policy{
   110  					Type: 9,
   111  				},
   112  			},
   113  		},
   114  	}
   115  
   116  	cu, err := Compute(&cb.Config{
   117  		ChannelGroup: original,
   118  	}, &cb.Config{
   119  		ChannelGroup: updated,
   120  	})
   121  
   122  	assert.NoError(t, err)
   123  
   124  	expectedReadSet := &cb.ConfigGroup{
   125  		Version:  original.Version,
   126  		Policies: map[string]*cb.ConfigPolicy{},
   127  		Values:   map[string]*cb.ConfigValue{},
   128  		Groups:   map[string]*cb.ConfigGroup{},
   129  	}
   130  
   131  	assert.Equal(t, expectedReadSet, cu.ReadSet, "Mismatched read set")
   132  
   133  	expectedWriteSet := &cb.ConfigGroup{
   134  		Version: original.Version,
   135  		Policies: map[string]*cb.ConfigPolicy{
   136  			policy2Name: {
   137  				Policy: &cb.Policy{
   138  					Type: updated.Policies[policy2Name].Policy.Type,
   139  				},
   140  				Version: original.Policies[policy2Name].Version + 1,
   141  			},
   142  		},
   143  		Values: map[string]*cb.ConfigValue{},
   144  		Groups: map[string]*cb.ConfigGroup{},
   145  	}
   146  
   147  	assert.Equal(t, expectedWriteSet, cu.WriteSet, "Mismatched write set")
   148  }
   149  
   150  func TestGroupValueModification(t *testing.T) {
   151  
   152  	value1Name := "foo"
   153  	value2Name := "bar"
   154  	original := &cb.ConfigGroup{
   155  		Version: 7,
   156  		Values: map[string]*cb.ConfigValue{
   157  			value1Name: {
   158  				Version: 3,
   159  				Value:   []byte("value1value"),
   160  			},
   161  			value2Name: {
   162  				Version: 6,
   163  				Value:   []byte("value2value"),
   164  			},
   165  		},
   166  	}
   167  	updated := &cb.ConfigGroup{
   168  		Values: map[string]*cb.ConfigValue{
   169  			value1Name: original.Values[value1Name],
   170  			value2Name: {
   171  				Value: []byte("updatedValued2Value"),
   172  			},
   173  		},
   174  	}
   175  
   176  	cu, err := Compute(&cb.Config{
   177  		ChannelGroup: original,
   178  	}, &cb.Config{
   179  		ChannelGroup: updated,
   180  	})
   181  
   182  	assert.NoError(t, err)
   183  
   184  	expectedReadSet := &cb.ConfigGroup{
   185  		Version:  original.Version,
   186  		Values:   map[string]*cb.ConfigValue{},
   187  		Policies: map[string]*cb.ConfigPolicy{},
   188  		Groups:   map[string]*cb.ConfigGroup{},
   189  	}
   190  
   191  	assert.Equal(t, expectedReadSet, cu.ReadSet, "Mismatched read set")
   192  
   193  	expectedWriteSet := &cb.ConfigGroup{
   194  		Version: original.Version,
   195  		Values: map[string]*cb.ConfigValue{
   196  			value2Name: {
   197  				Value:   updated.Values[value2Name].Value,
   198  				Version: original.Values[value2Name].Version + 1,
   199  			},
   200  		},
   201  		Policies: map[string]*cb.ConfigPolicy{},
   202  		Groups:   map[string]*cb.ConfigGroup{},
   203  	}
   204  
   205  	assert.Equal(t, expectedWriteSet, cu.WriteSet, "Mismatched write set")
   206  }
   207  
   208  func TestGroupGroupsModification(t *testing.T) {
   209  
   210  	subGroupName := "foo"
   211  	original := &cb.ConfigGroup{
   212  		Version: 7,
   213  		Groups: map[string]*cb.ConfigGroup{
   214  			subGroupName: {
   215  				Version: 3,
   216  				Values: map[string]*cb.ConfigValue{
   217  					"testValue": {
   218  						Version: 3,
   219  					},
   220  				},
   221  			},
   222  		},
   223  	}
   224  	updated := &cb.ConfigGroup{
   225  		Groups: map[string]*cb.ConfigGroup{
   226  			subGroupName: {},
   227  		},
   228  	}
   229  
   230  	cu, err := Compute(&cb.Config{
   231  		ChannelGroup: original,
   232  	}, &cb.Config{
   233  		ChannelGroup: updated,
   234  	})
   235  
   236  	assert.NoError(t, err)
   237  
   238  	expectedReadSet := &cb.ConfigGroup{
   239  		Version: original.Version,
   240  		Groups: map[string]*cb.ConfigGroup{
   241  			subGroupName: {
   242  				Version:  original.Groups[subGroupName].Version,
   243  				Policies: map[string]*cb.ConfigPolicy{},
   244  				Values:   map[string]*cb.ConfigValue{},
   245  				Groups:   map[string]*cb.ConfigGroup{},
   246  			},
   247  		},
   248  		Policies: map[string]*cb.ConfigPolicy{},
   249  		Values:   map[string]*cb.ConfigValue{},
   250  	}
   251  
   252  	assert.Equal(t, expectedReadSet, cu.ReadSet, "Mismatched read set")
   253  
   254  	expectedWriteSet := &cb.ConfigGroup{
   255  		Version: original.Version,
   256  		Groups: map[string]*cb.ConfigGroup{
   257  			subGroupName: {
   258  				Version:  original.Groups[subGroupName].Version + 1,
   259  				Groups:   map[string]*cb.ConfigGroup{},
   260  				Policies: map[string]*cb.ConfigPolicy{},
   261  				Values:   map[string]*cb.ConfigValue{},
   262  			},
   263  		},
   264  		Policies: map[string]*cb.ConfigPolicy{},
   265  		Values:   map[string]*cb.ConfigValue{},
   266  	}
   267  
   268  	assert.Equal(t, expectedWriteSet, cu.WriteSet, "Mismatched write set")
   269  }
   270  
   271  func TestGroupValueAddition(t *testing.T) {
   272  
   273  	value1Name := "foo"
   274  	value2Name := "bar"
   275  	original := &cb.ConfigGroup{
   276  		Version: 7,
   277  		Values: map[string]*cb.ConfigValue{
   278  			value1Name: {
   279  				Version: 3,
   280  				Value:   []byte("value1value"),
   281  			},
   282  		},
   283  	}
   284  	updated := &cb.ConfigGroup{
   285  		Values: map[string]*cb.ConfigValue{
   286  			value1Name: original.Values[value1Name],
   287  			value2Name: {
   288  				Version: 9,
   289  				Value:   []byte("newValue2"),
   290  			},
   291  		},
   292  	}
   293  
   294  	cu, err := Compute(&cb.Config{
   295  		ChannelGroup: original,
   296  	}, &cb.Config{
   297  		ChannelGroup: updated,
   298  	})
   299  
   300  	assert.NoError(t, err)
   301  
   302  	expectedReadSet := &cb.ConfigGroup{
   303  		Version: original.Version,
   304  		Values: map[string]*cb.ConfigValue{
   305  			value1Name: {
   306  				Version: original.Values[value1Name].Version,
   307  			},
   308  		},
   309  		Policies: map[string]*cb.ConfigPolicy{},
   310  		Groups:   map[string]*cb.ConfigGroup{},
   311  	}
   312  
   313  	assert.Equal(t, expectedReadSet, cu.ReadSet, "Mismatched read set")
   314  
   315  	expectedWriteSet := &cb.ConfigGroup{
   316  		Version: original.Version + 1,
   317  		Values: map[string]*cb.ConfigValue{
   318  			value1Name: {
   319  				Version: original.Values[value1Name].Version,
   320  			},
   321  			value2Name: {
   322  				Value:   updated.Values[value2Name].Value,
   323  				Version: 0,
   324  			},
   325  		},
   326  		Policies: map[string]*cb.ConfigPolicy{},
   327  		Groups:   map[string]*cb.ConfigGroup{},
   328  	}
   329  
   330  	assert.Equal(t, expectedWriteSet, cu.WriteSet, "Mismatched write set")
   331  }
   332  
   333  func TestGroupPolicySwap(t *testing.T) {
   334  
   335  	policy1Name := "foo"
   336  	policy2Name := "bar"
   337  	original := &cb.ConfigGroup{
   338  		Version: 4,
   339  		Policies: map[string]*cb.ConfigPolicy{
   340  			policy1Name: {
   341  				Version: 2,
   342  				Policy: &cb.Policy{
   343  					Type: 3,
   344  				},
   345  			},
   346  		},
   347  	}
   348  	updated := &cb.ConfigGroup{
   349  		Policies: map[string]*cb.ConfigPolicy{
   350  			policy2Name: {
   351  				Version: 1,
   352  				Policy: &cb.Policy{
   353  					Type: 5,
   354  				},
   355  			},
   356  		},
   357  	}
   358  
   359  	cu, err := Compute(&cb.Config{
   360  		ChannelGroup: original,
   361  	}, &cb.Config{
   362  		ChannelGroup: updated,
   363  	})
   364  
   365  	assert.NoError(t, err)
   366  
   367  	expectedReadSet := &cb.ConfigGroup{
   368  		Version:  original.Version,
   369  		Policies: map[string]*cb.ConfigPolicy{},
   370  		Values:   map[string]*cb.ConfigValue{},
   371  		Groups:   map[string]*cb.ConfigGroup{},
   372  	}
   373  
   374  	assert.Equal(t, expectedReadSet, cu.ReadSet, "Mismatched read set")
   375  
   376  	expectedWriteSet := &cb.ConfigGroup{
   377  		Version: original.Version + 1,
   378  		Policies: map[string]*cb.ConfigPolicy{
   379  			policy2Name: {
   380  				Policy: &cb.Policy{
   381  					Type: updated.Policies[policy2Name].Policy.Type,
   382  				},
   383  				Version: 0,
   384  			},
   385  		},
   386  		Values: map[string]*cb.ConfigValue{},
   387  		Groups: map[string]*cb.ConfigGroup{},
   388  	}
   389  
   390  	assert.Equal(t, expectedWriteSet, cu.WriteSet, "Mismatched write set")
   391  }
   392  
   393  func TestComplex(t *testing.T) {
   394  
   395  	existingGroup1Name := "existingGroup1"
   396  	existingGroup2Name := "existingGroup2"
   397  	existingPolicyName := "existingPolicy"
   398  	original := &cb.ConfigGroup{
   399  		Version: 4,
   400  		Groups: map[string]*cb.ConfigGroup{
   401  			existingGroup1Name: {
   402  				Version: 2,
   403  			},
   404  			existingGroup2Name: {
   405  				Version: 2,
   406  			},
   407  		},
   408  		Policies: map[string]*cb.ConfigPolicy{
   409  			existingPolicyName: {
   410  				Version: 8,
   411  				Policy: &cb.Policy{
   412  					Type: 5,
   413  				},
   414  			},
   415  		},
   416  	}
   417  
   418  	newGroupName := "newGroup"
   419  	newPolicyName := "newPolicy"
   420  	newValueName := "newValue"
   421  	updated := &cb.ConfigGroup{
   422  		Groups: map[string]*cb.ConfigGroup{
   423  			existingGroup1Name: {},
   424  			newGroupName: {
   425  				Values: map[string]*cb.ConfigValue{
   426  					newValueName: {},
   427  				},
   428  			},
   429  		},
   430  		Policies: map[string]*cb.ConfigPolicy{
   431  			existingPolicyName: {
   432  				Policy: &cb.Policy{
   433  					Type: 5,
   434  				},
   435  			},
   436  			newPolicyName: {
   437  				Version: 6,
   438  				Policy: &cb.Policy{
   439  					Type: 5,
   440  				},
   441  			},
   442  		},
   443  	}
   444  
   445  	cu, err := Compute(&cb.Config{
   446  		ChannelGroup: original,
   447  	}, &cb.Config{
   448  		ChannelGroup: updated,
   449  	})
   450  
   451  	assert.NoError(t, err)
   452  
   453  	expectedReadSet := &cb.ConfigGroup{
   454  		Version: original.Version,
   455  		Policies: map[string]*cb.ConfigPolicy{
   456  			existingPolicyName: {
   457  				Version: original.Policies[existingPolicyName].Version,
   458  			},
   459  		},
   460  		Values: map[string]*cb.ConfigValue{},
   461  		Groups: map[string]*cb.ConfigGroup{
   462  			existingGroup1Name: {
   463  				Version: original.Groups[existingGroup1Name].Version,
   464  			},
   465  		},
   466  	}
   467  
   468  	assert.Equal(t, expectedReadSet, cu.ReadSet, "Mismatched read set")
   469  
   470  	expectedWriteSet := &cb.ConfigGroup{
   471  		Version: original.Version + 1,
   472  		Policies: map[string]*cb.ConfigPolicy{
   473  			existingPolicyName: {
   474  				Version: original.Policies[existingPolicyName].Version,
   475  			},
   476  			newPolicyName: {
   477  				Version: 0,
   478  				Policy: &cb.Policy{
   479  					Type: 5,
   480  				},
   481  			},
   482  		},
   483  		Groups: map[string]*cb.ConfigGroup{
   484  			existingGroup1Name: {
   485  				Version: original.Groups[existingGroup1Name].Version,
   486  			},
   487  			newGroupName: {
   488  				Version: 0,
   489  				Values: map[string]*cb.ConfigValue{
   490  					newValueName: {},
   491  				},
   492  				Policies: map[string]*cb.ConfigPolicy{},
   493  				Groups:   map[string]*cb.ConfigGroup{},
   494  			},
   495  		},
   496  		Values: map[string]*cb.ConfigValue{},
   497  	}
   498  
   499  	assert.Equal(t, expectedWriteSet, cu.WriteSet, "Mismatched write set")
   500  }
   501  
   502  func TestTwiceNestedModification(t *testing.T) {
   503  
   504  	subGroupName := "foo"
   505  	subSubGroupName := "bar"
   506  	valueName := "testValue"
   507  	original := &cb.ConfigGroup{
   508  		Groups: map[string]*cb.ConfigGroup{
   509  			subGroupName: {
   510  				Groups: map[string]*cb.ConfigGroup{
   511  					subSubGroupName: {
   512  						Values: map[string]*cb.ConfigValue{
   513  							valueName: {},
   514  						},
   515  					},
   516  				},
   517  			},
   518  		},
   519  	}
   520  	updated := &cb.ConfigGroup{
   521  		Groups: map[string]*cb.ConfigGroup{
   522  			subGroupName: {
   523  				Groups: map[string]*cb.ConfigGroup{
   524  					subSubGroupName: {
   525  						Values: map[string]*cb.ConfigValue{
   526  							valueName: {
   527  								ModPolicy: "new",
   528  							},
   529  						},
   530  					},
   531  				},
   532  			},
   533  		},
   534  	}
   535  
   536  	cu, err := Compute(&cb.Config{
   537  		ChannelGroup: original,
   538  	}, &cb.Config{
   539  		ChannelGroup: updated,
   540  	})
   541  
   542  	assert.NoError(t, err)
   543  
   544  	expectedReadSet := &cb.ConfigGroup{
   545  		Version: original.Version,
   546  		Groups: map[string]*cb.ConfigGroup{
   547  			subGroupName: {
   548  				Groups: map[string]*cb.ConfigGroup{
   549  					subSubGroupName: {
   550  						Policies: map[string]*cb.ConfigPolicy{},
   551  						Values:   map[string]*cb.ConfigValue{},
   552  						Groups:   map[string]*cb.ConfigGroup{},
   553  					},
   554  				},
   555  				Policies: map[string]*cb.ConfigPolicy{},
   556  				Values:   map[string]*cb.ConfigValue{},
   557  			},
   558  		},
   559  		Policies: map[string]*cb.ConfigPolicy{},
   560  		Values:   map[string]*cb.ConfigValue{},
   561  	}
   562  
   563  	assert.Equal(t, expectedReadSet, cu.ReadSet, "Mismatched read set")
   564  
   565  	expectedWriteSet := &cb.ConfigGroup{
   566  		Version: original.Version,
   567  		Groups: map[string]*cb.ConfigGroup{
   568  			subGroupName: {
   569  				Groups: map[string]*cb.ConfigGroup{
   570  					subSubGroupName: {
   571  						Values: map[string]*cb.ConfigValue{
   572  							valueName: {
   573  								Version:   original.Groups[subGroupName].Groups[subSubGroupName].Values[valueName].Version + 1,
   574  								ModPolicy: updated.Groups[subGroupName].Groups[subSubGroupName].Values[valueName].ModPolicy,
   575  							},
   576  						},
   577  						Policies: map[string]*cb.ConfigPolicy{},
   578  						Groups:   map[string]*cb.ConfigGroup{},
   579  					},
   580  				},
   581  				Policies: map[string]*cb.ConfigPolicy{},
   582  				Values:   map[string]*cb.ConfigValue{},
   583  			},
   584  		},
   585  		Policies: map[string]*cb.ConfigPolicy{},
   586  		Values:   map[string]*cb.ConfigValue{},
   587  	}
   588  
   589  	assert.Equal(t, expectedWriteSet, cu.WriteSet, "Mismatched write set")
   590  }