diff --git a/pkg/morph/event/reputation/put.go b/pkg/morph/event/reputation/put.go new file mode 100644 index 000000000..89b761090 --- /dev/null +++ b/pkg/morph/event/reputation/put.go @@ -0,0 +1,68 @@ +package reputation + +import ( + "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" + "github.com/nspcc-dev/neofs-node/pkg/morph/client" + "github.com/nspcc-dev/neofs-node/pkg/morph/event" + "github.com/nspcc-dev/neofs-node/pkg/services/reputation" + "github.com/pkg/errors" +) + +// Put structure of reputation.reputationPut notification from +// morph chain. +type Put struct { + epoch uint64 + peerID reputation.PeerID + value []byte +} + +// MorphEvent implements Neo:Morph Event interface. +func (Put) MorphEvent() {} + +// Epoch returns epoch value of reputation data. +func (p Put) Epoch() uint64 { + return p.epoch +} + +// PeerID returns peer id of reputation data. +func (p Put) PeerID() reputation.PeerID { + return p.peerID +} + +// Value returns reputation structure. +func (p Put) Value() []byte { + return p.value // consider returning parsed structure +} + +// ParsePut from notification into reputation event structure. +func ParsePut(prms []stackitem.Item) (event.Event, error) { + var ( + ev Put + err error + ) + + if ln := len(prms); ln != 3 { + return nil, event.WrongNumberOfParameters(3, ln) + } + + epoch, err := client.IntFromStackItem(prms[0]) + if err != nil { + return nil, errors.Wrap(err, "could not get integer epoch number") + } + + ev.epoch = uint64(epoch) + + peerID, err := client.BytesFromStackItem(prms[1]) + if err != nil { + return nil, errors.Wrap(err, "could not get peer ID value") + } + + ev.peerID = reputation.PeerIDFromBytes(peerID) + + ev.value, err = client.BytesFromStackItem(prms[2]) + if err != nil { + return nil, errors.Wrap(err, "could not get reputation value") + } + + return ev, nil +} diff --git a/pkg/morph/event/reputation/put_test.go b/pkg/morph/event/reputation/put_test.go new file mode 100644 index 000000000..9856f0bdb --- /dev/null +++ b/pkg/morph/event/reputation/put_test.go @@ -0,0 +1,72 @@ +package reputation + +import ( + "math/big" + "testing" + + "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" + "github.com/nspcc-dev/neofs-node/pkg/morph/event" + "github.com/nspcc-dev/neofs-node/pkg/services/reputation" + "github.com/stretchr/testify/require" +) + +func TestParsePut(t *testing.T) { + var ( + epoch uint64 = 42 + + peerID = reputation.PeerIDFromBytes([]byte("peerID")) + value = []byte("There should be marshalled structure") + ) + + t.Run("wrong number of parameters", func(t *testing.T) { + prms := []stackitem.Item{ + stackitem.NewMap(), + stackitem.NewMap(), + } + + _, err := ParsePut(prms) + require.EqualError(t, err, event.WrongNumberOfParameters(3, len(prms)).Error()) + }) + + t.Run("wrong epoch parameter", func(t *testing.T) { + _, err := ParsePut([]stackitem.Item{ + stackitem.NewMap(), + }) + + require.Error(t, err) + }) + + t.Run("wrong peerID parameter", func(t *testing.T) { + _, err := ParsePut([]stackitem.Item{ + stackitem.NewBigInteger(new(big.Int).SetUint64(epoch)), + stackitem.NewMap(), + }) + + require.Error(t, err) + }) + + t.Run("wrong value parameter", func(t *testing.T) { + _, err := ParsePut([]stackitem.Item{ + stackitem.NewBigInteger(new(big.Int).SetUint64(epoch)), + stackitem.NewByteArray(peerID.Bytes()), + stackitem.NewMap(), + }) + + require.Error(t, err) + }) + + t.Run("correct behavior", func(t *testing.T) { + ev, err := ParsePut([]stackitem.Item{ + stackitem.NewBigInteger(new(big.Int).SetUint64(epoch)), + stackitem.NewByteArray(peerID.Bytes()), + stackitem.NewByteArray(value), + }) + require.NoError(t, err) + + require.Equal(t, Put{ + epoch: epoch, + peerID: peerID, + value: value, + }, ev) + }) +}