github.com/kaituanwang/hyperledger@v2.0.1+incompatible/common/configtx/util_test.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package configtx
     8  
     9  import (
    10  	"math/rand"
    11  	"testing"
    12  
    13  	cb "github.com/hyperledger/fabric-protos-go/common"
    14  	"github.com/hyperledger/fabric/protoutil"
    15  	"github.com/stretchr/testify/assert"
    16  )
    17  
    18  // TestValidConfigID checks that the constraints on channel IDs are enforced properly
    19  func TestValidConfigID(t *testing.T) {
    20  	acceptMsg := "Should have accepted valid config ID"
    21  	rejectMsg := "Should have rejected invalid config ID"
    22  
    23  	t.Run("ZeroLength", func(t *testing.T) {
    24  		if err := validateConfigID(""); err == nil {
    25  			t.Fatal(rejectMsg)
    26  		}
    27  	})
    28  
    29  	t.Run("LongerThanMaxAllowed", func(t *testing.T) {
    30  		if err := validateConfigID(randomAlphaString(MaxLength + 1)); err == nil {
    31  			t.Fatal(rejectMsg)
    32  		}
    33  	})
    34  
    35  	t.Run("HasIllegalName", func(t *testing.T) {
    36  		for illegalName := range illegalNames {
    37  			if err := validateConfigID(illegalName); err == nil {
    38  				t.Fatal(rejectMsg)
    39  			}
    40  		}
    41  	})
    42  
    43  	t.Run("ContainsIllegalCharacter", func(t *testing.T) {
    44  		if err := validateConfigID("foo_bar"); err == nil {
    45  			t.Fatal(rejectMsg)
    46  		}
    47  	})
    48  
    49  	t.Run("ValidName", func(t *testing.T) {
    50  		if err := validateConfigID("foo.bar"); err != nil {
    51  			t.Fatal(acceptMsg)
    52  		}
    53  	})
    54  }
    55  
    56  // TestValidChannelID checks that the constraints on channel IDs are enforced properly
    57  func TestValidChannelID(t *testing.T) {
    58  	acceptMsg := "Should have accepted valid channel ID"
    59  	rejectMsg := "Should have rejected invalid channel ID"
    60  
    61  	t.Run("ZeroLength", func(t *testing.T) {
    62  		if err := ValidateChannelID(""); err == nil {
    63  			t.Fatal(rejectMsg)
    64  		}
    65  	})
    66  
    67  	t.Run("LongerThanMaxAllowed", func(t *testing.T) {
    68  		if err := ValidateChannelID(randomLowerAlphaString(MaxLength + 1)); err == nil {
    69  			t.Fatal(rejectMsg)
    70  		}
    71  	})
    72  
    73  	t.Run("ContainsIllegalCharacter", func(t *testing.T) {
    74  		if err := ValidateChannelID("foo_bar"); err == nil {
    75  			t.Fatal(rejectMsg)
    76  		}
    77  	})
    78  
    79  	t.Run("StartsWithNumber", func(t *testing.T) {
    80  		if err := ValidateChannelID("8foo"); err == nil {
    81  			t.Fatal(rejectMsg)
    82  		}
    83  	})
    84  
    85  	t.Run("StartsWithDot", func(t *testing.T) {
    86  		if err := ValidateChannelID(".foo"); err == nil {
    87  			t.Fatal(rejectMsg)
    88  		}
    89  	})
    90  
    91  	t.Run("ValidName", func(t *testing.T) {
    92  		if err := ValidateChannelID("f-oo.bar"); err != nil {
    93  			t.Fatal(acceptMsg)
    94  		}
    95  	})
    96  }
    97  
    98  // Helper functions
    99  
   100  func randomLowerAlphaString(size int) string {
   101  	letters := []rune("abcdefghijklmnopqrstuvwxyz")
   102  	output := make([]rune, size)
   103  	for i := range output {
   104  		output[i] = letters[rand.Intn(len(letters))]
   105  	}
   106  	return string(output)
   107  }
   108  
   109  func randomAlphaString(size int) string {
   110  	letters := []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
   111  	output := make([]rune, size)
   112  	for i := range output {
   113  		output[i] = letters[rand.Intn(len(letters))]
   114  	}
   115  	return string(output)
   116  }
   117  
   118  func TestUnmarshalConfig(t *testing.T) {
   119  	goodConfigBytes := protoutil.MarshalOrPanic(&cb.Config{})
   120  	badConfigBytes := []byte("garbage")
   121  
   122  	t.Run("GoodUnmarshalNormal", func(t *testing.T) {
   123  		_, err := UnmarshalConfig(goodConfigBytes)
   124  		assert.NoError(t, err)
   125  	})
   126  
   127  	t.Run("GoodUnmarshalOrpanic", func(t *testing.T) {
   128  		assert.NotPanics(t, func() { UnmarshalConfigOrPanic(goodConfigBytes) })
   129  	})
   130  
   131  	t.Run("BadUnmarshalNormal", func(t *testing.T) {
   132  		_, err := UnmarshalConfig(badConfigBytes)
   133  		assert.Error(t, err)
   134  	})
   135  
   136  	t.Run("BadUnmarshalOrpanic", func(t *testing.T) {
   137  		assert.Panics(t, func() { UnmarshalConfigOrPanic(badConfigBytes) })
   138  	})
   139  }
   140  
   141  func TestUnmarshalConfigEnvelope(t *testing.T) {
   142  	goodConfigEnvelopeBytes := protoutil.MarshalOrPanic(&cb.ConfigEnvelope{})
   143  	badConfigEnvelopeBytes := []byte("garbage")
   144  
   145  	t.Run("GoodUnmarshalNormal", func(t *testing.T) {
   146  		_, err := UnmarshalConfigEnvelope(goodConfigEnvelopeBytes)
   147  		assert.NoError(t, err)
   148  	})
   149  
   150  	t.Run("GoodUnmarshalOrpanic", func(t *testing.T) {
   151  		assert.NotPanics(t, func() { UnmarshalConfigEnvelopeOrPanic(goodConfigEnvelopeBytes) })
   152  	})
   153  
   154  	t.Run("BadUnmarshalNormal", func(t *testing.T) {
   155  		_, err := UnmarshalConfigEnvelope(badConfigEnvelopeBytes)
   156  		assert.Error(t, err)
   157  	})
   158  
   159  	t.Run("BadUnmarshalOrpanic", func(t *testing.T) {
   160  		assert.Panics(t, func() { UnmarshalConfigEnvelopeOrPanic(badConfigEnvelopeBytes) })
   161  	})
   162  }
   163  
   164  func TestUnmarshalConfigUpdate(t *testing.T) {
   165  	goodConfigUpdateBytes := protoutil.MarshalOrPanic(&cb.ConfigUpdate{})
   166  	badConfigUpdateBytes := []byte("garbage")
   167  
   168  	t.Run("GoodUnmarshalNormal", func(t *testing.T) {
   169  		_, err := UnmarshalConfigUpdate(goodConfigUpdateBytes)
   170  		assert.NoError(t, err)
   171  	})
   172  
   173  	t.Run("GoodUnmarshalOrpanic", func(t *testing.T) {
   174  		assert.NotPanics(t, func() { UnmarshalConfigUpdateOrPanic(goodConfigUpdateBytes) })
   175  	})
   176  
   177  	t.Run("BadUnmarshalNormal", func(t *testing.T) {
   178  		_, err := UnmarshalConfigUpdate(badConfigUpdateBytes)
   179  		assert.Error(t, err)
   180  	})
   181  
   182  	t.Run("BadUnmarshalOrpanic", func(t *testing.T) {
   183  		assert.Panics(t, func() { UnmarshalConfigUpdateOrPanic(badConfigUpdateBytes) })
   184  	})
   185  }
   186  
   187  func TestUnmarshalConfigUpdateEnvelope(t *testing.T) {
   188  	goodConfigUpdateEnvelopeBytes := protoutil.MarshalOrPanic(&cb.ConfigUpdateEnvelope{})
   189  	badConfigUpdateEnvelopeBytes := []byte("garbage")
   190  
   191  	t.Run("GoodUnmarshalNormal", func(t *testing.T) {
   192  		_, err := UnmarshalConfigUpdateEnvelope(goodConfigUpdateEnvelopeBytes)
   193  		assert.NoError(t, err)
   194  	})
   195  
   196  	t.Run("GoodUnmarshalOrpanic", func(t *testing.T) {
   197  		assert.NotPanics(t, func() { UnmarshalConfigUpdateEnvelopeOrPanic(goodConfigUpdateEnvelopeBytes) })
   198  	})
   199  
   200  	t.Run("BadUnmarshalNormal", func(t *testing.T) {
   201  		_, err := UnmarshalConfigUpdateEnvelope(badConfigUpdateEnvelopeBytes)
   202  		assert.Error(t, err)
   203  	})
   204  
   205  	t.Run("BadUnmarshalOrpanic", func(t *testing.T) {
   206  		assert.Panics(t, func() { UnmarshalConfigUpdateEnvelopeOrPanic(badConfigUpdateEnvelopeBytes) })
   207  	})
   208  }