From 15ed9057574faf106ecb229cacf0f639b774fb25 Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Mon, 8 Feb 2021 18:50:40 +0300 Subject: [PATCH] manifest: add validity checks for Parameter Refs. #1699. --- pkg/smartcontract/manifest/parameter.go | 18 +++++++++++++++ pkg/smartcontract/manifest/parameter_test.go | 23 ++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/pkg/smartcontract/manifest/parameter.go b/pkg/smartcontract/manifest/parameter.go index 558d54d92..b12e55a7c 100644 --- a/pkg/smartcontract/manifest/parameter.go +++ b/pkg/smartcontract/manifest/parameter.go @@ -25,6 +25,18 @@ func NewParameter(name string, typ smartcontract.ParamType) Parameter { } } +// IsValid checks Parameter consistency and correctness. +func (p *Parameter) IsValid() error { + if p.Name == "" { + return errors.New("empty or absent name") + } + if p.Type == smartcontract.VoidType { + return errors.New("void parameter") + } + _, err := smartcontract.ConvertToParamType(int(p.Type)) + return err +} + // ToStackItem converts Parameter to stackitem.Item. func (p *Parameter) ToStackItem() stackitem.Item { return stackitem.NewStruct([]stackitem.Item{ @@ -60,6 +72,12 @@ func (p *Parameter) FromStackItem(item stackitem.Item) error { // AreValid checks all parameters for validity and consistency. func (p Parameters) AreValid() error { + for i := range p { + err := p[i].IsValid() + if err != nil { + return err + } + } if len(p) < 2 { return nil } diff --git a/pkg/smartcontract/manifest/parameter_test.go b/pkg/smartcontract/manifest/parameter_test.go index ada0d740f..9826e5f2a 100644 --- a/pkg/smartcontract/manifest/parameter_test.go +++ b/pkg/smartcontract/manifest/parameter_test.go @@ -9,6 +9,29 @@ import ( "github.com/stretchr/testify/require" ) +func TestParametersAreValid(t *testing.T) { + ps := Parameters{} + require.NoError(t, ps.AreValid()) // No parameters. + + ps = append(ps, Parameter{}) + require.Error(t, ps.AreValid()) + + ps[0].Name = "qwerty" + require.NoError(t, ps.AreValid()) + + ps[0].Type = 0x42 // Invalid type. + require.Error(t, ps.AreValid()) + + ps[0].Type = smartcontract.VoidType + require.Error(t, ps.AreValid()) + + ps[0].Type = smartcontract.BoolType + require.NoError(t, ps.AreValid()) + + ps = append(ps, Parameter{Name: "qwerty"}) + require.Error(t, ps.AreValid()) +} + func TestParameter_ToStackItemFromStackItem(t *testing.T) { p := &Parameter{ Name: "param",