Skip to content

Commit

Permalink
Fix transaction summary for transactions that fail with remoteError
Browse files Browse the repository at this point in the history
  • Loading branch information
wltsmrz committed May 14, 2015
1 parent e66978f commit 0a9b0e6
Show file tree
Hide file tree
Showing 3 changed files with 162 additions and 39 deletions.
14 changes: 9 additions & 5 deletions src/transaction.js
Original file line number Diff line number Diff line change
Expand Up @@ -1211,8 +1211,9 @@ Transaction.prototype.abort = function() {
* @return {Object} transaction summary
*/

Transaction.prototype.getSummary =
Transaction.prototype.summary = function() {
var result = {
var txSummary = {
tx_json: this.tx_json,
clientID: this._clientID,
submittedIDs: this.submittedIDs,
Expand All @@ -1221,21 +1222,24 @@ Transaction.prototype.summary = function() {
initialSubmitIndex: this.initialSubmitIndex,
lastLedgerSequence: this.lastLedgerSequence,
state: this.state,
server: this._server ? this._server._opts.url : undefined,
finalized: this.finalized
};

if (this.result) {
result.result = {
txSummary.result = {
engine_result: this.result.engine_result,
engine_result_message: this.result.engine_result_message,
ledger_hash: this.result.ledger_hash,
ledger_index: this.result.ledger_index,
transaction_hash: this.result.tx_json.hash
transaction_hash: undefined
};

if (this.result.tx_json) {
txSummary.result.transaction_hash = this.result.tx_json.hash;
}
}

return result;
return txSummary;
};

exports.Transaction = Transaction;
Expand Down
78 changes: 45 additions & 33 deletions test/fixtures/transactionmanager.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,24 +56,24 @@
"meta": {
"AffectedNodes": [
{
"ModifiedNode": {
"FinalFields": {
"Account": "rNP2Y5EZrVZdFKsow11NoKTE5FjXuBQd3d",
"Balance": "1000",
"Flags": 4849664,
"OwnerCount": 1,
"Sequence": 1
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "A4B28FB972EF890DC39A8557DF8960D41DADA00D39B0F1EFCD4BBB85FCA13A30",
"PreviousFields": {
"Balance": "1000",
"Sequence": 3864
},
"PreviousTxnID": "F4910E55A39C42AB82071212D84119631DDE0B0F4F8F9040F252B0066898DBDF",
"PreviousTxnLgrSeq": 11693103
}
"ModifiedNode": {
"FinalFields": {
"Account": "rNP2Y5EZrVZdFKsow11NoKTE5FjXuBQd3d",
"Balance": "1000",
"Flags": 4849664,
"OwnerCount": 1,
"Sequence": 1
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "A4B28FB972EF890DC39A8557DF8960D41DADA00D39B0F1EFCD4BBB85FCA13A30",
"PreviousFields": {
"Balance": "1000",
"Sequence": 3864
},
"PreviousTxnID": "F4910E55A39C42AB82071212D84119631DDE0B0F4F8F9040F252B0066898DBDF",
"PreviousTxnLgrSeq": 11693103
}
}
],
"TransactionIndex": 9,
"TransactionResult": "tesSUCCESS"
Expand Down Expand Up @@ -101,24 +101,24 @@
"TransactionIndex": 3,
"AffectedNodes": [
{
"ModifiedNode": {
"LedgerEntryType": "AccountRoot",
"PreviousTxnLgrSeq": 11693103,
"PreviousTxnID": "F4910E55A39C42AB82071212D84119631DDE0B0F4F8F9040F252B0066898DBDF",
"LedgerIndex": "A4B28FB972EF890DC39A8557DF8960D41DADA00D39B0F1EFCD4BBB85FCA13A30",
"PreviousFields": {
"Sequence": 3864,
"Balance": "1000"
},
"FinalFields": {
"Flags": 4849664,
"Sequence": 3865,
"OwnerCount": 1,
"Balance": "1000",
"Account": "rNP2Y5EZrVZdFKsow11NoKTE5FjXuBQd3d"
}
"ModifiedNode": {
"LedgerEntryType": "AccountRoot",
"PreviousTxnLgrSeq": 11693103,
"PreviousTxnID": "F4910E55A39C42AB82071212D84119631DDE0B0F4F8F9040F252B0066898DBDF",
"LedgerIndex": "A4B28FB972EF890DC39A8557DF8960D41DADA00D39B0F1EFCD4BBB85FCA13A30",
"PreviousFields": {
"Sequence": 3864,
"Balance": "1000"
},
"FinalFields": {
"Flags": 4849664,
"Sequence": 3865,
"OwnerCount": 1,
"Balance": "1000",
"Account": "rNP2Y5EZrVZdFKsow11NoKTE5FjXuBQd3d"
}
}
}
],
"TransactionResult": "tesSUCCESS"
},
Expand Down Expand Up @@ -290,5 +290,17 @@
},
"status": "success",
"type": "response"
},
"SUBMIT_REMOTE_ERROR": {
"error": "invalidTransaction",
"error_exception": "fails local checks: The MemoType and MemoFormat fields may only contain characters that are allowed in URLs under RFC 3986.",
"id": 1,
"request": {
"command": "submit",
"id": 1,
"tx_blob": "12000022800000002400000001201B00CCEAD0614000000000000001684000000000002EE0732102999FB4BC17144F83CDC2F17EA642519FF115EE7B0CC8C78DE9061F1A473F7BAC7447304502210098DC7E9ED1CE860FB6B0904E6E8140D5463D288BA633F36E69A68ACB3D6FCA06022014E76E22F5173B37239F9F56F904839B462F5019169C56A324D3F074FBA39A2A811492DECA2DC92352BE97C1F6347F7E6CCB9A8241C883143108B9AC27BF036EFE5CBE787921F54D622B7A5BF9EA7C0B6D79206D656D6F747970657E0C6D79206D656D6F5F64617461E1F1"
},
"status": "error",
"type": "response"
}
}
109 changes: 108 additions & 1 deletion test/transaction-manager-test.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
/* eslint-disable max-len */
/* eslint-disable comma-spacing */

'use strict';

var ws = require('ws');
Expand Down Expand Up @@ -34,6 +37,8 @@ var SUBMIT_TEF_RESPONSE = require('./fixtures/transactionmanager')
.SUBMIT_TEF_RESPONSE;
var SUBMIT_TEL_RESPONSE = require('./fixtures/transactionmanager')
.SUBMIT_TEL_RESPONSE;
var SUBMIT_REMOTE_ERROR = require('./fixtures/transactionmanager')
.SUBMIT_REMOTE_ERROR;

describe('TransactionManager', function() {
var rippled;
Expand Down Expand Up @@ -491,7 +496,7 @@ describe('TransactionManager', function() {
assert(false, 'Should not receive proposed event');
});
transaction.once('submitted', function(m) {
assert.strictEqual(m.engine_result, 'terNO_ACCOUNT');
assert.strictEqual(m.engine_result, SUBMIT_TER_RESPONSE.result.engine_result);
receivedSubmitted = true;
});

Expand Down Expand Up @@ -523,6 +528,20 @@ describe('TransactionManager', function() {
assert.strictEqual(err.engine_result, 'tejMaxLedger');
assert(receivedSubmitted);
assert.strictEqual(transactionManager.getPending().length(), 0);
assert.strictEqual(transactionManager.getPending().length(), 0);
assert.strictEqual(transaction.summary().submissionAttempts, 1);
assert.strictEqual(transaction.summary().submitIndex, 2);
assert.strictEqual(transaction.summary().initialSubmitIndex, 2);
assert.strictEqual(transaction.summary().lastLedgerSequence, 5);
assert.strictEqual(transaction.summary().state, 'failed');
assert.strictEqual(transaction.summary().finalized, true);
assert.deepEqual(transaction.summary().result, {
engine_result: SUBMIT_TER_RESPONSE.result.engine_result,
engine_result_message: SUBMIT_TER_RESPONSE.result.engine_result_message,
ledger_hash: undefined,
ledger_index: undefined,
transaction_hash: SUBMIT_TER_RESPONSE.result.tx_json.hash
});
transactionManager.once('sequence_filled', done);
});
});
Expand Down Expand Up @@ -569,6 +588,19 @@ describe('TransactionManager', function() {
assert(receivedResubmitted);
assert.strictEqual(err.engine_result, 'tejMaxLedger');
assert.strictEqual(transactionManager.getPending().length(), 0);
assert.strictEqual(transaction.summary().submissionAttempts, 2);
assert.strictEqual(transaction.summary().submitIndex, 3);
assert.strictEqual(transaction.summary().initialSubmitIndex, 2);
assert.strictEqual(transaction.summary().lastLedgerSequence, 5);
assert.strictEqual(transaction.summary().state, 'failed');
assert.strictEqual(transaction.summary().finalized, true);
assert.deepEqual(transaction.summary().result, {
engine_result: SUBMIT_TEF_RESPONSE.result.engine_result,
engine_result_message: SUBMIT_TEF_RESPONSE.result.engine_result_message,
ledger_hash: undefined,
ledger_index: undefined,
transaction_hash: SUBMIT_TEF_RESPONSE.result.tx_json.hash
});
done();
});
});
Expand Down Expand Up @@ -612,6 +644,19 @@ describe('TransactionManager', function() {
assert(receivedResubmitted);
assert.strictEqual(err.engine_result, 'tejMaxLedger');
assert.strictEqual(transactionManager.getPending().length(), 0);
assert.strictEqual(transaction.summary().submissionAttempts, 2);
assert.strictEqual(transaction.summary().submitIndex, 3);
assert.strictEqual(transaction.summary().initialSubmitIndex, 2);
assert.strictEqual(transaction.summary().lastLedgerSequence, 5);
assert.strictEqual(transaction.summary().state, 'failed');
assert.strictEqual(transaction.summary().finalized, true);
assert.deepEqual(transaction.summary().result, {
engine_result: SUBMIT_TEL_RESPONSE.result.engine_result,
engine_result_message: SUBMIT_TEL_RESPONSE.result.engine_result_message,
ledger_hash: undefined,
ledger_index: undefined,
transaction_hash: SUBMIT_TEL_RESPONSE.result.tx_json.hash
});
done();
});
});
Expand All @@ -630,6 +675,68 @@ describe('TransactionManager', function() {
transaction.submit(function(err) {
assert.strictEqual(err.engine_result, 'tejSecretInvalid');
assert.strictEqual(transactionManager.getPending().length(), 0);
assert.deepEqual(transaction.summary().tx_json, transaction.tx_json);
assert.strictEqual(transaction.summary().submissionAttempts, 0);
assert.strictEqual(transaction.summary().submitIndex, undefined);
assert.strictEqual(transaction.summary().initialSubmitIndex, undefined);
assert.strictEqual(transaction.summary().lastLedgerSequence, undefined);
assert.strictEqual(transaction.summary().state, 'failed');
assert.strictEqual(transaction.summary().finalized, true);
assert.deepEqual(transaction.summary().result, {
engine_result: 'tejSecretInvalid',
engine_result_message: 'Invalid secret',
ledger_hash: undefined,
ledger_index: undefined,
transaction_hash: undefined
});
done();
});
});

