From a00325d069f68e900ed3b210049567666602851f Mon Sep 17 00:00:00 2001 From: Bartek Nowotarski Date: Fri, 1 Mar 2019 17:14:41 +0100 Subject: [PATCH 1/3] Return correct status for resubmitting old, failed transactions --- .../internal/actions_transaction_test.go | 11 ++++++++ .../horizon/internal/txsub/results/db/main.go | 11 ++++++++ .../internal/txsub/results/db/main_test.go | 28 ++++++++++++++++++- 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/services/horizon/internal/actions_transaction_test.go b/services/horizon/internal/actions_transaction_test.go index 9cc4ec2051..2b5b8b425f 100644 --- a/services/horizon/internal/actions_transaction_test.go +++ b/services/horizon/internal/actions_transaction_test.go @@ -192,3 +192,14 @@ func TestTransactionActions_Post(t *testing.T) { w = ht.Post("/transactions", form) ht.Assert.Equal(503, w.Code) } + +func TestTransactionActions_PostFailed(t *testing.T) { + ht := StartHTTPTest(t, "failed_transactions") + defer ht.Finish() + + // aa168f12124b7c196c0adaee7c73a64d37f99428cacb59a91ff389626845e7cf + form := url.Values{"tx": []string{"AAAAAG5oJtVdnYOVdZqtXpTHBtbcY0mCmfcBIKEgWnlvFIhaAAAAZAAAAAIAAAACAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAO2C/AO45YBD3tHVFO1R3A0MekP8JR6nN1A9eWidyItUAAAABVVNEAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAB3NZQAAAAAAAAAAAFvFIhaAAAAQKcGS9OsVnVHCVIH04C9ZKzzKYBRdCmy+Jwmzld7QcALOxZUcAgkuGfoSdvXpH38mNvrqQiaMsSNmTJWYRzHvgo="}} + + w := ht.Post("/transactions", form) + ht.Assert.Equal(400, w.Code) +} diff --git a/services/horizon/internal/txsub/results/db/main.go b/services/horizon/internal/txsub/results/db/main.go index 487682ffa3..fea998accb 100644 --- a/services/horizon/internal/txsub/results/db/main.go +++ b/services/horizon/internal/txsub/results/db/main.go @@ -65,7 +65,18 @@ func (rp *DB) ResultByHash(ctx context.Context, hash string) txsub.Result { } func txResultFromHistory(tx history.Transaction) txsub.Result { + var txResult xdr.TransactionResult + err := xdr.SafeUnmarshalBase64(tx.TxResult, &txResult) + if err == nil { + if txResult.Result.Code != xdr.TransactionResultCodeTxSuccess { + err = &txsub.FailedTransactionError{ + ResultXDR: tx.TxResult, + } + } + } + return txsub.Result{ + Err: err, Hash: tx.TransactionHash, LedgerSequence: tx.LedgerSequence, EnvelopeXDR: tx.TxEnvelope, diff --git a/services/horizon/internal/txsub/results/db/main_test.go b/services/horizon/internal/txsub/results/db/main_test.go index 0b56847a68..7665106d98 100644 --- a/services/horizon/internal/txsub/results/db/main_test.go +++ b/services/horizon/internal/txsub/results/db/main_test.go @@ -6,10 +6,11 @@ import ( "github.com/stellar/go/services/horizon/internal/db2/core" "github.com/stellar/go/services/horizon/internal/db2/history" "github.com/stellar/go/services/horizon/internal/test" + "github.com/stellar/go/services/horizon/internal/txsub" ) func TestResultProvider(t *testing.T) { - tt := test.Start(t).ScenarioWithoutHorizon("base") + tt := test.Start(t).Scenario("base") defer tt.Finish() rp := &DB{ @@ -25,3 +26,28 @@ func TestResultProvider(t *testing.T) { tt.Require.NoError(ret.Err) tt.Assert.Equal(hash, ret.Hash) } + +func TestResultFailed(t *testing.T) { + tt := test.Start(t).Scenario("failed_transactions") + defer tt.Finish() + + rp := &DB{ + Core: &core.Q{Session: tt.CoreSession()}, + History: &history.Q{Session: tt.HorizonSession()}, + } + + hash := "aa168f12124b7c196c0adaee7c73a64d37f99428cacb59a91ff389626845e7cf" + + // Ignore core db results + _, err := tt.CoreSession().ExecRaw( + `DELETE FROM txhistory WHERE txid = ?`, + hash, + ) + tt.Require.NoError(err) + + ret := rp.ResultByHash(tt.Ctx, hash) + + tt.Require.Error(ret.Err) + tt.Assert.Equal("AAAAAAAAAGT/////AAAAAQAAAAAAAAAB/////gAAAAA=", ret.Err.(*txsub.FailedTransactionError).ResultXDR) + tt.Assert.Equal(hash, ret.Hash) +} From 8123ce766c6e41bcfedf6d9f7d6a9ad51c905812 Mon Sep 17 00:00:00 2001 From: Bartek Nowotarski Date: Fri, 1 Mar 2019 17:20:06 +0100 Subject: [PATCH 2/3] Check response body --- services/horizon/internal/actions_transaction_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/horizon/internal/actions_transaction_test.go b/services/horizon/internal/actions_transaction_test.go index 2b5b8b425f..69d73dfe8d 100644 --- a/services/horizon/internal/actions_transaction_test.go +++ b/services/horizon/internal/actions_transaction_test.go @@ -202,4 +202,6 @@ func TestTransactionActions_PostFailed(t *testing.T) { w := ht.Post("/transactions", form) ht.Assert.Equal(400, w.Code) + ht.Assert.Contains(string(w.Body.Bytes()), "op_underfunded") + ht.Assert.Contains(string(w.Body.Bytes()), "AAAAAAAAAGT/////AAAAAQAAAAAAAAAB/////gAAAAA=") } From ddb411e2fe976c9e47cf3d912ed7fcee60b698fa Mon Sep 17 00:00:00 2001 From: Bartek Nowotarski Date: Fri, 1 Mar 2019 17:35:00 +0100 Subject: [PATCH 3/3] Full test for successful response --- .../horizon/internal/actions_transaction_test.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/services/horizon/internal/actions_transaction_test.go b/services/horizon/internal/actions_transaction_test.go index 69d73dfe8d..fa3fc01ac2 100644 --- a/services/horizon/internal/actions_transaction_test.go +++ b/services/horizon/internal/actions_transaction_test.go @@ -193,6 +193,18 @@ func TestTransactionActions_Post(t *testing.T) { ht.Assert.Equal(503, w.Code) } +func TestTransactionActions_PostSuccessful(t *testing.T) { + ht := StartHTTPTest(t, "failed_transactions") + defer ht.Finish() + + // 56e3216045d579bea40f2d35a09406de3a894ecb5be70dbda5ec9c0427a0d5a1 + form := url.Values{"tx": []string{"AAAAAK6jei3jmoI8TGlD/egc37PXtHKKzWV8wViZBaCu5L5MAAAAZAAAAAIAAAABAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAbmgm1V2dg5V1mq1elMcG1txjSYKZ9wEgoSBaeW8UiFoAAAABVVNEAAAAAACuo3ot45qCPExpQ/3oHN+z17Ryis1lfMFYmQWgruS+TAAAAAA7msoAAAAAAAAAAAGu5L5MAAAAQEnKDbDYvKkJjYK0arvhFln+GK0+7Ay6g0a+1hjRRelEAe4wmjeqNcRg2m4Cn7t4AjJzAsDQI0iXahGboJPINAw="}} + + w := ht.Post("/transactions", form) + ht.Assert.Equal(200, w.Code) + ht.Assert.Contains(string(w.Body.Bytes()), `"result_xdr": "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAA="`) +} + func TestTransactionActions_PostFailed(t *testing.T) { ht := StartHTTPTest(t, "failed_transactions") defer ht.Finish() @@ -203,5 +215,5 @@ func TestTransactionActions_PostFailed(t *testing.T) { w := ht.Post("/transactions", form) ht.Assert.Equal(400, w.Code) ht.Assert.Contains(string(w.Body.Bytes()), "op_underfunded") - ht.Assert.Contains(string(w.Body.Bytes()), "AAAAAAAAAGT/////AAAAAQAAAAAAAAAB/////gAAAAA=") + ht.Assert.Contains(string(w.Body.Bytes()), `"result_xdr": "AAAAAAAAAGT/////AAAAAQAAAAAAAAAB/////gAAAAA="`) }