github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/wasm/types/params_test.go (about)

     1  package types
     2  
     3  import (
     4  	"encoding/json"
     5  	"testing"
     6  
     7  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
     8  	codectypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec/types"
     9  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func TestValidateParams(t *testing.T) {
    15  	var (
    16  		anyAddress     sdk.AccAddress = make([]byte, ContractAddrLen)
    17  		invalidAddress                = "invalid address"
    18  	)
    19  
    20  	specs := map[string]struct {
    21  		src    Params
    22  		expErr bool
    23  	}{
    24  		"all good with defaults": {
    25  			src: DefaultParams(),
    26  		},
    27  		"all good with nobody": {
    28  			src: Params{
    29  				CodeUploadAccess:             AllowNobody,
    30  				InstantiateDefaultPermission: AccessTypeNobody,
    31  			},
    32  		},
    33  		"all good with everybody": {
    34  			src: Params{
    35  				CodeUploadAccess:             AllowEverybody,
    36  				InstantiateDefaultPermission: AccessTypeEverybody,
    37  			},
    38  		},
    39  		"all good with only address": {
    40  			src: Params{
    41  				CodeUploadAccess:             AccessTypeOnlyAddress.With(anyAddress),
    42  				InstantiateDefaultPermission: AccessTypeOnlyAddress,
    43  			},
    44  		},
    45  		"reject empty type in instantiate permission": {
    46  			src: Params{
    47  				CodeUploadAccess: AllowNobody,
    48  			},
    49  			expErr: true,
    50  		},
    51  		"reject unknown type in instantiate": {
    52  			src: Params{
    53  				CodeUploadAccess:             AllowNobody,
    54  				InstantiateDefaultPermission: 1111,
    55  			},
    56  			expErr: true,
    57  		},
    58  		"reject invalid address in only address": {
    59  			src: Params{
    60  				CodeUploadAccess:             AccessConfig{Permission: AccessTypeOnlyAddress, Address: invalidAddress},
    61  				InstantiateDefaultPermission: AccessTypeOnlyAddress,
    62  			},
    63  			expErr: true,
    64  		},
    65  		"reject CodeUploadAccess Everybody with obsolete address": {
    66  			src: Params{
    67  				CodeUploadAccess:             AccessConfig{Permission: AccessTypeEverybody, Address: anyAddress.String()},
    68  				InstantiateDefaultPermission: AccessTypeOnlyAddress,
    69  			},
    70  			expErr: true,
    71  		},
    72  		"reject CodeUploadAccess Nobody with obsolete address": {
    73  			src: Params{
    74  				CodeUploadAccess:             AccessConfig{Permission: AccessTypeNobody, Address: anyAddress.String()},
    75  				InstantiateDefaultPermission: AccessTypeOnlyAddress,
    76  			},
    77  			expErr: true,
    78  		},
    79  		"reject empty CodeUploadAccess": {
    80  			src: Params{
    81  				InstantiateDefaultPermission: AccessTypeOnlyAddress,
    82  			},
    83  			expErr: true,
    84  		},
    85  		"reject undefined permission in CodeUploadAccess": {
    86  			src: Params{
    87  				CodeUploadAccess:             AccessConfig{Permission: AccessTypeUnspecified},
    88  				InstantiateDefaultPermission: AccessTypeOnlyAddress,
    89  			},
    90  			expErr: true,
    91  		},
    92  	}
    93  	for msg, spec := range specs {
    94  		t.Run(msg, func(t *testing.T) {
    95  			err := spec.src.ValidateBasic()
    96  			if spec.expErr {
    97  				require.Error(t, err)
    98  			} else {
    99  				require.NoError(t, err)
   100  			}
   101  		})
   102  	}
   103  }
   104  
   105  func TestAccessTypeMarshalJson(t *testing.T) {
   106  	specs := map[string]struct {
   107  		src AccessType
   108  		exp string
   109  	}{
   110  		"Unspecified": {src: AccessTypeUnspecified, exp: `"Unspecified"`},
   111  		"Nobody":      {src: AccessTypeNobody, exp: `"Nobody"`},
   112  		"OnlyAddress": {src: AccessTypeOnlyAddress, exp: `"OnlyAddress"`},
   113  		"Everybody":   {src: AccessTypeEverybody, exp: `"Everybody"`},
   114  		"unknown":     {src: 999, exp: `"Unspecified"`},
   115  	}
   116  	for msg, spec := range specs {
   117  		t.Run(msg, func(t *testing.T) {
   118  			got, err := json.Marshal(spec.src)
   119  			require.NoError(t, err)
   120  			assert.Equal(t, []byte(spec.exp), got)
   121  		})
   122  	}
   123  }
   124  
   125  func TestAccessTypeUnmarshalJson(t *testing.T) {
   126  	specs := map[string]struct {
   127  		src string
   128  		exp AccessType
   129  	}{
   130  		"Unspecified": {src: `"Unspecified"`, exp: AccessTypeUnspecified},
   131  		"Nobody":      {src: `"Nobody"`, exp: AccessTypeNobody},
   132  		"OnlyAddress": {src: `"OnlyAddress"`, exp: AccessTypeOnlyAddress},
   133  		"Everybody":   {src: `"Everybody"`, exp: AccessTypeEverybody},
   134  		"unknown":     {src: `""`, exp: AccessTypeUnspecified},
   135  	}
   136  	for msg, spec := range specs {
   137  		t.Run(msg, func(t *testing.T) {
   138  			var got AccessType
   139  			err := json.Unmarshal([]byte(spec.src), &got)
   140  			require.NoError(t, err)
   141  			assert.Equal(t, spec.exp, got)
   142  		})
   143  	}
   144  }
   145  
   146  func TestParamsUnmarshalJson(t *testing.T) {
   147  	specs := map[string]struct {
   148  		src string
   149  		exp Params
   150  	}{
   151  		"defaults": {
   152  			src: `{"code_upload_access": {"permission": "Nobody"},
   153  				"instantiate_default_permission": "Everybody",
   154  				"use_contract_blocked_list":true,
   155  				"vmbridge_enable":false}`,
   156  			exp: DefaultParams(),
   157  		},
   158  	}
   159  	for msg, spec := range specs {
   160  		t.Run(msg, func(t *testing.T) {
   161  			var val Params
   162  			interfaceRegistry := codectypes.NewInterfaceRegistry()
   163  			marshaler := codec.NewProtoCodec(interfaceRegistry)
   164  
   165  			err := marshaler.UnmarshalJSON([]byte(spec.src), &val)
   166  			require.NoError(t, err)
   167  			assert.Equal(t, spec.exp, val)
   168  		})
   169  	}
   170  }