From 800b180116adc3bc6ce461efcec9d280608cb63c Mon Sep 17 00:00:00 2001 From: Nathan Haim Date: Thu, 7 Nov 2024 12:29:59 +0100 Subject: [PATCH 1/4] chain: add test from un/marshal TransactionData + unmarshal Transaction --- chain/transaction_test.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/chain/transaction_test.go b/chain/transaction_test.go index 660695eab6..8ab3f841bf 100644 --- a/chain/transaction_test.go +++ b/chain/transaction_test.go @@ -173,6 +173,19 @@ func TestMarshalUnmarshal(t *testing.T) { err = actionCodec.Register(&action2{}, unmarshalAction2) require.NoError(err) + t.Run("TransactionData", func(_ *testing.T) { + writerPacker := codec.NewWriter(0, consts.NetworkSizeLimit) + err = tx.Marshal(writerPacker) + require.NoError(err) + txDataBytes, err := tx.UnsignedBytes() + require.NoError(err) + require.Equal(writerPacker.Bytes(), txDataBytes) + readerPacker := codec.NewReader(writerPacker.Bytes(), consts.NetworkSizeLimit) + unmarshaledTxData, err := chain.UnmarshalTxData(readerPacker, actionCodec) + require.NoError(err) + require.Equal(tx, *unmarshaledTxData) + }) + // call UnsignedBytes so that the "unsignedBytes" field would get populated. txBeforeSignBytes, err := tx.UnsignedBytes() require.NoError(err) @@ -200,6 +213,11 @@ func TestMarshalUnmarshal(t *testing.T) { require.Equal(unsignedTxBytes, originalUnsignedTxBytes) require.Len(unsignedTxBytes, 168) + + readerPacker := codec.NewReader(writerPacker.Bytes(), consts.NetworkSizeLimit) + unmarshaledTx, err := chain.UnmarshalTx(readerPacker, actionCodec, authCodec) + require.NoError(err) + require.Equal(writerPacker.Bytes(), unmarshaledTx.Bytes()) } func TestSignRawActionBytesTx(t *testing.T) { From 4cf4b14c3ae0fb032081dc438268311730c95b00 Mon Sep 17 00:00:00 2001 From: Nathan Haim Date: Thu, 7 Nov 2024 12:58:21 +0100 Subject: [PATCH 2/4] chain: rewrite transaction shorter transaction tests --- chain/transaction_test.go | 262 +++++++++++++++----------------------- 1 file changed, 105 insertions(+), 157 deletions(-) diff --git a/chain/transaction_test.go b/chain/transaction_test.go index 8ab3f841bf..442ec75b37 100644 --- a/chain/transaction_test.go +++ b/chain/transaction_test.go @@ -10,6 +10,7 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" "github.com/ava-labs/hypersdk/auth" "github.com/ava-labs/hypersdk/chain" @@ -26,171 +27,92 @@ var ( _ chain.Action = (*action2)(nil) ) -type abstractMockAction struct{} - -func (*abstractMockAction) ComputeUnits(chain.Rules) uint64 { - panic("unimplemented") -} - -func (*abstractMockAction) Execute(_ context.Context, _ chain.Rules, _ state.Mutable, _ int64, _ codec.Address, _ ids.ID) (codec.Typed, error) { - panic("unimplemented") -} - -func (*abstractMockAction) StateKeys(_ codec.Address, _ ids.ID) state.Keys { - panic("unimplemented") -} - -func (*abstractMockAction) ValidRange(chain.Rules) (start int64, end int64) { - panic("unimplemented") -} - -type mockTransferAction struct { - abstractMockAction - To codec.Address `serialize:"true" json:"to"` - Value uint64 `serialize:"true" json:"value"` - Memo []byte `serialize:"true" json:"memo"` -} - -func (*mockTransferAction) GetTypeID() uint8 { - return 111 +func TestTransactionTestSuite(t *testing.T) { + suite.Run(t, new(TransactionTestSuite)) } -type action2 struct { - abstractMockAction - A uint64 `serialize:"true" json:"a"` - B uint64 `serialize:"true" json:"b"` -} - -func (*action2) GetTypeID() uint8 { - return 222 -} - -func unmarshalTransfer(p *codec.Packer) (chain.Action, error) { - var transfer mockTransferAction - err := codec.LinearCodec.UnmarshalFrom(p.Packer, &transfer) - return &transfer, err -} +type TransactionTestSuite struct { + suite.Suite -func unmarshalAction2(p *codec.Packer) (chain.Action, error) { - var action action2 - err := codec.LinearCodec.UnmarshalFrom(p.Packer, &action) - return &action, err + privateKey ed25519.PrivateKey + factory *auth.ED25519Factory + actionCodec *codec.TypeParser[chain.Action] + authCodec *codec.TypeParser[chain.Auth] } -func TestJSONMarshalUnmarshal(t *testing.T) { - require := require.New(t) - - txData := chain.TransactionData{ - Base: &chain.Base{ - Timestamp: 1724315246000, - ChainID: [32]byte{1, 2, 3, 4, 5, 6, 7}, - MaxFee: 1234567, - }, - Actions: []chain.Action{ - &mockTransferAction{ - To: codec.Address{1, 2, 3, 4}, - Value: 4, - Memo: []byte("hello"), - }, - &mockTransferAction{ - To: codec.Address{4, 5, 6, 7}, - Value: 123, - Memo: []byte("world"), - }, - &action2{ - A: 2, - B: 4, - }, - }, - } - priv, err := ed25519.GeneratePrivateKey() +func (s *TransactionTestSuite) SetupTest() { + require := require.New(s.T()) + var err error + s.privateKey, err = ed25519.GeneratePrivateKey() require.NoError(err) - factory := auth.NewED25519Factory(priv) + s.factory = auth.NewED25519Factory(s.privateKey) - actionCodec := codec.NewTypeParser[chain.Action]() - authCodec := codec.NewTypeParser[chain.Auth]() - - err = actionCodec.Register(&mockTransferAction{}, unmarshalTransfer) + s.actionCodec = codec.NewTypeParser[chain.Action]() + s.authCodec = codec.NewTypeParser[chain.Auth]() + err = s.authCodec.Register(&auth.ED25519{}, auth.UnmarshalED25519) require.NoError(err) - err = actionCodec.Register(&action2{}, unmarshalAction2) + err = s.actionCodec.Register(&mockTransferAction{}, unmarshalTransfer) require.NoError(err) - err = authCodec.Register(&auth.ED25519{}, auth.UnmarshalED25519) + err = s.actionCodec.Register(&action2{}, unmarshalAction2) require.NoError(err) +} + +func (s *TransactionTestSuite) TestJSONMarshalUnmarshal() { + require := require.New(s.T()) + txData := getTransactionData() - signedTx, err := txData.Sign(factory) + signedTx, err := txData.Sign(s.factory) require.NoError(err) b, err := json.Marshal(signedTx) require.NoError(err) - - parser := chaintest.NewParser(nil, actionCodec, authCodec, nil) - + parser := chaintest.NewParser(nil, s.actionCodec, s.authCodec, nil) var txFromJSON chain.Transaction err = txFromJSON.UnmarshalJSON(b, parser) require.NoError(err) require.Equal(signedTx.Bytes(), txFromJSON.Bytes()) } -// TestMarshalUnmarshal roughly validates that a transaction packs and unpacks correctly -func TestMarshalUnmarshal(t *testing.T) { - require := require.New(t) - - tx := chain.TransactionData{ - Base: &chain.Base{ - Timestamp: 1724315246000, - ChainID: [32]byte{1, 2, 3, 4, 5, 6, 7}, - MaxFee: 1234567, - }, - Actions: []chain.Action{ - &mockTransferAction{ - To: codec.Address{1, 2, 3, 4}, - Value: 4, - Memo: []byte("hello"), - }, - &mockTransferAction{ - To: codec.Address{4, 5, 6, 7}, - Value: 123, - Memo: []byte("world"), - }, - &action2{ - A: 2, - B: 4, - }, - }, - } - - priv, err := ed25519.GeneratePrivateKey() +// TestMarshalUnmarshalTransactionData roughly validates that a transaction data packs and unpacks correctly. +func (s *TransactionTestSuite) TestMarshalUnmarshalTransactionData() { + require := require.New(s.T()) + tx := getTransactionData() + writerPacker := codec.NewWriter(0, consts.NetworkSizeLimit) + err := tx.Marshal(writerPacker) require.NoError(err) - factory := auth.NewED25519Factory(priv) - - actionCodec := codec.NewTypeParser[chain.Action]() - authCodec := codec.NewTypeParser[chain.Auth]() - - err = authCodec.Register(&auth.ED25519{}, auth.UnmarshalED25519) + txDataBytes, err := tx.UnsignedBytes() require.NoError(err) - err = actionCodec.Register(&mockTransferAction{}, unmarshalTransfer) + require.Equal(writerPacker.Bytes(), txDataBytes) + readerPacker := codec.NewReader(writerPacker.Bytes(), consts.NetworkSizeLimit) + unmarshaledTxData, err := chain.UnmarshalTxData(readerPacker, s.actionCodec) require.NoError(err) - err = actionCodec.Register(&action2{}, unmarshalAction2) + require.Equal(tx, *unmarshaledTxData) +} + +func (s *TransactionTestSuite) TestSignRawActionBytesTx() { + require := require.New(s.T()) + tx := getTransactionData() + + signedTx, err := tx.Sign(s.factory) require.NoError(err) - t.Run("TransactionData", func(_ *testing.T) { - writerPacker := codec.NewWriter(0, consts.NetworkSizeLimit) - err = tx.Marshal(writerPacker) - require.NoError(err) - txDataBytes, err := tx.UnsignedBytes() - require.NoError(err) - require.Equal(writerPacker.Bytes(), txDataBytes) - readerPacker := codec.NewReader(writerPacker.Bytes(), consts.NetworkSizeLimit) - unmarshaledTxData, err := chain.UnmarshalTxData(readerPacker, actionCodec) - require.NoError(err) - require.Equal(tx, *unmarshaledTxData) - }) + p := codec.NewWriter(0, consts.NetworkSizeLimit) + require.NoError(signedTx.Actions.MarshalInto(p)) + actionsBytes := p.Bytes() + rawSignedTxBytes, err := chain.SignRawActionBytesTx(tx.Base, actionsBytes, s.factory) + require.NoError(err) + require.Equal(signedTx.Bytes(), rawSignedTxBytes) +} +// TestMarshalUnmarshalTransaction roughly validates that a transaction packs and unpacks correctly. +func (s *TransactionTestSuite) TestMarshalUnmarshalTransaction() { + require := require.New(s.T()) + tx := getTransactionData() // call UnsignedBytes so that the "unsignedBytes" field would get populated. txBeforeSignBytes, err := tx.UnsignedBytes() require.NoError(err) - signedTx, err := tx.Sign(factory) + signedTx, err := tx.Sign(s.factory) require.NoError(err) unsignedTxAfterSignBytes, err := signedTx.TransactionData.UnsignedBytes() require.NoError(err) @@ -215,14 +137,13 @@ func TestMarshalUnmarshal(t *testing.T) { require.Len(unsignedTxBytes, 168) readerPacker := codec.NewReader(writerPacker.Bytes(), consts.NetworkSizeLimit) - unmarshaledTx, err := chain.UnmarshalTx(readerPacker, actionCodec, authCodec) + unmarshaledTx, err := chain.UnmarshalTx(readerPacker, s.actionCodec, s.authCodec) require.NoError(err) require.Equal(writerPacker.Bytes(), unmarshaledTx.Bytes()) } -func TestSignRawActionBytesTx(t *testing.T) { - require := require.New(t) - tx := chain.TransactionData{ +func getTransactionData() chain.TransactionData { + return chain.TransactionData{ Base: &chain.Base{ Timestamp: 1724315246000, ChainID: [32]byte{1, 2, 3, 4, 5, 6, 7}, @@ -245,28 +166,55 @@ func TestSignRawActionBytesTx(t *testing.T) { }, }, } +} - priv, err := ed25519.GeneratePrivateKey() - require.NoError(err) - factory := auth.NewED25519Factory(priv) +type abstractMockAction struct{} - actionCodec := codec.NewTypeParser[chain.Action]() - authCodec := codec.NewTypeParser[chain.Auth]() +func (*abstractMockAction) ComputeUnits(chain.Rules) uint64 { + panic("unimplemented") +} - err = authCodec.Register(&auth.ED25519{}, auth.UnmarshalED25519) - require.NoError(err) - err = actionCodec.Register(&mockTransferAction{}, unmarshalTransfer) - require.NoError(err) - err = actionCodec.Register(&action2{}, unmarshalAction2) - require.NoError(err) +func (*abstractMockAction) Execute(_ context.Context, _ chain.Rules, _ state.Mutable, _ int64, _ codec.Address, _ ids.ID) (codec.Typed, error) { + panic("unimplemented") +} - signedTx, err := tx.Sign(factory) - require.NoError(err) +func (*abstractMockAction) StateKeys(_ codec.Address, _ ids.ID) state.Keys { + panic("unimplemented") +} - p := codec.NewWriter(0, consts.NetworkSizeLimit) - require.NoError(signedTx.Actions.MarshalInto(p)) - actionsBytes := p.Bytes() - rawSignedTxBytes, err := chain.SignRawActionBytesTx(tx.Base, actionsBytes, factory) - require.NoError(err) - require.Equal(signedTx.Bytes(), rawSignedTxBytes) +func (*abstractMockAction) ValidRange(chain.Rules) (start int64, end int64) { + panic("unimplemented") +} + +type mockTransferAction struct { + abstractMockAction + To codec.Address `serialize:"true" json:"to"` + Value uint64 `serialize:"true" json:"value"` + Memo []byte `serialize:"true" json:"memo"` +} + +func (*mockTransferAction) GetTypeID() uint8 { + return 111 +} + +type action2 struct { + abstractMockAction + A uint64 `serialize:"true" json:"a"` + B uint64 `serialize:"true" json:"b"` +} + +func (*action2) GetTypeID() uint8 { + return 222 +} + +func unmarshalTransfer(p *codec.Packer) (chain.Action, error) { + var transfer mockTransferAction + err := codec.LinearCodec.UnmarshalFrom(p.Packer, &transfer) + return &transfer, err +} + +func unmarshalAction2(p *codec.Packer) (chain.Action, error) { + var action action2 + err := codec.LinearCodec.UnmarshalFrom(p.Packer, &action) + return &action, err } From 11a5d036f12657d7418123c200374396d68abc72 Mon Sep 17 00:00:00 2001 From: Nathan Haim Date: Thu, 7 Nov 2024 17:05:27 +0100 Subject: [PATCH 3/4] chain: extract transaction sign test into another test --- chain/transaction_test.go | 58 ++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/chain/transaction_test.go b/chain/transaction_test.go index 442ec75b37..c8243b9f20 100644 --- a/chain/transaction_test.go +++ b/chain/transaction_test.go @@ -59,9 +59,9 @@ func (s *TransactionTestSuite) SetupTest() { func (s *TransactionTestSuite) TestJSONMarshalUnmarshal() { require := require.New(s.T()) - txData := getTransactionData() + tx := getTransactionData() - signedTx, err := txData.Sign(s.factory) + signedTx, err := tx.Sign(s.factory) require.NoError(err) b, err := json.Marshal(signedTx) @@ -89,26 +89,36 @@ func (s *TransactionTestSuite) TestMarshalUnmarshalTransactionData() { require.Equal(tx, *unmarshaledTxData) } -func (s *TransactionTestSuite) TestSignRawActionBytesTx() { +// TestMarshalUnmarshalTransaction roughly validates that a transaction packs and unpacks correctly. +func (s *TransactionTestSuite) TestMarshalUnmarshalTransaction() { require := require.New(s.T()) tx := getTransactionData() + // call UnsignedBytes so that the "unsignedBytes" field would get populated. + originalUnsignedTxBytes, err := tx.UnsignedBytes() + require.NoError(err) signedTx, err := tx.Sign(s.factory) require.NoError(err) + writerPacker := codec.NewWriter(0, consts.NetworkSizeLimit) + err = signedTx.Marshal(writerPacker) + require.NoError(err) + require.Equal(signedTx.ID(), utils.ToID(writerPacker.Bytes())) + require.Equal(signedTx.Bytes(), writerPacker.Bytes()) + unsignedTxBytes, err := signedTx.UnsignedBytes() + require.NoError(err) + require.Equal(unsignedTxBytes, originalUnsignedTxBytes) + require.Len(unsignedTxBytes, 168) - p := codec.NewWriter(0, consts.NetworkSizeLimit) - require.NoError(signedTx.Actions.MarshalInto(p)) - actionsBytes := p.Bytes() - rawSignedTxBytes, err := chain.SignRawActionBytesTx(tx.Base, actionsBytes, s.factory) + readerPacker := codec.NewReader(writerPacker.Bytes(), consts.NetworkSizeLimit) + unmarshaledTx, err := chain.UnmarshalTx(readerPacker, s.actionCodec, s.authCodec) require.NoError(err) - require.Equal(signedTx.Bytes(), rawSignedTxBytes) + require.Equal(writerPacker.Bytes(), unmarshaledTx.Bytes()) } -// TestMarshalUnmarshalTransaction roughly validates that a transaction packs and unpacks correctly. -func (s *TransactionTestSuite) TestMarshalUnmarshalTransaction() { +func (s *TransactionTestSuite) TestSign() { require := require.New(s.T()) tx := getTransactionData() - // call UnsignedBytes so that the "unsignedBytes" field would get populated. + txBeforeSignBytes, err := tx.UnsignedBytes() require.NoError(err) @@ -122,26 +132,24 @@ func (s *TransactionTestSuite) TestMarshalUnmarshalTransaction() { for i, action := range signedTx.Actions { require.Equal(tx.Actions[i], action) } - writerPacker := codec.NewWriter(0, consts.NetworkSizeLimit) - err = signedTx.Marshal(writerPacker) - require.NoError(err) - require.Equal(signedTx.ID(), utils.ToID(writerPacker.Bytes())) - require.Equal(signedTx.Bytes(), writerPacker.Bytes()) +} - unsignedTxBytes, err := signedTx.UnsignedBytes() - require.NoError(err) - originalUnsignedTxBytes, err := tx.UnsignedBytes() - require.NoError(err) +func (s *TransactionTestSuite) TestSignRawActionBytesTx() { + require := require.New(s.T()) + tx := getTransactionData() - require.Equal(unsignedTxBytes, originalUnsignedTxBytes) - require.Len(unsignedTxBytes, 168) + signedTx, err := tx.Sign(s.factory) + require.NoError(err) - readerPacker := codec.NewReader(writerPacker.Bytes(), consts.NetworkSizeLimit) - unmarshaledTx, err := chain.UnmarshalTx(readerPacker, s.actionCodec, s.authCodec) + p := codec.NewWriter(0, consts.NetworkSizeLimit) + require.NoError(signedTx.Actions.MarshalInto(p)) + actionsBytes := p.Bytes() + rawSignedTxBytes, err := chain.SignRawActionBytesTx(tx.Base, actionsBytes, s.factory) require.NoError(err) - require.Equal(writerPacker.Bytes(), unmarshaledTx.Bytes()) + require.Equal(signedTx.Bytes(), rawSignedTxBytes) } +// getTransactionData returns a default TransactionData struct used by the tests. func getTransactionData() chain.TransactionData { return chain.TransactionData{ Base: &chain.Base{ From 74632a1af81400c74f3bc4bda8b99c8c674bd9e3 Mon Sep 17 00:00:00 2001 From: Nathan Haim Date: Wed, 20 Nov 2024 22:40:01 +0100 Subject: [PATCH 4/4] chain: remove testify suite and used setup helper function instead --- chain/transaction_test.go | 97 +++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 49 deletions(-) diff --git a/chain/transaction_test.go b/chain/transaction_test.go index c8243b9f20..886a719803 100644 --- a/chain/transaction_test.go +++ b/chain/transaction_test.go @@ -10,7 +10,6 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/stretchr/testify/require" - "github.com/stretchr/testify/suite" "github.com/ava-labs/hypersdk/auth" "github.com/ava-labs/hypersdk/chain" @@ -27,46 +26,17 @@ var ( _ chain.Action = (*action2)(nil) ) -func TestTransactionTestSuite(t *testing.T) { - suite.Run(t, new(TransactionTestSuite)) -} - -type TransactionTestSuite struct { - suite.Suite - - privateKey ed25519.PrivateKey - factory *auth.ED25519Factory - actionCodec *codec.TypeParser[chain.Action] - authCodec *codec.TypeParser[chain.Auth] -} - -func (s *TransactionTestSuite) SetupTest() { - require := require.New(s.T()) - var err error - s.privateKey, err = ed25519.GeneratePrivateKey() - require.NoError(err) - s.factory = auth.NewED25519Factory(s.privateKey) - - s.actionCodec = codec.NewTypeParser[chain.Action]() - s.authCodec = codec.NewTypeParser[chain.Auth]() - err = s.authCodec.Register(&auth.ED25519{}, auth.UnmarshalED25519) - require.NoError(err) - err = s.actionCodec.Register(&mockTransferAction{}, unmarshalTransfer) - require.NoError(err) - err = s.actionCodec.Register(&action2{}, unmarshalAction2) - require.NoError(err) -} - -func (s *TransactionTestSuite) TestJSONMarshalUnmarshal() { - require := require.New(s.T()) +func TestJSONMarshalUnmarshalTransaction(t *testing.T) { + require := require.New(t) + testData := setupTransactionTest(require) tx := getTransactionData() - signedTx, err := tx.Sign(s.factory) + signedTx, err := tx.Sign(testData.factory) require.NoError(err) b, err := json.Marshal(signedTx) require.NoError(err) - parser := chaintest.NewParser(nil, s.actionCodec, s.authCodec, nil) + parser := chaintest.NewParser(nil, testData.actionCodec, testData.authCodec, nil) var txFromJSON chain.Transaction err = txFromJSON.UnmarshalJSON(b, parser) require.NoError(err) @@ -74,8 +44,9 @@ func (s *TransactionTestSuite) TestJSONMarshalUnmarshal() { } // TestMarshalUnmarshalTransactionData roughly validates that a transaction data packs and unpacks correctly. -func (s *TransactionTestSuite) TestMarshalUnmarshalTransactionData() { - require := require.New(s.T()) +func TestMarshalUnmarshalTransactionData(t *testing.T) { + require := require.New(t) + testData := setupTransactionTest(require) tx := getTransactionData() writerPacker := codec.NewWriter(0, consts.NetworkSizeLimit) err := tx.Marshal(writerPacker) @@ -84,20 +55,21 @@ func (s *TransactionTestSuite) TestMarshalUnmarshalTransactionData() { require.NoError(err) require.Equal(writerPacker.Bytes(), txDataBytes) readerPacker := codec.NewReader(writerPacker.Bytes(), consts.NetworkSizeLimit) - unmarshaledTxData, err := chain.UnmarshalTxData(readerPacker, s.actionCodec) + unmarshaledTxData, err := chain.UnmarshalTxData(readerPacker, testData.actionCodec) require.NoError(err) require.Equal(tx, *unmarshaledTxData) } // TestMarshalUnmarshalTransaction roughly validates that a transaction packs and unpacks correctly. -func (s *TransactionTestSuite) TestMarshalUnmarshalTransaction() { - require := require.New(s.T()) +func TestMarshalUnmarshalTransaction(t *testing.T) { + require := require.New(t) + testData := setupTransactionTest(require) tx := getTransactionData() // call UnsignedBytes so that the "unsignedBytes" field would get populated. originalUnsignedTxBytes, err := tx.UnsignedBytes() require.NoError(err) - signedTx, err := tx.Sign(s.factory) + signedTx, err := tx.Sign(testData.factory) require.NoError(err) writerPacker := codec.NewWriter(0, consts.NetworkSizeLimit) err = signedTx.Marshal(writerPacker) @@ -110,19 +82,20 @@ func (s *TransactionTestSuite) TestMarshalUnmarshalTransaction() { require.Len(unsignedTxBytes, 168) readerPacker := codec.NewReader(writerPacker.Bytes(), consts.NetworkSizeLimit) - unmarshaledTx, err := chain.UnmarshalTx(readerPacker, s.actionCodec, s.authCodec) + unmarshaledTx, err := chain.UnmarshalTx(readerPacker, testData.actionCodec, testData.authCodec) require.NoError(err) require.Equal(writerPacker.Bytes(), unmarshaledTx.Bytes()) } -func (s *TransactionTestSuite) TestSign() { - require := require.New(s.T()) +func TestSignTransaction(t *testing.T) { + require := require.New(t) + testData := setupTransactionTest(require) tx := getTransactionData() txBeforeSignBytes, err := tx.UnsignedBytes() require.NoError(err) - signedTx, err := tx.Sign(s.factory) + signedTx, err := tx.Sign(testData.factory) require.NoError(err) unsignedTxAfterSignBytes, err := signedTx.TransactionData.UnsignedBytes() require.NoError(err) @@ -134,21 +107,47 @@ func (s *TransactionTestSuite) TestSign() { } } -func (s *TransactionTestSuite) TestSignRawActionBytesTx() { - require := require.New(s.T()) +func TestSignRawActionBytesTx(t *testing.T) { + require := require.New(t) + testData := setupTransactionTest(require) tx := getTransactionData() - signedTx, err := tx.Sign(s.factory) + signedTx, err := tx.Sign(testData.factory) require.NoError(err) p := codec.NewWriter(0, consts.NetworkSizeLimit) require.NoError(signedTx.Actions.MarshalInto(p)) actionsBytes := p.Bytes() - rawSignedTxBytes, err := chain.SignRawActionBytesTx(tx.Base, actionsBytes, s.factory) + rawSignedTxBytes, err := chain.SignRawActionBytesTx(tx.Base, actionsBytes, testData.factory) require.NoError(err) require.Equal(signedTx.Bytes(), rawSignedTxBytes) } +type transactionTestData struct { + privateKey ed25519.PrivateKey + factory *auth.ED25519Factory + actionCodec *codec.TypeParser[chain.Action] + authCodec *codec.TypeParser[chain.Auth] +} + +func setupTransactionTest(require *require.Assertions) transactionTestData { + var err error + testData := transactionTestData{} + testData.privateKey, err = ed25519.GeneratePrivateKey() + require.NoError(err) + testData.factory = auth.NewED25519Factory(testData.privateKey) + + testData.actionCodec = codec.NewTypeParser[chain.Action]() + testData.authCodec = codec.NewTypeParser[chain.Auth]() + err = testData.authCodec.Register(&auth.ED25519{}, auth.UnmarshalED25519) + require.NoError(err) + err = testData.actionCodec.Register(&mockTransferAction{}, unmarshalTransfer) + require.NoError(err) + err = testData.actionCodec.Register(&action2{}, unmarshalAction2) + require.NoError(err) + return testData +} + // getTransactionData returns a default TransactionData struct used by the tests. func getTransactionData() chain.TransactionData { return chain.TransactionData{