it('Submit transaction -- remote error', function(done) {
var transaction = remote.createTransaction('Payment', {
account: ACCOUNT.address,
destination: ACCOUNT2.address,
amount: '1'
});
transaction.addMemo('my memotype','my_memo_data');

var receivedSubmitted = false;
transaction.once('proposed', function() {
assert(false, 'Should not receive proposed event');
});
transaction.once('submitted', function(m) {
assert.strictEqual(m.error, 'remoteError');
receivedSubmitted = true;
});

rippled.on('request_submit', function(m, req) {
assert.strictEqual(transactionManager.getPending().length(), 1);
assert.strictEqual(m.tx_blob, SerializedObject.from_json(
transaction.tx_json).to_hex());
req.sendResponse(SUBMIT_REMOTE_ERROR, {id: m.id});
});

transaction.submit(function(err) {
assert(err, 'Transaction submission should not succeed');
assert(receivedSubmitted);
assert.strictEqual(err.error, 'remoteError');
assert.strictEqual(err.remote.error, 'invalidTransaction');
assert.strictEqual(transactionManager.getPending().length(), 0);
assert.deepEqual(transaction.summary().tx_json, transaction.tx_json);
assert.strictEqual(transaction.summary().submissionAttempts, 1);
assert.strictEqual(transaction.summary().submitIndex, 2);
assert.strictEqual(transaction.summary().initialSubmitIndex, 2);
assert.strictEqual(transaction.summary().lastLedgerSequence, 5);
assert.strictEqual(transaction.summary().state, 'failed');
assert.strictEqual(transaction.summary().finalized, true);
assert.deepEqual(transaction.summary().result, {
engine_result: undefined,
engine_result_message: undefined,
ledger_hash: undefined,
ledger_index: undefined,
transaction_hash: undefined
});
done();
});
});
Expand Down

0 comments on commit 0a9b0e6

Please sign in to comment.