diff --git a/package.json b/package.json index 3009ee822..7e259d036 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,10 @@ }, "dependencies": { - "ripple-lib": "0.7.18", - "async": "~0.1.22", - "extend": "~1.1.1", - "simple-jsonrpc": "~0.0.1" + "ripple-lib": "0.7.21", + "async": "~0.2.9", + "extend": "~1.2.0", + "simple-jsonrpc": "~0.0.2" }, "devDependencies": { "buster": "~0.6.12", @@ -21,7 +21,7 @@ }, "scripts": { - "test": "./node_modules/buster/bin/buster-test" + "test": "./node_modules/buster/bin/buster-test --reporter specification" }, "repository": { diff --git a/test/account_set-test.js b/test/account_set-test.js index be89b2325..c08ea538e 100644 --- a/test/account_set-test.js +++ b/test/account_set-test.js @@ -19,202 +19,199 @@ buster.testCase("AccountSet", { // 'setUp' : testutils.build_setup({verbose: true , no_server: false}), 'tearDown' : testutils.build_teardown(), - "RequireDestTag" : - function (done) { - var self = this; + "RequireDestTag" : function (done) { + var self = this; - async.waterfall([ - function (callback) { - self.what = "Set RequireDestTag."; + async.waterfall([ + function (callback) { + self.what = "Set RequireDestTag."; - self.remote.transaction() - .account_set("root") - .set_flags('RequireDestTag') - .on('proposed', function (m) { - //console.log("proposed: %s", JSON.stringify(m)); + self.remote.transaction() + .account_set("root") + .set_flags('RequireDestTag') + .on('submitted', function (m) { + //console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Check RequireDestTag"; - - self.remote.request_account_flags('root', 'CURRENT') - .on('success', function (m) { - var wrong = !(m.node.Flags & Remote.flags.account_root.RequireDestTag); - - if (wrong) - console.log("Set RequireDestTag: failed: %s", JSON.stringify(m)); - - callback(wrong); - }) - .request(); - }, - function (callback) { - self.what = "Clear RequireDestTag."; - - self.remote.transaction() - .account_set("root") - .set_flags('OptionalDestTag') - .on('proposed', function (m) { - //console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Check No RequireDestTag"; - - self.remote.request_account_flags('root', 'CURRENT') - .on('success', function (m) { - var wrong = !!(m.node.Flags & Remote.flags.account_root.RequireDestTag); - - if (wrong) - console.log("Clear RequireDestTag: failed: %s", JSON.stringify(m)); - - callback(wrong); - }) - .request(); - }, - ], function (error) { - buster.refute(error, self.what); - done(); - }); + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); }, + function (callback) { + self.what = "Check RequireDestTag"; - "RequireAuth" : - function (done) { - var self = this; + self.remote.request_account_flags('root', 'CURRENT') + .on('success', function (m) { + var wrong = !(m.node.Flags & Remote.flags.account_root.RequireDestTag); - async.waterfall([ - function (callback) { - self.what = "Set RequireAuth."; + if (wrong) + console.log("Set RequireDestTag: failed: %s", JSON.stringify(m)); - self.remote.transaction() - .account_set("root") - .set_flags('RequireAuth') - .on('proposed', function (m) { - //console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Check RequireAuth"; - - self.remote.request_account_flags('root', 'CURRENT') - .on('success', function (m) { - var wrong = !(m.node.Flags & Remote.flags.account_root.RequireAuth); - - if (wrong) - console.log("Set RequireAuth: failed: %s", JSON.stringify(m)); - - callback(wrong); - }) - .request(); - }, - function (callback) { - self.what = "Clear RequireAuth."; - - self.remote.transaction() - .account_set("root") - .set_flags('OptionalAuth') - .on('proposed', function (m) { - //console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Check No RequireAuth"; - - self.remote.request_account_flags('root', 'CURRENT') - .on('success', function (m) { - var wrong = !!(m.node.Flags & Remote.flags.account_root.RequireAuth); - - if (wrong) - console.log("Clear RequireAuth: failed: %s", JSON.stringify(m)); - - callback(wrong); - }) - .request(); - }, - // XXX Also check fails if something is owned. - ], function (error) { - buster.refute(error, self.what); - done(); - }); + callback(wrong); + }) + .request(); }, + function (callback) { + self.what = "Clear RequireDestTag."; - "DisallowXRP" : - function (done) { - var self = this; + self.remote.transaction() + .account_set("root") + .set_flags('OptionalDestTag') + .on('submitted', function (m) { + //console.log("proposed: %s", JSON.stringify(m)); - async.waterfall([ - function (callback) { - self.what = "Set DisallowXRP."; - - self.remote.transaction() - .account_set("root") - .set_flags('DisallowXRP') - .on('proposed', function (m) { - //console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Check DisallowXRP"; - - self.remote.request_account_flags('root', 'CURRENT') - .on('success', function (m) { - var wrong = !(m.node.Flags & Remote.flags.account_root.DisallowXRP); - - if (wrong) - console.log("Set RequireDestTag: failed: %s", JSON.stringify(m)); - - callback(wrong); - }) - .request(); - }, - function (callback) { - self.what = "Clear DisallowXRP."; - - self.remote.transaction() - .account_set("root") - .set_flags('AllowXRP') - .on('proposed', function (m) { - //console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Check AllowXRP"; - - self.remote.request_account_flags('root', 'CURRENT') - .on('success', function (m) { - var wrong = !!(m.node.Flags & Remote.flags.account_root.DisallowXRP); - - if (wrong) - console.log("Clear DisallowXRP: failed: %s", JSON.stringify(m)); - - callback(wrong); - }) - .request(); - }, - ], function (error) { - buster.refute(error, self.what); - done(); - }); + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); }, + function (callback) { + self.what = "Check No RequireDestTag"; + + self.remote.request_account_flags('root', 'CURRENT') + .on('success', function (m) { + var wrong = !!(m.node.Flags & Remote.flags.account_root.RequireDestTag); + + if (wrong) + console.log("Clear RequireDestTag: failed: %s", JSON.stringify(m)); + + callback(wrong); + }) + .request(); + }, + ], function (error) { + buster.refute(error, self.what); + done(); + }); + }, + + "RequireAuth" : function (done) { + var self = this; + + async.waterfall([ + function (callback) { + self.what = "Set RequireAuth."; + + self.remote.transaction() + .account_set("root") + .set_flags('RequireAuth') + .on('submitted', function (m) { + //console.log("proposed: %s", JSON.stringify(m)); + + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Check RequireAuth"; + + self.remote.request_account_flags('root', 'CURRENT') + .on('success', function (m) { + var wrong = !(m.node.Flags & Remote.flags.account_root.RequireAuth); + + if (wrong) + console.log("Set RequireAuth: failed: %s", JSON.stringify(m)); + + callback(wrong); + }) + .request(); + }, + function (callback) { + self.what = "Clear RequireAuth."; + + self.remote.transaction() + .account_set("root") + .set_flags('OptionalAuth') + .on('submitted', function (m) { + //console.log("proposed: %s", JSON.stringify(m)); + + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Check No RequireAuth"; + + self.remote.request_account_flags('root', 'CURRENT') + .on('success', function (m) { + var wrong = !!(m.node.Flags & Remote.flags.account_root.RequireAuth); + + if (wrong) + console.log("Clear RequireAuth: failed: %s", JSON.stringify(m)); + + callback(wrong); + }) + .request(); + }, + // XXX Also check fails if something is owned. + ], function (error) { + buster.refute(error, self.what); + done(); + }); + }, + + "DisallowXRP" : function (done) { + var self = this; + + async.waterfall([ + function (callback) { + self.what = "Set DisallowXRP."; + + self.remote.transaction() + .account_set("root") + .set_flags('DisallowXRP') + .on('submitted', function (m) { + //console.log("proposed: %s", JSON.stringify(m)); + + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Check DisallowXRP"; + + self.remote.request_account_flags('root', 'CURRENT') + .on('success', function (m) { + var wrong = !(m.node.Flags & Remote.flags.account_root.DisallowXRP); + + if (wrong) + console.log("Set RequireDestTag: failed: %s", JSON.stringify(m)); + + callback(wrong); + }) + .request(); + }, + function (callback) { + self.what = "Clear DisallowXRP."; + + self.remote.transaction() + .account_set("root") + .set_flags('AllowXRP') + .on('submitted', function (m) { + //console.log("proposed: %s", JSON.stringify(m)); + + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Check AllowXRP"; + + self.remote.request_account_flags('root', 'CURRENT') + .on('success', function (m) { + var wrong = !!(m.node.Flags & Remote.flags.account_root.DisallowXRP); + + if (wrong) + console.log("Clear DisallowXRP: failed: %s", JSON.stringify(m)); + + callback(wrong); + }) + .request(); + }, + ], function (error) { + buster.refute(error, self.what); + done(); + }); + }, }); -// vim:sw=2:sts=2:ts=8:et +// vim:sw=2:sts=2:ts=8:et \ No newline at end of file diff --git a/test/account_tx-test.js b/test/account_tx-test.js index 56b81c64c..e34d3f49b 100644 --- a/test/account_tx-test.js +++ b/test/account_tx-test.js @@ -28,181 +28,180 @@ buster.testCase("//Account_tx tests", { 'setUp' : testutils.build_setup(), 'tearDown' : testutils.build_teardown(), - "make a lot of transactions and query using account_tx" : - function (done) { - var self = this; - var final_create; - var transactionCounter = 0; - var f = 0; - var functionHolder; - var createOfferFunction = function (callback) { - self.remote.transaction() - .offer_create("root", "500", "100/USD/root") - .on('proposed', function (m) { - transactionCounter++; - if (VERBOSE) console.log('Submitted transaction', transactionCounter); + "make a lot of transactions and query using account_tx" : function (done) { + var self = this; + var final_create; + var transactionCounter = 0; + var f = 0; + var functionHolder; + var createOfferFunction = function (callback) { + self.remote.transaction() + .offer_create("root", "500", "100/USD/root") + .on('proposed', function (m) { + transactionCounter++; + if (VERBOSE) console.log('Submitted transaction', transactionCounter); - callback(m.result !== 'tesSUCCESS'); - }) - .on('final', function (m) { - f++; - if (VERBOSE) console.log("Finalized transaction", f); - buster.assert.equals('tesSUCCESS', m.metadata.TransactionResult); - buster.assert(final_create); - if ( f == transactionCounter ) { - if (VERBOSE) console.log("All transactions have been finalized."); - functionHolder(); - } - }) - .submit(); - }; - - function lotsOfTransactions(number, whenDone) { - var bunchOfOffers = []; - for (var i=0; it2.inLedger || (t1.inLedger==t2.inLedger && t1.Sequence > t2.Sequence ), - // "Transactions were not ordered correctly: "+t1.inLedger+"#"+t1.Sequence+" should not have come before "+t2.inLedger+"#"+t2.Sequence); - buster.assert(t1.inLedger>=t2.inLedger, - "Transactions were not ordered correctly: "+t1.inLedger+"#"+t1.Sequence+" should not have come before "+t2.inLedger+"#"+t2.Sequence); - } - } else { - buster.assert(r.transactions, "No transactions returned: "+offset+" "+limit); - } - + function firstBatch() { + lotsOfTransactions(FIRST_BATCH, + function(){runTests(self, FIRST_BATCH, 0, undefined, + function(){runTests(self, FIRST_BATCH, OFFSET, undefined, + function(){runTests(self, FIRST_BATCH, 0, LIMIT, secondBatch)})} + )}); + } - callback(false); - }) - .on('error', standardErrorHandler(callback)) - .request(); - }, + function secondBatch() { + lotsOfTransactions(SECOND_BATCH, + function(){runTests(self, FIRST_BATCH+SECOND_BATCH, 0, undefined, + function(){runTests(self, FIRST_BATCH+SECOND_BATCH, OFFSET, undefined, thirdBatch)} + )}); + } + + function thirdBatch() { + lotsOfTransactions(THIRD_BATCH, + function(){runTests(self, FIRST_BATCH+SECOND_BATCH+THIRD_BATCH, 0, undefined, + function(){runTests(self, FIRST_BATCH+SECOND_BATCH+THIRD_BATCH, OFFSET, undefined, done)} + )}); + } + + firstBatch(); - ], function (error) { - buster.refute(error); - finalCallback(); - } - ); - } - } + function standardErrorHandler(callback) { + return function(r) { + if (VERBOSE) console.log("ERROR!"); + if (VERBOSE) console.log(r); + callback(r); + } + } + + + function runTests(self, actualNumberOfTransactions, offset, limit, finalCallback) { + if (VERBOSE) console.log("Testing batch with offset and limit:", offset, limit); + async.series([ + function(callback) { + if (VERBOSE) console.log('nonbinary'); + self.remote.request_account_tx({ + account:ACCOUNT, + ledger_index_min:-1, + ledger_index_max:-1, + offset:offset, + limit:limit + }).on('success', function (r) { + if (r.transactions) { + var targetLength = Math.min(NONBINARY_LIMIT, limit ? Math.min(limit,actualNumberOfTransactions-offset) : actualNumberOfTransactions-offset); + buster.assert(r.transactions.length == targetLength, "Got "+r.transactions.length+" transactions; expected "+targetLength ); + //Check for proper ordering. + for (var i=0; it2.inLedger || (t1.inLedger==t2.inLedger && t1.Sequence > t2.Sequence ), + // "Transactions were not ordered correctly: "+t1.inLedger+"#"+t1.Sequence+" should not have come before "+t2.inLedger+"#"+t2.Sequence); + buster.assert(t1.inLedger>=t2.inLedger, + "Transactions were not ordered correctly: "+t1.inLedger+"#"+t1.Sequence+" should not have come before "+t2.inLedger+"#"+t2.Sequence); + } + } else { + buster.assert(r.transactions, "No transactions returned: "+offset+" "+limit); + } + + + callback(false); + }) + .on('error', standardErrorHandler(callback)) + .request(); + }, + + + ], function (error) { + buster.refute(error); + finalCallback(); + } + ); + } + } }); diff --git a/test/offer-test.js b/test/offer-test.js index ed015ab7a..e81637b71 100644 --- a/test/offer-test.js +++ b/test/offer-test.js @@ -18,8 +18,7 @@ buster.testCase("Offer tests", { // 'setUp' : testutils.build_setup({ verbose: true, standalone: true }), 'tearDown' : testutils.build_teardown(), - "offer create then cancel in one ledger" : - function (done) { + "offer create then cancel in one ledger" : function (done) { var self = this; var final_create; @@ -27,9 +26,9 @@ buster.testCase("Offer tests", { function (callback) { self.remote.transaction() .offer_create("root", "500", "100/USD/root") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS', m); + callback(m.engine_result !== 'tesSUCCESS', m); }) .on('final', function (m) { // console.log("FINAL: offer_create: %s", JSON.stringify(m)); @@ -43,9 +42,9 @@ buster.testCase("Offer tests", { function (m, callback) { self.remote.transaction() .offer_cancel("root", m.tx_json.Sequence) - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_cancel: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS', m); + callback(m.engine_result !== 'tesSUCCESS', m); }) .on('final', function (m) { // console.log("FINAL: offer_cancel: %s", JSON.stringify(m, undefined, 2)); @@ -72,8 +71,7 @@ buster.testCase("Offer tests", { }); }, - "offer create then offer create with cancel in one ledger" : - function (done) { + "offer create then offer create with cancel in one ledger" : function (done) { var self = this; var final_create; var sequence_first; @@ -84,9 +82,9 @@ buster.testCase("Offer tests", { function (callback) { self.remote.transaction() .offer_create("root", "500", "100/USD/root") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS', m); + callback(m.engine_result !== 'tesSUCCESS', m); }) .on('final', function (m) { // console.log("FINAL: offer_create: %s", JSON.stringify(m)); @@ -105,9 +103,9 @@ buster.testCase("Offer tests", { // Test canceling existant offer. self.remote.transaction() .offer_create("root", "300", "100/USD/root", undefined, sequence_first) - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS', m); + callback(m.engine_result !== 'tesSUCCESS', m); }) .on('final', function (m) { // console.log("FINAL: offer_create: %s", JSON.stringify(m)); @@ -135,9 +133,9 @@ buster.testCase("Offer tests", { // Test canceling non-existant offer. self.remote.transaction() .offer_create("root", "400", "200/USD/root", undefined, sequence_first) - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS', m); + callback(m.engine_result !== 'tesSUCCESS', m); }) .on('final', function (m) { // console.log("FINAL: offer_create: %s", JSON.stringify(m)); @@ -166,8 +164,7 @@ buster.testCase("Offer tests", { }); }, - "Offer create then self crossing offer, no trust lines with self" : - function (done) { + "Offer create then self crossing offer, no trust lines with self" : function (done) { var self = this; async.waterfall([ @@ -176,10 +173,10 @@ buster.testCase("Offer tests", { self.remote.transaction() .offer_create("root", "500/BTC/root", "100/USD/root") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -188,10 +185,10 @@ buster.testCase("Offer tests", { self.remote.transaction() .offer_create("root", "100/USD/root", "500/BTC/root") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); } @@ -202,8 +199,7 @@ buster.testCase("Offer tests", { }); }, - "Offer create then crossing offer with XRP. Negative balance." : - function (done) { + "Offer create then crossing offer with XRP. Negative balance." : function (done) { var self = this; var alices_initial_balance = 499946999680; @@ -232,7 +228,7 @@ buster.testCase("Offer tests", { .transfer_rate(1005000000) .once('proposed', function (m) { // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -261,10 +257,10 @@ buster.testCase("Offer tests", { self.remote.transaction() .offer_create("alice", "50/USD/mtgox", "150000.0") // get 50/USD pay 150000/XRP - .on('proposed', function (m) { + .once('proposed', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -301,10 +297,10 @@ buster.testCase("Offer tests", { self.remote.transaction() .offer_create("bob", "2000.0", "1/USD/mtgox") // get 2,000/XRP pay 1/USD (has insufficient USD) - .on('proposed', function (m) { + .once('proposed', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -333,7 +329,6 @@ buster.testCase("Offer tests", { { "alice" : [ "-50/USD/mtgox", alices_final_balance.to_json()], "bob" : [ "2710505431213761e-33/USD/mtgox", - bobs_final_balance.to_json() // bobs_final_balance.to_json() @@ -360,8 +355,7 @@ buster.testCase("Offer tests", { }); }, - "Offer create then crossing offer with XRP. Reverse order." : - function (done) { + "Offer create then crossing offer with XRP. Reverse order." : function (done) { var self = this; async.waterfall([ @@ -394,10 +388,10 @@ buster.testCase("Offer tests", { self.remote.transaction() .offer_create("bob", "1/USD/mtgox", "4000.0") // get 1/USD pay 4000/XRP : offer pays 4000 XRP for 1 USD - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -410,10 +404,10 @@ buster.testCase("Offer tests", { self.remote.transaction() .offer_create("alice", "150000.0", "50/USD/mtgox") // get 150,000/XRP pay 50/USD : offer pays 1 USD for 3000 XRP - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -446,8 +440,7 @@ buster.testCase("Offer tests", { }); }, - "Offer create then crossing offer with XRP." : - function (done) { + "Offer create then crossing offer with XRP." : function (done) { var self = this; async.waterfall([ @@ -480,10 +473,10 @@ buster.testCase("Offer tests", { self.remote.transaction() .offer_create("alice", "150000.0", "50/USD/mtgox") // pays 1 USD for 3000 XRP - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -492,10 +485,10 @@ buster.testCase("Offer tests", { self.remote.transaction() .offer_create("bob", "1/USD/mtgox", "4000.0") // pays 4000 XRP for 1 USD - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -531,8 +524,7 @@ buster.testCase("Offer tests", { }); }, - "Offer create then crossing offer with XRP with limit override." : - function (done) { + "Offer create then crossing offer with XRP with limit override." : function (done) { var self = this; async.waterfall([ @@ -565,10 +557,10 @@ buster.testCase("Offer tests", { self.remote.transaction() .offer_create("alice", "150000.0", "50/USD/mtgox") // 300 XRP = 1 USD - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -588,10 +580,10 @@ buster.testCase("Offer tests", { self.remote.transaction() .offer_create("bob", "1/USD/mtgox", "3000.0") // - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -623,8 +615,7 @@ buster.testCase("Offer tests", { }); }, - "offer_create then ledger_accept then offer_cancel then ledger_accept." : - function (done) { + "offer_create then ledger_accept then offer_cancel then ledger_accept." : function (done) { var self = this; var final_create; var offer_seq; @@ -633,12 +624,12 @@ buster.testCase("Offer tests", { function (callback) { self.remote.transaction() .offer_create("root", "500", "100/USD/root") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); offer_seq = m.tx_json.Sequence; - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .on('final', function (m) { // console.log("FINAL: offer_create: %s", JSON.stringify(m)); @@ -669,9 +660,9 @@ buster.testCase("Offer tests", { self.remote.transaction() .offer_cancel("root", offer_seq) - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_cancel: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .on('final', function (m) { // console.log("FINAL: offer_cancel: %s", JSON.stringify(m)); @@ -708,8 +699,7 @@ buster.testCase("Offer tests", { }); }, - "//new user offer_create then ledger_accept then offer_cancel then ledger_accept." : - function (done) { + "//new user offer_create then ledger_accept then offer_cancel then ledger_accept." : function (done) { var self = this; var final_create; var offer_seq; @@ -718,9 +708,9 @@ buster.testCase("Offer tests", { function (callback) { self.remote.transaction() .payment('root', 'alice', "1000") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); - buster.assert.equals(m.result, 'tesSUCCESS'); + buster.assert.equals(m.engine_result, 'tesSUCCESS'); callback(); }) .submit() @@ -728,12 +718,12 @@ buster.testCase("Offer tests", { function (callback) { self.remote.transaction() .offer_create("alice", "500", "100/USD/alice") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); offer_seq = m.tx_json.Sequence; - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .on('final', function (m) { // console.log("FINAL: offer_create: %s", JSON.stringify(m)); @@ -764,9 +754,9 @@ buster.testCase("Offer tests", { self.remote.transaction() .offer_cancel("alice", offer_seq) - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_cancel: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .on('final', function (m) { // console.log("FINAL: offer_cancel: %s", JSON.stringify(m)); @@ -802,8 +792,7 @@ buster.testCase("Offer tests", { }); }, - "offer cancel past and future sequence" : - function (done) { + "offer cancel past and future sequence" : function (done) { var self = this; var final_create; @@ -811,13 +800,12 @@ buster.testCase("Offer tests", { function (callback) { self.remote.transaction() .payment('root', 'alice', Amount.from_json("10000.0")) - .on('proposed', function (m) { - // console.log("PROPOSED: CreateAccount: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS', m); + .once('submitted', function (m) { + //console.log("PROPOSED: CreateAccount: %s", JSON.stringify(m)); + callback(m.engine_result !== 'tesSUCCESS', m); }) - .on('error', function(m) { - // console.log("error: %s", m); - + .once('error', function(m) { + //console.log("error: %s", m); buster.assert(false); callback(m); }) @@ -827,9 +815,9 @@ buster.testCase("Offer tests", { function (m, callback) { self.remote.transaction() .offer_cancel("root", m.tx_json.Sequence) - .on('proposed', function (m) { - // console.log("PROPOSED: offer_cancel past: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS', m); + .once('submitted', function (m) { + //console.log("PROPOSED: offer_cancel past: %s", JSON.stringify(m)); + callback(m.engine_result !== 'tesSUCCESS', m); }) .submit(); }, @@ -837,9 +825,9 @@ buster.testCase("Offer tests", { function (m, callback) { self.remote.transaction() .offer_cancel("root", m.tx_json.Sequence+1) - .on('proposed', function (m) { - // console.log("PROPOSED: offer_cancel same: %s", JSON.stringify(m)); - callback(m.result !== 'temBAD_SEQUENCE', m); + .once('submitted', function (m) { + //console.log("PROPOSED: offer_cancel same: %s", JSON.stringify(m)); + callback(m.engine_result !== 'temBAD_SEQUENCE', m); }) .submit(); }, @@ -847,17 +835,17 @@ buster.testCase("Offer tests", { function (m, callback) { self.remote.transaction() .offer_cancel("root", m.tx_json.Sequence+2) - .on('proposed', function (m) { - // console.log("ERROR: offer_cancel future: %s", JSON.stringify(m)); - callback(m.result !== 'temBAD_SEQUENCE'); + .once('submitted', function (m) { + //console.log("ERROR: offer_cancel future: %s", JSON.stringify(m)); + callback(m.engine_result !== 'temBAD_SEQUENCE'); }) .submit(); }, // See if ledger_accept will crash. function (callback) { self.remote - .once('ledger_closed', function (mesage) { - // console.log("LEDGER_CLOSED: A: %d: %s", ledger_index, ledger_hash); + .once('ledger_closed', function (message) { + //console.log("LEDGER_CLOSED: A: %d: %s", message.ledger_index, message.ledger_hash); callback(); }) .ledger_accept(); @@ -865,7 +853,7 @@ buster.testCase("Offer tests", { function (callback) { self.remote .once('ledger_closed', function (mesage) { - // console.log("LEDGER_CLOSED: B: %d: %s", ledger_index, ledger_hash); + //console.log("LEDGER_CLOSED: B: %d: %s", message.ledger_index, message.ledger_hash); callback(); }) .ledger_accept(); @@ -874,16 +862,14 @@ buster.testCase("Offer tests", { callback(); } ], function (error) { - // console.log("result: error=%s", error); + //console.log("result: error=%s", error); buster.refute(error, self.what); - done(); }); }, - "ripple currency conversion : entire offer" : + "ripple currency conversion : entire offer" : function (done) { // mtgox in, XRP out - function (done) { var self = this; var seq; @@ -932,9 +918,9 @@ buster.testCase("Offer tests", { self.remote.transaction() .offer_create("bob", "100/USD/mtgox", "500") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); seq = m.tx_json.Sequence; }) @@ -961,10 +947,10 @@ buster.testCase("Offer tests", { self.remote.transaction() .payment("alice", "alice", "500") .send_max("100/USD/mtgox") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -999,9 +985,8 @@ buster.testCase("Offer tests", { }); }, - "ripple currency conversion : offerer into debt" : + "ripple currency conversion : offerer into debt" : function (done) { // alice in, carol out - function (done) { var self = this; var seq; @@ -1027,9 +1012,9 @@ buster.testCase("Offer tests", { self.remote.transaction() .offer_create("bob", "50/USD/alice", "200/EUR/carol") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tecUNFUNDED_OFFER'); + callback(m.engine_result !== 'tecUNFUNDED_OFFER'); seq = m.tx_json.Sequence; }) @@ -1040,9 +1025,9 @@ buster.testCase("Offer tests", { // // self.remote.transaction() // .offer_create("alice", "200/EUR/carol", "50/USD/alice") -// .on('proposed', function (m) { +// .on('submitted', function (m) { // // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); -// callback(m.result !== 'tesSUCCESS'); +// callback(m.engine_result !== 'tesSUCCESS'); // // seq = m.tx_json.Sequence; // }) @@ -1070,8 +1055,7 @@ buster.testCase("Offer tests", { }); }, - "ripple currency conversion : in parts" : - function (done) { + "ripple currency conversion : in parts" : function (done) { var self = this; var seq; @@ -1105,9 +1089,9 @@ buster.testCase("Offer tests", { self.remote.transaction() .offer_create("bob", "100/USD/mtgox", "500") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); seq = m.tx_json.Sequence; }) @@ -1119,10 +1103,10 @@ buster.testCase("Offer tests", { self.remote.transaction() .payment("alice", "alice", "200") .send_max("100/USD/mtgox") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -1147,10 +1131,10 @@ buster.testCase("Offer tests", { self.remote.transaction() .payment("alice", "alice", "600") .send_max("100/USD/mtgox") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tecPATH_PARTIAL'); + callback(m.engine_result !== 'tecPATH_PARTIAL'); }) .submit(); }, @@ -1161,10 +1145,10 @@ buster.testCase("Offer tests", { .payment("alice", "alice", "600") .send_max("100/USD/mtgox") .set_flags('PartialPayment') - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -1195,10 +1179,8 @@ buster.testCase("Offer cross currency", { // 'setUp' : testutils.build_setup({ verbose: true }), 'tearDown' : testutils.build_teardown(), - "ripple cross currency payment - start with XRP" : + "ripple cross currency payment - start with XRP" : function (done) { // alice --> [XRP --> carol --> USD/mtgox] --> bob - - function (done) { var self = this; var seq; @@ -1234,9 +1216,9 @@ buster.testCase("Offer cross currency", { self.remote.transaction() .offer_create("carol", "500.0", "50/USD/mtgox") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); seq = m.tx_json.Sequence; }) @@ -1248,10 +1230,10 @@ buster.testCase("Offer cross currency", { self.remote.transaction() .payment("alice", "bob", "25/USD/mtgox") .send_max("333.0") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -1277,10 +1259,8 @@ buster.testCase("Offer cross currency", { }); }, - "ripple cross currency payment - end with XRP" : + "ripple cross currency payment - end with XRP" : function (done) { // alice --> [USD/mtgox --> carol --> XRP] --> bob - - function (done) { var self = this; var seq; @@ -1316,9 +1296,9 @@ buster.testCase("Offer cross currency", { self.remote.transaction() .offer_create("carol", "50/USD/mtgox", "500") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); seq = m.tx_json.Sequence; }) @@ -1330,10 +1310,10 @@ buster.testCase("Offer cross currency", { self.remote.transaction() .payment("alice", "bob", "250") .send_max("333/USD/mtgox") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -1359,15 +1339,13 @@ buster.testCase("Offer cross currency", { }); }, - "ripple cross currency bridged payment" : + "ripple cross currency bridged payment" : function (done) { // alice --> [USD/mtgox --> carol --> XRP] --> [XRP --> dan --> EUR/bitstamp] --> bob - - function (done) { var self = this; var seq_carol; var seq_dan; - // self.remote.set_trace(); + //self.remote.set_trace(); async.waterfall([ function (callback) { @@ -1402,9 +1380,9 @@ buster.testCase("Offer cross currency", { self.remote.transaction() .offer_create("carol", "50/USD/mtgox", "500") - .on('proposed', function (m) { - // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + .once('proposed', function (m) { + //console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); + callback(m.engine_result !== 'tesSUCCESS'); seq_carol = m.tx_json.Sequence; }) @@ -1415,9 +1393,9 @@ buster.testCase("Offer cross currency", { self.remote.transaction() .offer_create("dan", "500", "50/EUR/bitstamp") - .on('proposed', function (m) { - // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + .once('proposed', function (m) { + //console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); + callback(m.engine_result !== 'tesSUCCESS'); seq_dan = m.tx_json.Sequence; }) @@ -1430,10 +1408,10 @@ buster.testCase("Offer cross currency", { .payment("alice", "bob", "30/EUR/bitstamp") .send_max("333/USD/mtgox") .path_add( [ { currency: "XRP" } ]) - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); + .once('submitted', function (m) { + //console.log("PROPOSED: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -1472,8 +1450,7 @@ buster.testCase("Offer tests 3", { // 'setUp' : testutils.build_setup({ verbose: true, standalone: true }), 'tearDown' : testutils.build_teardown(), - "offer fee consumes funds" : - function (done) { + "offer fee consumes funds" : function (done) { var self = this; var final_create; @@ -1536,9 +1513,9 @@ buster.testCase("Offer tests 3", { self.remote.transaction() .offer_create("bob", "200.0", "200/USD/mtgox") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("proposed: offer_create: %s", json.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); seq_carol = m.tx_json.sequence; }) .submit(); @@ -1550,9 +1527,9 @@ buster.testCase("Offer tests 3", { self.remote.transaction() .offer_create("alice", "200/USD/mtgox", "200.0") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("proposed: offer_create: %s", json.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); seq_carol = m.tx_json.sequence; }) @@ -1586,8 +1563,7 @@ buster.testCase("Offer tests 3", { done(); }); }, - "offer create then cross offer" : - function (done) { + "offer create then cross offer" : function (done) { var self = this; var final_create; @@ -1605,7 +1581,7 @@ buster.testCase("Offer tests 3", { .transfer_rate(1005000000) .once('proposed', function (m) { // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -1644,9 +1620,9 @@ buster.testCase("Offer tests 3", { self.remote.transaction() .offer_create("alice", "50/USD/mtgox", "150000.0") - .on('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: offer_create: %s", json.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); seq_carol = m.tx_json.sequence; }) @@ -1657,9 +1633,9 @@ buster.testCase("Offer tests 3", { self.remote.transaction() .offer_create("bob", "100.0", ".1/USD/mtgox") - .on('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: offer_create: %s", json.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); seq_carol = m.tx_json.sequence; }) @@ -1689,7 +1665,6 @@ buster.testCase("Offer tests 3", { ], function (error) { // console.log("result: error=%s", error); buster.refute(error, self.what); - done(); }); }, @@ -1701,8 +1676,7 @@ buster.testCase("Offer tfSell", { // 'setUp' : testutils.build_setup({ verbose: true, standalone: true }), 'tearDown' : testutils.build_teardown(), - "basic sell" : - function (done) { + "basic sell" : function (done) { var self = this; var final_create, seq_carol; @@ -1740,10 +1714,10 @@ buster.testCase("Offer tfSell", { self.remote.transaction() .offer_create("bob", "200.0", "200/USD/mtgox") .set_flags('Sell') // Should not matter at all. - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("proposed: offer_create: %s", json.stringify(m)); - if (m.result !== 'tesSUCCESS') { - throw new Error("Bob's OfferCreate tx did not succeed: "+m.result); + if (m.engine_result !== 'tesSUCCESS') { + throw new Error("Bob's OfferCreate tx did not succeed: "+m.engine_result); } else callback(null); seq_carol = m.tx_json.sequence; @@ -1758,9 +1732,9 @@ buster.testCase("Offer tfSell", { self.remote.transaction() .offer_create("alice", "200/USD/mtgox", "200.0") .set_flags('Sell') // Should not matter at all. - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("proposed: offer_create: %s", json.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); seq_carol = m.tx_json.sequence; }) @@ -1795,8 +1769,7 @@ buster.testCase("Offer tfSell", { }); }, - "2x sell exceed limit" : - function (done) { + "2x sell exceed limit" : function (done) { var self = this; var final_create, seq_carol; @@ -1804,7 +1777,6 @@ buster.testCase("Offer tfSell", { function (callback) { // Provide micro amounts to compensate for fees to make results round nice. self.what = "Create accounts."; - var starting_xrp = self.amount_for({ ledger_entries: 1, default_transactions: 2, @@ -1838,9 +1810,9 @@ buster.testCase("Offer tfSell", { // Selling USD. self.remote.transaction() .offer_create("bob", "100.0", "200/USD/mtgox") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("proposed: offer_create: %s", json.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); seq_carol = m.tx_json.sequence; }) .submit(); @@ -1856,10 +1828,10 @@ buster.testCase("Offer tfSell", { self.remote.transaction() .offer_create("alice", "100/USD/mtgox", "100.0") .set_flags('Sell') - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("proposed: offer_create: %s", json.stringify(m)); - if (m.result !== 'tesSUCCESS') { - callback(new Error("Alice's OfferCreate didn't succeed: "+m.result)); + if (m.engine_result !== 'tesSUCCESS') { + callback(new Error("Alice's OfferCreate didn't succeed: "+m.engine_result)); } else callback(null); seq_carol = m.tx_json.sequence; @@ -1902,8 +1874,7 @@ buster.testCase("Client Issue #535", { // 'setUp' : testutils.build_setup({ verbose: true, standalone: true }), 'tearDown' : testutils.build_teardown(), - "gateway cross currency" : - function (done) { + "gateway cross currency" : function (done) { var self = this; var final_create; @@ -1911,7 +1882,7 @@ buster.testCase("Client Issue #535", { function (callback) { // Provide micro amounts to compensate for fees to make results round nice. self.what = "Create accounts."; - + var starting_xrp = self.amount_for({ ledger_entries: 1, default_transactions: 2, @@ -1944,9 +1915,9 @@ buster.testCase("Client Issue #535", { self.remote.transaction() .offer_create("alice", "100/XTS/mtgox", "100/XXX/mtgox") - .on('proposed', function (m) { + .on('submitted', function (m) { // console.log("proposed: offer_create: %s", json.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); seq_carol = m.tx_json.sequence; }) @@ -1959,11 +1930,11 @@ buster.testCase("Client Issue #535", { .payment("bob", "bob", "1/XXX/bob") .send_max("1.5/XTS/bob") .build_path(true) - .on('proposed', function (m) { - if (m.result !== 'tesSUCCESS') + .on('submitted', function (m) { + if (m.engine_result !== 'tesSUCCESS') console.log("proposed: %s", JSON.stringify(m, undefined, 2)); - callback(m.result !== 'tesSUCCESS'); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -1990,11 +1961,11 @@ buster.testCase("Client Issue #535", { }, ], function (error) { if (error) - console.log("result: %s: error=%s", self.what, error); + //console.log("result: %s: error=%s", self.what, error); buster.refute(error, self.what); done(); }); } }); -// vim:sw=2:sts=2:ts=8:et +// vim:sw=2:sts=2:ts=8:et \ No newline at end of file diff --git a/test/path-test.js b/test/path-test.js index 3616122b3..bf89d9bec 100644 --- a/test/path-test.js +++ b/test/path-test.js @@ -18,8 +18,7 @@ buster.testCase("Basic Path finding", { // 'setUp' : testutils.build_setup({ verbose: true, no_server: true }), 'tearDown' : testutils.build_teardown(), - "no direct path, no intermediary -> no alternatives" : - function (done) { + "no direct path, no intermediary -> no alternatives" : function (done) { var self = this; async.waterfall([ @@ -46,8 +45,7 @@ buster.testCase("Basic Path finding", { }); }, - "direct path, no intermediary" : - function (done) { + "direct path, no intermediary" : function (done) { var self = this; async.waterfall([ @@ -110,8 +108,7 @@ buster.testCase("Basic Path finding", { }); }, - "payment auto path find (using build_path)" : - function (done) { + "payment auto path find (using build_path)" : function (done) { var self = this; async.waterfall([ @@ -145,9 +142,9 @@ buster.testCase("Basic Path finding", { self.remote.transaction() .payment('alice', 'bob', "24/USD/bob") .build_path(true) - .once('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + .once('submitted', function (m) { + //console.log("proposed: %s", JSON.stringify(m)); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, @@ -163,13 +160,13 @@ buster.testCase("Basic Path finding", { callback); }, ], function (error) { + //console.log(error); buster.refute(error, self.what); done(); }); }, - "path find" : - function (done) { + "path find" : function (done) { var self = this; async.waterfall([ @@ -221,14 +218,15 @@ buster.testCase("Basic Path finding", { }, }); + + buster.testCase("Extended Path finding", { // 'setUp' : testutils.build_setup({ verbose: true, no_server: true }), // 'setUp' : testutils.build_setup({ verbose: true }), 'setUp' : testutils.build_setup(), 'tearDown' : testutils.build_teardown(), - "alternative paths - consume both" : - function (done) { + "alternative paths - consume both" : function (done) { var self = this; async.waterfall([ @@ -263,7 +261,7 @@ buster.testCase("Extended Path finding", { self.remote.transaction() .payment('alice', 'bob', "140/USD/bob") .build_path(true) - .once('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); }) @@ -287,8 +285,7 @@ buster.testCase("Extended Path finding", { }); }, - "alternative paths - consume best transfer" : - function (done) { + "alternative paths - consume best transfer" : function (done) { var self = this; async.waterfall([ @@ -303,7 +300,7 @@ buster.testCase("Extended Path finding", { self.remote.transaction() .account_set("bitstamp") .transfer_rate(1e9*1.1) - .once('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); }) @@ -335,7 +332,7 @@ buster.testCase("Extended Path finding", { self.remote.transaction() .payment('alice', 'bob', "70/USD/bob") .build_path(true) - .once('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); }) @@ -359,8 +356,7 @@ buster.testCase("Extended Path finding", { }); }, - "alternative paths - consume best transfer first" : - function (done) { + "alternative paths - consume best transfer first" : function (done) { var self = this; async.waterfall([ @@ -375,7 +371,7 @@ buster.testCase("Extended Path finding", { self.remote.transaction() .account_set("bitstamp") .transfer_rate(1e9*1.1) - .once('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); }) @@ -408,7 +404,7 @@ buster.testCase("Extended Path finding", { .payment('alice', 'bob', "77/USD/bob") .build_path(true) .send_max("100/USD/alice") - .once('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); }) @@ -441,12 +437,11 @@ buster.testCase("More Path finding", { 'setUp' : testutils.build_setup(), 'tearDown' : testutils.build_teardown(), - "// alternative paths - limit returned paths to best quality" : // alice +- bitstamp -+ bob // |- carol(fee) -| // To be excluded. // |- dan(issue) -| // |- mtgox -| - function (done) { + "// alternative paths - limit returned paths to best quality" : function (done) { var self = this; async.waterfall([ @@ -461,7 +456,7 @@ buster.testCase("More Path finding", { self.remote.transaction() .account_set("carol") .transfer_rate(1e9*1.1) - .once('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); }) @@ -513,8 +508,7 @@ buster.testCase("More Path finding", { }); }, - "alternative paths - consume best transfer" : - function (done) { + "alternative paths - consume best transfer" : function (done) { var self = this; async.waterfall([ @@ -529,7 +523,7 @@ buster.testCase("More Path finding", { self.remote.transaction() .account_set("bitstamp") .transfer_rate(1e9*1.1) - .once('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); }) @@ -561,7 +555,7 @@ buster.testCase("More Path finding", { self.remote.transaction() .payment('alice', 'bob', "70/USD/bob") .build_path(true) - .once('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); }) @@ -585,8 +579,7 @@ buster.testCase("More Path finding", { }); }, - "alternative paths - consume best transfer first" : - function (done) { + "alternative paths - consume best transfer first" : function (done) { var self = this; async.waterfall([ @@ -601,7 +594,7 @@ buster.testCase("More Path finding", { self.remote.transaction() .account_set("bitstamp") .transfer_rate(1e9*1.1) - .once('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); }) @@ -634,7 +627,7 @@ buster.testCase("More Path finding", { .payment('alice', 'bob', "77/USD/bob") .build_path(true) .send_max("100/USD/alice") - .once('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); }) @@ -667,8 +660,7 @@ buster.testCase("Issues", { 'setUp' : testutils.build_setup(), 'tearDown' : testutils.build_teardown(), - "Path negative: Issue #5" : - function (done) { + "Path negative: Issue #5" : function (done) { var self = this; async.waterfall([ @@ -696,7 +688,7 @@ buster.testCase("Issues", { self.remote.transaction() .payment("bob", "carol", "75/USD/bob") - .on('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); @@ -745,7 +737,7 @@ buster.testCase("Issues", { self.remote.transaction() .payment('alice', 'bob', "25/USD/alice") - .once('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); callback(m.result !== 'tecPATH_DRY'); }) @@ -801,7 +793,7 @@ buster.testCase("Issues", { self.remote.transaction() .payment('alice', 'bob', "55/USD/bob") .build_path(true) - .once('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); }) @@ -865,7 +857,7 @@ buster.testCase("Issues", { self.remote.transaction() .payment('alice', 'bob', "50/USD/bob") .build_path(true) - .once('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); }) @@ -926,7 +918,7 @@ buster.testCase("Via offers", { self.remote.transaction() .account_set("mtgox") .transfer_rate(1005000000) - .once('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); }) @@ -956,7 +948,7 @@ buster.testCase("Via offers", { self.remote.transaction() .offer_create("carol", "50.0", "50/AUD/mtgox") - .on('proposed', function (m) { + .once('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); @@ -972,7 +964,7 @@ buster.testCase("Via offers", { .payment("alice", "bob", "10/AUD/mtgox") .build_path(true) .send_max("100.0") - .on('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); @@ -1041,7 +1033,7 @@ buster.testCase("Via offers", { self.remote.transaction() .account_set("mtgox") .transfer_rate(1005000000) - .once('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); }) @@ -1071,7 +1063,7 @@ buster.testCase("Via offers", { self.remote.transaction() .offer_create("carol", "50", "50/AUD/mtgox") - .on('proposed', function (m) { + .once('submitted', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); @@ -1087,7 +1079,7 @@ buster.testCase("Via offers", { .payment("alice", "bob", "10/AUD/mtgox") .build_path(true) .send_max("100") - .on('proposed', function (m) { + .once('submitted', function (m) { // console.log("proposed: %s", JSON.stringify(m)); callback(m.result !== 'tesSUCCESS'); @@ -1246,14 +1238,16 @@ buster.testCase("Quality paths", { function (callback) { self.what = "Payment with auto path"; + self.remote.trace = true; + self.remote.transaction() .payment('alice', 'bob', "100/USD/bob") .send_max("120/USD/alice") // .set_flags('PartialPayment') // .build_path(true) - .once('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + .once('submitted', function (m) { + console.log("proposed: %s", JSON.stringify(m)); + callback(m.engine_result !== 'tesSUCCESS'); }) .submit(); }, diff --git a/test/remote-test.js b/test/remote-test.js index 0b390e300..37bec11e6 100644 --- a/test/remote-test.js +++ b/test/remote-test.js @@ -10,31 +10,25 @@ var config = testutils.init_config(); // How long to wait for server to start. var serverDelay = 1500; // XXX Not implemented. -buster.testRunner.timeout = 5000; +buster.testRunner.timeout = 5000 * 10; buster.testCase("Remote functions", { 'setUp' : testutils.build_setup(), 'tearDown' : testutils.build_teardown(), - "request_ledger_current" : - function (done) { + "request_ledger_current" : function (done) { this.remote.request_ledger_current().on('success', function (m) { - // console.log(m); - buster.assert.equals(m.ledger_current_index, 3); done(); }) .on('error', function(m) { - // console.log(m); - buster.assert(false); }) .request(); }, - "request_ledger_hash" : - function (done) { + "request_ledger_hash" : function (done) { this.remote.request_ledger_hash().on('success', function (m) { // console.log("result: %s", JSON.stringify(m)); @@ -49,8 +43,7 @@ buster.testCase("Remote functions", { .request(); }, - "manual account_root success" : - function (done) { + "manual account_root success" : function (done) { var self = this; this.remote.request_ledger_hash().on('success', function (r) { @@ -82,8 +75,7 @@ buster.testCase("Remote functions", { }, // XXX This should be detected locally. - "account_root remote malformedAddress" : - function (done) { + "account_root remote malformedAddress" : function (done) { var self = this; this.remote.request_ledger_hash().on('success', function (r) { @@ -95,12 +87,10 @@ buster.testCase("Remote functions", { .account_root("zHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh") .on('success', function (r) { // console.log("account_root: %s", JSON.stringify(r)); - buster.assert(false); }) .on('error', function(m) { // console.log("error: %s", m); - buster.assert.equals(m.error, 'remoteError'); buster.assert.equals(m.remote.error, 'malformedAddress'); done(); @@ -115,8 +105,7 @@ buster.testCase("Remote functions", { .request(); }, - "account_root entryNotFound" : - function (done) { + "account_root entryNotFound" : function (done) { var self = this; this.remote.request_ledger_hash().on('success', function (r) { @@ -147,8 +136,7 @@ buster.testCase("Remote functions", { }).request(); }, - "ledger_entry index" : - function (done) { + "ledger_entry index" : function (done) { var self = this; this.remote.request_ledger_hash().on('success', function (r) { @@ -180,63 +168,64 @@ buster.testCase("Remote functions", { .request(); }, - "create account" : - function (done) { - this.remote.transaction() - .payment('root', 'alice', "10000.0") - .on('success', function (r) { - // console.log("account_root: %s", JSON.stringify(r)); + "create account" : function (done) { + var self = this; - // Need to verify account and balance. - buster.assert(true); - done(); - }) - .on('error', function(m) { - // console.log("error: %s", m); + var root_id = this.remote.account('root')._account_id; + this.remote.request_subscribe().accounts(root_id).request(); - buster.assert(false); - }) - .submit(); + this.remote.transaction() + .payment('root', 'alice', "10000.0") + .on('proposed', function(res) { + //console.log('Submitted', res); + self.remote.ledger_accept(); + }) + .on('success', function (r) { + //console.log("account_root: %s", JSON.stringify(r)); + // Need to verify account and balance. + buster.assert(true); + done(); + }) + .on('error', function(m) { + console.log('Error'); + console.log("error: %s", m); + buster.assert(false); + }) + .submit(); }, - "create account final" : - function (done) { + "create account final" : function (done) { var self = this; + var got_proposed; + var got_success; - var got_proposed; - var got_success; + var root_id = this.remote.account('root')._account_id; + this.remote.request_subscribe().accounts(root_id).request(); this.remote.transaction() .payment('root', 'alice', "10000.0") .on('success', function (r) { - // console.log("create_account: %s", JSON.stringify(r)); - - got_success = true; - }) + // console.log("create_account: %s", JSON.stringify(r)); + got_success = true; + }) .on('error', function (m) { - // console.log("error: %s", m); - - buster.assert(false); - }) + // console.log("error: %s", m); + buster.assert(false); + }) .on('final', function (m) { - // console.log("final: %s", JSON.stringify(m)); - - buster.assert(got_success && got_proposed); - done(); - }) - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - - // buster.assert.equals(m.result, 'terNO_DST_INSUF_XRP'); - buster.assert.equals(m.result, 'tesSUCCESS'); - - got_proposed = true; - - self.remote.ledger_accept(); - }) - .on('status', function (s) { - // console.log("status: %s", JSON.stringify(s)); - }) + // console.log("final: %s", JSON.stringify(m)); + buster.assert(got_success && got_proposed); + done(); + }) + .on('proposed', function() { + got_proposed = true; + self.remote.ledger_accept(); + }) + .on('submitted', function (m) { + // console.log("proposed: %s", JSON.stringify(m)); + // buster.assert.equals(m.result, 'terNO_DST_INSUF_XRP'); + buster.assert.equals(m.engine_result, 'tesSUCCESS'); + }) .submit(); }, }); diff --git a/test/send-test.js b/test/send-test.js index 15d363ddf..60b437810 100644 --- a/test/send-test.js +++ b/test/send-test.js @@ -14,266 +14,228 @@ var serverDelay = 1500; buster.testRunner.timeout = 5000; /* -buster.testCase("Fee Changes", { - 'setUp' : testutils.build_setup({no_server: true}), // - 'tearDown' : testutils.build_teardown(), + buster.testCase("Fee Changes", { + 'setUp' : testutils.build_setup({no_server: true}), // + 'tearDown' : testutils.build_teardown(), - "varying the fee for Payment" : - function (done) { + "varying the fee for Payment" : + function (done) { - this.remote.transaction() - .payment('root', 'alice', "10000") - .on('success', function (r) { - done(); - }).submit(); + this.remote.transaction() + .payment('root', 'alice', "10000") + .on('success', function (r) { + done(); + }).submit(); - this.remote.transaction() - .payment('root', 'alice', "20000") - .on('success', function (r) { - done(); - }).submit(); + this.remote.transaction() + .payment('root', 'alice', "20000") + .on('success', function (r) { + done(); + }).submit(); - } - }); - */ + } + }); + */ buster.testCase("Sending", { 'setUp' : testutils.build_setup(), //'setUp' : testutils.build_setup({verbose: true , no_server: true}), 'tearDown' : testutils.build_teardown(), - "send XRP to non-existent account with insufficent fee" : - function (done) { - var self = this; - var ledgers = 20; - var got_proposed; + "send XRP to non-existent account with insufficent fee" : function (done) { + var self = this; + var ledgers = 20; + var got_proposed; - this.remote.transaction() - .payment('root', 'alice', "1") - .on('success', function (r) { - // Transaction sent. - - // console.log("success: %s", JSON.stringify(r)); - }) - .on('pending', function() { - // Moving ledgers along. - // console.log("missing: %d", ledgers); - - ledgers -= 1; - if (ledgers) { - self.remote.ledger_accept(); - } - else { - buster.assert(false, "Final never received."); - done(); - } - }) - .on('lost', function () { - // Transaction did not make it in. - // console.log("lost"); - - buster.assert(true); - done(); - }) - .on('proposed', function (m) { - // Transaction got an error. - // console.log("proposed: %s", JSON.stringify(m)); - - buster.assert.equals(m.result, 'tecNO_DST_INSUF_XRP'); - - got_proposed = true; - - self.remote.ledger_accept(); // Move it along. - }) - .on('final', function (m) { - // console.log("final: %s", JSON.stringify(m, undefined, 2)); - - buster.assert.equals(m.metadata.TransactionResult, 'tecNO_DST_INSUF_XRP'); - done(); - }) - .on('error', function(m) { - // console.log("error: %s", m); - - buster.assert(false); - }) - .submit(); - }, + this.remote.transaction() + .payment('root', 'alice', "1") + .once('submitted', function (m) { + // Transaction got an error. + // console.log("proposed: %s", JSON.stringify(m)); + buster.assert.equals(m.engine_result, 'tecNO_DST_INSUF_XRP'); + got_proposed = true; + self.remote.ledger_accept(); // Move it along. + }) + .once('final', function (m) { + // console.log("final: %s", JSON.stringify(m, undefined, 2)); + buster.assert.equals(m.engine_result, 'tecNO_DST_INSUF_XRP'); + done(); + }) + .submit(); + }, // Also test transaction becomes lost after tecNO_DST. - "credit_limit to non-existent account = tecNO_DST" : - function (done) { - this.remote.transaction() - .ripple_line_set("root", "100/USD/alice") - .on('proposed', function (m) { - //console.log("proposed: %s", JSON.stringify(m)); + "credit_limit to non-existent account = tecNO_DST" : function (done) { + this.remote.transaction() + .ripple_line_set("root", "100/USD/alice") + .once('submitted', function (m) { + //console.log("proposed: %s", JSON.stringify(m)); - buster.assert.equals(m.result, 'tecNO_DST'); + buster.assert.equals(m.engine_result, 'tecNO_DST'); - done(); - }) - .submit(); + done(); + }) + .submit(); + }, + + "credit_limit" : function (done) { + var self = this; + + async.waterfall([ + function (callback) { + self.what = "Create accounts."; + + testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob", "mtgox"], callback); }, + function (callback) { + self.what = "Check a non-existent credit limit."; - "credit_limit" : - function (done) { - var self = this; + self.remote.request_ripple_balance("alice", "mtgox", "USD", 'CURRENT') + .on('ripple_state', function (m) { + callback(true); + }) + .on('error', function(m) { + // console.log("error: %s", JSON.stringify(m)); - async.waterfall([ - function (callback) { - self.what = "Create accounts."; - - testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob", "mtgox"], callback); - }, - function (callback) { - self.what = "Check a non-existent credit limit."; - - self.remote.request_ripple_balance("alice", "mtgox", "USD", 'CURRENT') - .on('ripple_state', function (m) { - callback(true); - }) - .on('error', function(m) { - // console.log("error: %s", JSON.stringify(m)); - - buster.assert.equals('remoteError', m.error); - buster.assert.equals('entryNotFound', m.remote.error); - callback(); - }) - .request(); - }, - function (callback) { - self.what = "Create a credit limit."; - - testutils.credit_limit(self.remote, "alice", "800/USD/mtgox", callback); - }, - function (callback) { - self.remote.request_ripple_balance("alice", "mtgox", "USD", 'CURRENT') - .on('ripple_state', function (m) { -// console.log("BALANCE: %s", JSON.stringify(m)); -// console.log("account_balance: %s", m.account_balance.to_text_full()); -// console.log("account_limit: %s", m.account_limit.to_text_full()); -// console.log("peer_balance: %s", m.peer_balance.to_text_full()); -// console.log("peer_limit: %s", m.peer_limit.to_text_full()); - buster.assert(m.account_balance.equals("0/USD/alice")); - buster.assert(m.account_limit.equals("800/USD/mtgox")); - buster.assert(m.peer_balance.equals("0/USD/mtgox")); - buster.assert(m.peer_limit.equals("0/USD/alice")); - - callback(); - }) - .request(); - }, - function (callback) { - self.what = "Modify a credit limit."; - - testutils.credit_limit(self.remote, "alice", "700/USD/mtgox", callback); - }, - function (callback) { - self.remote.request_ripple_balance("alice", "mtgox", "USD", 'CURRENT') - .on('ripple_state', function (m) { - buster.assert(m.account_balance.equals("0/USD/alice")); - buster.assert(m.account_limit.equals("700/USD/mtgox")); - buster.assert(m.peer_balance.equals("0/USD/mtgox")); - buster.assert(m.peer_limit.equals("0/USD/alice")); - - callback(); - }) - .request(); - }, - // Set negative limit. - function (callback) { - self.remote.transaction() - .ripple_line_set("alice", "-1/USD/mtgox") - .on('proposed', function (m) { - buster.assert.equals('temBAD_LIMIT', m.result); - - callback('temBAD_LIMIT' !== m.result); - }) - .submit(); - }, -// function (callback) { -// self.what = "Display ledger"; -// -// self.remote.request_ledger('current', true) -// .on('success', function (m) { -// console.log("Ledger: %s", JSON.stringify(m, undefined, 2)); -// -// callback(); -// }) -// .request(); -// }, - function (callback) { - self.what = "Zero a credit limit."; - - testutils.credit_limit(self.remote, "alice", "0/USD/mtgox", callback); - }, - function (callback) { - self.what = "Make sure line is deleted."; - - self.remote.request_ripple_balance("alice", "mtgox", "USD", 'CURRENT') - .on('ripple_state', function (m) { - // Used to keep lines. - // buster.assert(m.account_balance.equals("0/USD/alice")); - // buster.assert(m.account_limit.equals("0/USD/alice")); - // buster.assert(m.peer_balance.equals("0/USD/mtgox")); - // buster.assert(m.peer_limit.equals("0/USD/mtgox")); - - buster.assert(false); - }) - .on('error', function (m) { - // console.log("error: %s", JSON.stringify(m)); - buster.assert.equals('remoteError', m.error); - buster.assert.equals('entryNotFound', m.remote.error); - - callback(); - }) - .request(); - }, - // TODO Check in both owner books. - function (callback) { - self.what = "Set another limit."; - - testutils.credit_limit(self.remote, "alice", "600/USD/bob", callback); - }, - function (callback) { - self.what = "Set limit on other side."; - - testutils.credit_limit(self.remote, "bob", "500/USD/alice", callback); - }, - function (callback) { - self.what = "Check ripple_line's state from alice's pov."; - - self.remote.request_ripple_balance("alice", "bob", "USD", 'CURRENT') - .on('ripple_state', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - - buster.assert(m.account_balance.equals("0/USD/alice")); - buster.assert(m.account_limit.equals("600/USD/bob")); - buster.assert(m.peer_balance.equals("0/USD/bob")); - buster.assert(m.peer_limit.equals("500/USD/alice")); - - callback(); - }) - .request(); - }, - function (callback) { - self.what = "Check ripple_line's state from bob's pov."; - - self.remote.request_ripple_balance("bob", "alice", "USD", 'CURRENT') - .on('ripple_state', function (m) { - buster.assert(m.account_balance.equals("0/USD/bob")); - buster.assert(m.account_limit.equals("500/USD/alice")); - buster.assert(m.peer_balance.equals("0/USD/alice")); - buster.assert(m.peer_limit.equals("600/USD/bob")); - - callback(); - }) - .request(); - }, - ], function (error) { - buster.refute(error, self.what); - done(); - }); + buster.assert.equals('remoteError', m.error); + buster.assert.equals('entryNotFound', m.remote.error); + callback(); + }) + .request(); }, + function (callback) { + self.what = "Create a credit limit."; + + testutils.credit_limit(self.remote, "alice", "800/USD/mtgox", callback); + }, + function (callback) { + self.remote.request_ripple_balance("alice", "mtgox", "USD", 'CURRENT') + .on('ripple_state', function (m) { + // console.log("BALANCE: %s", JSON.stringify(m)); + // console.log("account_balance: %s", m.account_balance.to_text_full()); + // console.log("account_limit: %s", m.account_limit.to_text_full()); + // console.log("peer_balance: %s", m.peer_balance.to_text_full()); + // console.log("peer_limit: %s", m.peer_limit.to_text_full()); + buster.assert(m.account_balance.equals("0/USD/alice")); + buster.assert(m.account_limit.equals("800/USD/mtgox")); + buster.assert(m.peer_balance.equals("0/USD/mtgox")); + buster.assert(m.peer_limit.equals("0/USD/alice")); + + callback(); + }) + .request(); + }, + function (callback) { + self.what = "Modify a credit limit."; + + testutils.credit_limit(self.remote, "alice", "700/USD/mtgox", callback); + }, + function (callback) { + self.remote.request_ripple_balance("alice", "mtgox", "USD", 'CURRENT') + .on('ripple_state', function (m) { + buster.assert(m.account_balance.equals("0/USD/alice")); + buster.assert(m.account_limit.equals("700/USD/mtgox")); + buster.assert(m.peer_balance.equals("0/USD/mtgox")); + buster.assert(m.peer_limit.equals("0/USD/alice")); + + callback(); + }) + .request(); + }, + // Set negative limit. + function (callback) { + self.remote.transaction() + .ripple_line_set("alice", "-1/USD/mtgox") + .once('submitted', function (m) { + buster.assert.equals('temBAD_LIMIT', m.engine_result); + callback(); + }) + .submit(); + }, + // function (callback) { + // self.what = "Display ledger"; + // + // self.remote.request_ledger('current', true) + // .on('success', function (m) { + // console.log("Ledger: %s", JSON.stringify(m, undefined, 2)); + // + // callback(); + // }) + // .request(); + // }, + function (callback) { + self.what = "Zero a credit limit."; + + testutils.credit_limit(self.remote, "alice", "0/USD/mtgox", callback); + }, + function (callback) { + self.what = "Make sure line is deleted."; + + self.remote.request_ripple_balance("alice", "mtgox", "USD", 'CURRENT') + .on('ripple_state', function (m) { + // Used to keep lines. + // buster.assert(m.account_balance.equals("0/USD/alice")); + // buster.assert(m.account_limit.equals("0/USD/alice")); + // buster.assert(m.peer_balance.equals("0/USD/mtgox")); + // buster.assert(m.peer_limit.equals("0/USD/mtgox")); + + buster.assert(false); + }) + .on('error', function (m) { + // console.log("error: %s", JSON.stringify(m)); + buster.assert.equals('remoteError', m.error); + buster.assert.equals('entryNotFound', m.remote.error); + + callback(); + }) + .request(); + }, + // TODO Check in both owner books. + function (callback) { + self.what = "Set another limit."; + + testutils.credit_limit(self.remote, "alice", "600/USD/bob", callback); + }, + function (callback) { + self.what = "Set limit on other side."; + + testutils.credit_limit(self.remote, "bob", "500/USD/alice", callback); + }, + function (callback) { + self.what = "Check ripple_line's state from alice's pov."; + + self.remote.request_ripple_balance("alice", "bob", "USD", 'CURRENT') + .on('ripple_state', function (m) { + // console.log("proposed: %s", JSON.stringify(m)); + + buster.assert(m.account_balance.equals("0/USD/alice")); + buster.assert(m.account_limit.equals("600/USD/bob")); + buster.assert(m.peer_balance.equals("0/USD/bob")); + buster.assert(m.peer_limit.equals("500/USD/alice")); + + callback(); + }) + .request(); + }, + function (callback) { + self.what = "Check ripple_line's state from bob's pov."; + + self.remote.request_ripple_balance("bob", "alice", "USD", 'CURRENT') + .on('ripple_state', function (m) { + buster.assert(m.account_balance.equals("0/USD/bob")); + buster.assert(m.account_limit.equals("500/USD/alice")); + buster.assert(m.peer_balance.equals("0/USD/alice")); + buster.assert(m.peer_limit.equals("600/USD/bob")); + + callback(); + }) + .request(); + }, + ], function (error) { + buster.refute(error, self.what); + done(); + }); + }, }); // XXX In the future add ledger_accept after partial retry is implemented in the server. @@ -282,213 +244,212 @@ buster.testCase("Sending future", { // 'setUp' : testutils.build_setup({ verbose : true }), 'tearDown' : testutils.build_teardown(), - "direct ripple" : - function (done) { - var self = this; + "direct ripple" : function (done) { + var self = this; - // self.remote.set_trace(); + // self.remote.set_trace(); - async.waterfall([ - function (callback) { - self.what = "Create accounts."; + async.waterfall([ + function (callback) { + self.what = "Create accounts."; - testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob"], callback); - }, - function (callback) { - self.what = "Set alice's limit."; - - testutils.credit_limit(self.remote, "alice", "600/USD/bob", callback); - }, - function (callback) { - self.what = "Set bob's limit."; - - testutils.credit_limit(self.remote, "bob", "700/USD/alice", callback); - }, - function (callback) { - self.what = "Set alice send bob partial with alice as issuer."; - - self.remote.transaction() - .payment('alice', 'bob', "24/USD/alice") - .once('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); - }) - .once('final', function (m) { - buster.assert(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Verify balance."; - - self.remote.request_ripple_balance("alice", "bob", "USD", 'CURRENT') - .once('ripple_state', function (m) { - buster.assert(m.account_balance.equals("-24/USD/alice")); - buster.assert(m.peer_balance.equals("24/USD/bob")); - - callback(); - }) - .request(); - }, - function (callback) { - self.what = "Set alice send bob more with bob as issuer."; - - self.remote.transaction() - .payment('alice', 'bob', "33/USD/bob") - .once('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); - }) - .once('final', function (m) { - buster.assert(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Verify balance from bob's pov."; - - self.remote.request_ripple_balance("bob", "alice", "USD", 'CURRENT') - .once('ripple_state', function (m) { - buster.assert(m.account_balance.equals("57/USD/bob")); - buster.assert(m.peer_balance.equals("-57/USD/alice")); - - callback(); - }) - .request(); - }, - function (callback) { - self.what = "Bob send back more than sent."; - - self.remote.transaction() - .payment('bob', 'alice', "90/USD/bob") - .once('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); - }) - .once('final', function (m) { - buster.assert(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Verify balance from alice's pov: 1"; - - self.remote.request_ripple_balance("alice", "bob", "USD", 'CURRENT') - .once('ripple_state', function (m) { - buster.assert(m.account_balance.equals("33/USD/alice")); - - callback(); - }) - .request(); - }, - function (callback) { - self.what = "Alice send to limit."; - - self.remote.transaction() - .payment('alice', 'bob', "733/USD/bob") - .once('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); - }) - .once('final', function (m) { - buster.assert(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Verify balance from alice's pov: 2"; - - self.remote.request_ripple_balance("alice", "bob", "USD", 'CURRENT') - .once('ripple_state', function (m) { - buster.assert(m.account_balance.equals("-700/USD/alice")); - - callback(); - }) - .request(); - }, - function (callback) { - self.what = "Bob send to limit."; - - self.remote.transaction() - .payment('bob', 'alice', "1300/USD/bob") - .once('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); - }) - .once('final', function (m) { - buster.assert(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Verify balance from alice's pov: 3"; - - self.remote.request_ripple_balance("alice", "bob", "USD", 'CURRENT') - .once('ripple_state', function (m) { - buster.assert(m.account_balance.equals("600/USD/alice")); - - callback(); - }) - .request(); - }, - function (callback) { - // If this gets applied out of order, it could stop the big payment. - self.what = "Bob send past limit."; - - self.remote.transaction() - .payment('bob', 'alice', "1/USD/bob") - .once('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tecPATH_DRY'); - }) - .submit(); - }, - function (callback) { - self.what = "Verify balance from alice's pov: 4"; - - self.remote.request_ripple_balance("alice", "bob", "USD", 'CURRENT') - .once('ripple_state', function (m) { - buster.assert(m.account_balance.equals("600/USD/alice")); - - callback(); - }) - .request(); - }, -// function (callback) { -// // Make sure all is good after canonical ordering. -// self.what = "Close the ledger and check balance."; -// -// self.remote -// .once('ledger_closed', function (message) { -// // console.log("LEDGER_CLOSED: A: %d: %s", ledger_closed_index, ledger_closed); -// callback(); -// }) -// .ledger_accept(); -// }, -// function (callback) { -// self.what = "Verify balance from alice's pov: 5"; -// -// self.remote.request_ripple_balance("alice", "bob", "USD", 'CURRENT') -// .once('ripple_state', function (m) { -// console.log("account_balance: %s", m.account_balance.to_text_full()); -// console.log("account_limit: %s", m.account_limit.to_text_full()); -// console.log("peer_balance: %s", m.peer_balance.to_text_full()); -// console.log("peer_limit: %s", m.peer_limit.to_text_full()); -// -// buster.assert(m.account_balance.equals("600/USD/alice")); -// -// callback(); -// }) -// .request(); -// }, - ], function (error) { - buster.refute(error, self.what); - done(); - }); + testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob"], callback); }, + function (callback) { + self.what = "Set alice's limit."; - // Ripple without credit path. - // Ripple with one-way credit path. + testutils.credit_limit(self.remote, "alice", "600/USD/bob", callback); + }, + function (callback) { + self.what = "Set bob's limit."; + + testutils.credit_limit(self.remote, "bob", "700/USD/alice", callback); + }, + function (callback) { + self.what = "Set alice send bob partial with alice as issuer."; + + self.remote.transaction() + .payment('alice', 'bob', "24/USD/alice") + .once('submitted', function (m) { + // console.log("proposed: %s", JSON.stringify(m)); + callback(m.engine_result !== 'tesSUCCESS'); + }) + .once('final', function (m) { + buster.assert(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Verify balance."; + + self.remote.request_ripple_balance("alice", "bob", "USD", 'CURRENT') + .once('ripple_state', function (m) { + buster.assert(m.account_balance.equals("-24/USD/alice")); + buster.assert(m.peer_balance.equals("24/USD/bob")); + + callback(); + }) + .request(); + }, + function (callback) { + self.what = "Set alice send bob more with bob as issuer."; + + self.remote.transaction() + .payment('alice', 'bob', "33/USD/bob") + .once('submitted', function (m) { + // console.log("proposed: %s", JSON.stringify(m)); + callback(m.engine_result !== 'tesSUCCESS'); + }) + .once('final', function (m) { + buster.assert(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Verify balance from bob's pov."; + + self.remote.request_ripple_balance("bob", "alice", "USD", 'CURRENT') + .once('ripple_state', function (m) { + buster.assert(m.account_balance.equals("57/USD/bob")); + buster.assert(m.peer_balance.equals("-57/USD/alice")); + + callback(); + }) + .request(); + }, + function (callback) { + self.what = "Bob send back more than sent."; + + self.remote.transaction() + .payment('bob', 'alice', "90/USD/bob") + .once('submitted', function (m) { + // console.log("proposed: %s", JSON.stringify(m)); + callback(m.engine_result !== 'tesSUCCESS'); + }) + .once('final', function (m) { + buster.assert(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Verify balance from alice's pov: 1"; + + self.remote.request_ripple_balance("alice", "bob", "USD", 'CURRENT') + .once('ripple_state', function (m) { + buster.assert(m.account_balance.equals("33/USD/alice")); + + callback(); + }) + .request(); + }, + function (callback) { + self.what = "Alice send to limit."; + + self.remote.transaction() + .payment('alice', 'bob', "733/USD/bob") + .once('submitted', function (m) { + // console.log("submitted: %s", JSON.stringify(m)); + callback(m.engine_result !== 'tesSUCCESS'); + }) + .once('final', function (m) { + buster.assert(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Verify balance from alice's pov: 2"; + + self.remote.request_ripple_balance("alice", "bob", "USD", 'CURRENT') + .once('ripple_state', function (m) { + buster.assert(m.account_balance.equals("-700/USD/alice")); + + callback(); + }) + .request(); + }, + function (callback) { + self.what = "Bob send to limit."; + + self.remote.transaction() + .payment('bob', 'alice', "1300/USD/bob") + .once('submitted', function (m) { + // console.log("submitted: %s", JSON.stringify(m)); + callback(m.engine_result !== 'tesSUCCESS'); + }) + .once('final', function (m) { + buster.assert(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Verify balance from alice's pov: 3"; + + self.remote.request_ripple_balance("alice", "bob", "USD", 'CURRENT') + .once('ripple_state', function (m) { + buster.assert(m.account_balance.equals("600/USD/alice")); + + callback(); + }) + .request(); + }, + function (callback) { + // If this gets applied out of order, it could stop the big payment. + self.what = "Bob send past limit."; + + self.remote.transaction() + .payment('bob', 'alice', "1/USD/bob") + .once('submitted', function (m) { + // console.log("submitted: %s", JSON.stringify(m)); + callback(m.engine_result !== 'tecPATH_DRY'); + }) + .submit(); + }, + function (callback) { + self.what = "Verify balance from alice's pov: 4"; + + self.remote.request_ripple_balance("alice", "bob", "USD", 'CURRENT') + .once('ripple_state', function (m) { + buster.assert(m.account_balance.equals("600/USD/alice")); + + callback(); + }) + .request(); + }, + // function (callback) { + // // Make sure all is good after canonical ordering. + // self.what = "Close the ledger and check balance."; + // + // self.remote + // .once('ledger_closed', function (message) { + // // console.log("LEDGER_CLOSED: A: %d: %s", ledger_closed_index, ledger_closed); + // callback(); + // }) + // .ledger_accept(); + // }, + // function (callback) { + // self.what = "Verify balance from alice's pov: 5"; + // + // self.remote.request_ripple_balance("alice", "bob", "USD", 'CURRENT') + // .once('ripple_state', function (m) { + // console.log("account_balance: %s", m.account_balance.to_text_full()); + // console.log("account_limit: %s", m.account_limit.to_text_full()); + // console.log("peer_balance: %s", m.peer_balance.to_text_full()); + // console.log("peer_limit: %s", m.peer_limit.to_text_full()); + // + // buster.assert(m.account_balance.equals("600/USD/alice")); + // + // callback(); + // }) + // .request(); + // }, + ], function (error) { + buster.refute(error, self.what); + done(); + }); + }, + + // Ripple without credit path. + // Ripple with one-way credit path. }); buster.testCase("Gateway", { @@ -496,554 +457,550 @@ buster.testCase("Gateway", { // 'setUp' : testutils.build_setup({ verbose: true }), 'tearDown' : testutils.build_teardown(), - "customer to customer with and without transfer fee" : - function (done) { - var self = this; + "customer to customer with and without transfer fee" : function (done) { + var self = this; - // self.remote.set_trace(); + // self.remote.set_trace(); - async.waterfall([ - function (callback) { - self.what = "Create accounts."; + async.waterfall([ + function (callback) { + self.what = "Create accounts."; - testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob", "mtgox"], callback); - }, - function (callback) { - self.what = "Set credit limits."; - - testutils.credit_limits(self.remote, - { - "alice" : "100/AUD/mtgox", - "bob" : "100/AUD/mtgox", - }, - callback); - }, - function (callback) { - self.what = "Distribute funds."; - - testutils.payments(self.remote, - { - "mtgox" : [ "1/AUD/alice" ], - }, - callback); - }, - function (callback) { - self.what = "Verify balances."; - - testutils.verify_balances(self.remote, - { - "alice" : "1/AUD/mtgox", - "mtgox" : "-1/AUD/alice", - }, - callback); - }, - function (callback) { - self.what = "Alice sends Bob 1 AUD"; - - self.remote.transaction() - .payment("alice", "bob", "1/AUD/mtgox") - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Verify balances 2."; - - testutils.verify_balances(self.remote, - { - "alice" : "0/AUD/mtgox", - "bob" : "1/AUD/mtgox", - "mtgox" : "-1/AUD/bob", - }, - callback); - }, - function (callback) { - self.what = "Set transfer rate."; - - self.remote.transaction() - .account_set("mtgox") - .transfer_rate(1e9*1.1) - .once('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Bob sends Alice 0.5 AUD"; - - self.remote.transaction() - .payment("bob", "alice", "0.5/AUD/mtgox") - .send_max("0.55/AUD/mtgox") // !!! Very important. - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Verify balances 3."; - - testutils.verify_balances(self.remote, - { - "alice" : "0.5/AUD/mtgox", - "bob" : "0.45/AUD/mtgox", - "mtgox" : [ "-0.5/AUD/alice","-0.45/AUD/bob" ], - }, - callback); - }, - ], function (error) { - buster.refute(error, self.what); - done(); - }); + testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob", "mtgox"], callback); }, + function (callback) { + self.what = "Set credit limits."; - "customer to customer, transfer fee, default path with and without specific issuer for Amount and SendMax" : - function (done) { - var self = this; - - // self.remote.set_trace(); - - async.waterfall([ - function (callback) { - self.what = "Create accounts."; - - testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob", "mtgox"], callback); - }, - function (callback) { - self.what = "Set transfer rate."; - - self.remote.transaction() - .account_set("mtgox") - .transfer_rate(1e9*1.1) - .once('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Set credit limits."; - - testutils.credit_limits(self.remote, - { - "alice" : "100/AUD/mtgox", - "bob" : "100/AUD/mtgox", - }, - callback); - }, - function (callback) { - self.what = "Distribute funds."; - - testutils.payments(self.remote, - { - "mtgox" : [ "4.4/AUD/alice" ], - }, - callback); - }, - function (callback) { - self.what = "Verify balances."; - - testutils.verify_balances(self.remote, - { - "alice" : "4.4/AUD/mtgox", - }, - callback); - }, - function (callback) { - self.what = "Alice sends 1.1/AUD/mtgox Bob 1/AUD/mtgox"; - - self.remote.transaction() - .payment("alice", "bob", "1/AUD/mtgox") - .send_max("1.1/AUD/mtgox") - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Verify balances 2."; - - testutils.verify_balances(self.remote, - { - "alice" : "3.3/AUD/mtgox", - "bob" : "1/AUD/mtgox", - }, - callback); - }, - function (callback) { - self.what = "Alice sends 1.1/AUD/mtgox Bob 1/AUD/bob"; - - self.remote.transaction() - .payment("alice", "bob", "1/AUD/bob") - .send_max("1.1/AUD/mtgox") - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Verify balances 3."; - - testutils.verify_balances(self.remote, - { - "alice" : "2.2/AUD/mtgox", - "bob" : "2/AUD/mtgox", - }, - callback); - }, - function (callback) { - self.what = "Alice sends 1.1/AUD/alice Bob 1/AUD/mtgox"; - - self.remote.transaction() - .payment("alice", "bob", "1/AUD/mtgox") - .send_max("1.1/AUD/alice") - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Verify balances 4."; - - testutils.verify_balances(self.remote, - { - "alice" : "1.1/AUD/mtgox", - "bob" : "3/AUD/mtgox", - }, - callback); - }, - function (callback) { - // Must fail, doesn't know to use the mtgox - self.what = "Alice sends 1.1/AUD/alice Bob 1/AUD/bob"; - - self.remote.transaction() - .payment("alice", "bob", "1/AUD/bob") - .send_max("1.1/AUD/alice") - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'terNO_LINE'); - }) - .submit(); - }, - function (callback) { - self.what = "Verify balances 5."; - - testutils.verify_balances(self.remote, - { - "alice" : "1.1/AUD/mtgox", - "bob" : "3/AUD/mtgox", - }, - callback); - }, - ], function (error) { - buster.refute(error, self.what); - done(); - }); + testutils.credit_limits(self.remote, + { + "alice" : "100/AUD/mtgox", + "bob" : "100/AUD/mtgox", + }, + callback); }, + function (callback) { + self.what = "Distribute funds."; - "subscribe test: customer to customer with and without transfer fee" : - function (done) { - var self = this; - - // self.remote.set_trace(); - - async.waterfall([ - function (callback) { - self.what = "Create accounts."; - - testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob", "mtgox"], callback); - }, - function (callback) { testutils.ledger_close(self.remote, callback); }, - function (callback) { - self.what = "Set credit limits."; - - testutils.credit_limits(self.remote, - { - "alice" : "100/AUD/mtgox", - "bob" : "100/AUD/mtgox", - }, - callback); - }, - function (callback) { testutils.ledger_close(self.remote, callback); }, - function (callback) { - self.what = "Distribute funds."; - - testutils.payments(self.remote, - { - "mtgox" : [ "1/AUD/alice" ], - }, - callback); - }, - function (callback) { testutils.ledger_close(self.remote, callback); }, - function (callback) { - self.what = "Verify balances."; - - testutils.verify_balances(self.remote, - { - "alice" : "1/AUD/mtgox", - "mtgox" : "-1/AUD/alice", - }, - callback); - }, - function (callback) { - self.what = "Alice sends Bob 1 AUD"; - - self.remote.transaction() - .payment("alice", "bob", "1/AUD/mtgox") - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { testutils.ledger_close(self.remote, callback); }, - function (callback) { - self.what = "Verify balances 2."; - - testutils.verify_balances(self.remote, - { - "alice" : "0/AUD/mtgox", - "bob" : "1/AUD/mtgox", - "mtgox" : "-1/AUD/bob", - }, - callback); - }, - function (callback) { - self.what = "Set transfer rate."; - - self.remote.transaction() - .account_set("mtgox") - .transfer_rate(1e9*1.1) - .once('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { testutils.ledger_close(self.remote, callback); }, - function (callback) { - self.what = "Bob sends Alice 0.5 AUD"; - - self.remote.transaction() - .payment("bob", "alice", "0.5/AUD/mtgox") - .send_max("0.55/AUD/mtgox") // !!! Very important. - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Verify balances 3."; - - testutils.verify_balances(self.remote, - { - "alice" : "0.5/AUD/mtgox", - "bob" : "0.45/AUD/mtgox", - "mtgox" : [ "-0.5/AUD/alice","-0.45/AUD/bob" ], - }, - callback); - }, - function (callback) { - self.what = "Subscribe and accept."; - - self.count = 0; - self.found = 0; - - self.remote.on('ledger_closed', function (m) { - // console.log("#### LEDGER_CLOSE: %s", JSON.stringify(m)); - }); - - self.remote - .on('transaction', function (m) { - // console.log("ACCOUNT: %s", JSON.stringify(m)); - self.found = 1; - }) - .on('ledger_closed', function (m) { - // console.log("LEDGER_CLOSE: %d: %s", self.count, JSON.stringify(m)); - - if (self.count) { - callback(!self.found); - } - else { - self.count = 1; - - self.remote.ledger_accept(); - } - }) - .request_subscribe().accounts("mtgox") - .request(); - - self.remote.ledger_accept(); - }, - ], function (error) { - buster.refute(error, self.what); - done(); - }); + testutils.payments(self.remote, + { + "mtgox" : [ "1/AUD/alice" ], + }, + callback); }, + function (callback) { + self.what = "Verify balances."; - "subscribe test: customer to customer with and without transfer fee: transaction retry logic" : - function (done) { - var self = this; - - // self.remote.set_trace(); - - async.waterfall([ - function (callback) { - self.what = "Create accounts."; - - testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob", "mtgox"], callback); - }, - function (callback) { - self.what = "Set credit limits."; - - testutils.credit_limits(self.remote, - { - "alice" : "100/AUD/mtgox", - "bob" : "100/AUD/mtgox", - }, - callback); - }, - function (callback) { - self.what = "Distribute funds."; - - testutils.payments(self.remote, - { - "mtgox" : [ "1/AUD/alice" ], - }, - callback); - }, - function (callback) { - self.what = "Verify balances."; - - testutils.verify_balances(self.remote, - { - "alice" : "1/AUD/mtgox", - "mtgox" : "-1/AUD/alice", - }, - callback); - }, - function (callback) { - self.what = "Alice sends Bob 1 AUD"; - - self.remote.transaction() - .payment("alice", "bob", "1/AUD/mtgox") - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Verify balances 2."; - - testutils.verify_balances(self.remote, - { - "alice" : "0/AUD/mtgox", - "bob" : "1/AUD/mtgox", - "mtgox" : "-1/AUD/bob", - }, - callback); - }, -// function (callback) { -// self.what = "Set transfer rate."; -// -// self.remote.transaction() -// .account_set("mtgox") -// .transfer_rate(1e9*1.1) -// .once('proposed', function (m) { -// // console.log("proposed: %s", JSON.stringify(m)); -// callback(m.result !== 'tesSUCCESS'); -// }) -// .submit(); -// }, - function (callback) { - self.what = "Bob sends Alice 0.5 AUD"; - - self.remote.transaction() - .payment("bob", "alice", "0.5/AUD/mtgox") -// .send_max("0.55/AUD/mtgox") // !!! Very important. - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Verify balances 3."; - - testutils.verify_balances(self.remote, - { - "alice" : "0.5/AUD/mtgox", - "bob" : "0.5/AUD/mtgox", - "mtgox" : [ "-0.5/AUD/alice","-0.5/AUD/bob" ], - }, - callback); - }, - function (callback) { - self.what = "Subscribe and accept."; - - self.count = 0; - self.found = 0; - - self.remote.on('ledger_closed', function (m) { - // console.log("#### LEDGER_CLOSE: %s", JSON.stringify(m)); - }); - - self.remote - .on('transaction', function (m) { - // console.log("ACCOUNT: %s", JSON.stringify(m)); - self.found = 1; - }) - .on('ledger_closed', function (m) { - // console.log("LEDGER_CLOSE: %d: %s", self.count, JSON.stringify(m)); - - if (self.count) { - callback(!self.found); - } - else { - self.count = 1; - - self.remote.ledger_accept(); - } - }) - .request_subscribe().accounts("mtgox") - .request(); - - self.remote.ledger_accept(); - }, - function (callback) { - self.what = "Verify balances 4."; - - testutils.verify_balances(self.remote, - { - "alice" : "0.5/AUD/mtgox", - "bob" : "0.5/AUD/mtgox", - "mtgox" : [ "-0.5/AUD/alice","-0.5/AUD/bob" ], - }, - callback); - }, - ], function (error) { - buster.refute(error, self.what); - done(); - }); + testutils.verify_balances(self.remote, + { + "alice" : "1/AUD/mtgox", + "mtgox" : "-1/AUD/alice", + }, + callback); }, + function (callback) { + self.what = "Alice sends Bob 1 AUD"; + + self.remote.transaction() + .payment("alice", "bob", "1/AUD/mtgox") + .on('proposed', function (m) { + // console.log("proposed: %s", JSON.stringify(m)); + + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Verify balances 2."; + + testutils.verify_balances(self.remote, + { + "alice" : "0/AUD/mtgox", + "bob" : "1/AUD/mtgox", + "mtgox" : "-1/AUD/bob", + }, + callback); + }, + function (callback) { + self.what = "Set transfer rate."; + + self.remote.transaction() + .account_set("mtgox") + .transfer_rate(1e9*1.1) + .once('proposed', function (m) { + // console.log("proposed: %s", JSON.stringify(m)); + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Bob sends Alice 0.5 AUD"; + + self.remote.transaction() + .payment("bob", "alice", "0.5/AUD/mtgox") + .send_max("0.55/AUD/mtgox") // !!! Very important. + .on('proposed', function (m) { + // console.log("proposed: %s", JSON.stringify(m)); + + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Verify balances 3."; + + testutils.verify_balances(self.remote, + { + "alice" : "0.5/AUD/mtgox", + "bob" : "0.45/AUD/mtgox", + "mtgox" : [ "-0.5/AUD/alice","-0.45/AUD/bob" ], + }, + callback); + }, + ], function (error) { + buster.refute(error, self.what); + done(); + }); + }, + + "customer to customer, transfer fee, default path with and without specific issuer for Amount and SendMax" : function (done) { + var self = this; + + // self.remote.set_trace(); + + async.waterfall([ + function (callback) { + self.what = "Create accounts."; + + testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob", "mtgox"], callback); + }, + function (callback) { + self.what = "Set transfer rate."; + + self.remote.transaction() + .account_set("mtgox") + .transfer_rate(1e9*1.1) + .once('submitted', function (m) { + // console.log("submitted: %s", JSON.stringify(m)); + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Set credit limits."; + + testutils.credit_limits(self.remote, + { + "alice" : "100/AUD/mtgox", + "bob" : "100/AUD/mtgox", + }, + callback); + }, + function (callback) { + self.what = "Distribute funds."; + + testutils.payments(self.remote, + { + "mtgox" : [ "4.4/AUD/alice" ], + }, + callback); + }, + function (callback) { + self.what = "Verify balances."; + + testutils.verify_balances(self.remote, + { + "alice" : "4.4/AUD/mtgox", + }, + callback); + }, + function (callback) { + self.what = "Alice sends 1.1/AUD/mtgox Bob 1/AUD/mtgox"; + + self.remote.transaction() + .payment("alice", "bob", "1/AUD/mtgox") + .send_max("1.1/AUD/mtgox") + .once('submitted', function (m) { + // console.log("submitted: %s", JSON.stringify(m)); + + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Verify balances 2."; + + testutils.verify_balances(self.remote, + { + "alice" : "3.3/AUD/mtgox", + "bob" : "1/AUD/mtgox", + }, + callback); + }, + function (callback) { + self.what = "Alice sends 1.1/AUD/mtgox Bob 1/AUD/bob"; + + self.remote.transaction() + .payment("alice", "bob", "1/AUD/bob") + .send_max("1.1/AUD/mtgox") + .once('submitted', function (m) { + // console.log("submitted: %s", JSON.stringify(m)); + + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Verify balances 3."; + + testutils.verify_balances(self.remote, + { + "alice" : "2.2/AUD/mtgox", + "bob" : "2/AUD/mtgox", + }, + callback); + }, + function (callback) { + self.what = "Alice sends 1.1/AUD/alice Bob 1/AUD/mtgox"; + + self.remote.transaction() + .payment("alice", "bob", "1/AUD/mtgox") + .send_max("1.1/AUD/alice") + .once('submitted', function (m) { + // console.log("submitted: %s", JSON.stringify(m)); + + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Verify balances 4."; + + testutils.verify_balances(self.remote, + { + "alice" : "1.1/AUD/mtgox", + "bob" : "3/AUD/mtgox", + }, + callback); + }, + function (callback) { + // Must fail, doesn't know to use the mtgox + self.what = "Alice sends 1.1/AUD/alice Bob 1/AUD/bob"; + + self.remote.transaction() + .payment("alice", "bob", "1/AUD/bob") + .send_max("1.1/AUD/alice") + .once('submitted', function (m) { + // console.log("submitted: %s", JSON.stringify(m)); + + callback(m.engine_result !== 'terNO_LINE'); + }) + .submit(); + }, + function (callback) { + self.what = "Verify balances 5."; + + testutils.verify_balances(self.remote, + { + "alice" : "1.1/AUD/mtgox", + "bob" : "3/AUD/mtgox", + }, + callback); + }, + ], function (error) { + buster.refute(error, self.what); + done(); + }); + }, + + "subscribe test: customer to customer with and without transfer fee" : function (done) { + var self = this; + + // self.remote.set_trace(); + + async.waterfall([ + function (callback) { + self.what = "Create accounts."; + + testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob", "mtgox"], callback); + }, + function (callback) { testutils.ledger_close(self.remote, callback); }, + function (callback) { + self.what = "Set credit limits."; + + testutils.credit_limits(self.remote, + { + "alice" : "100/AUD/mtgox", + "bob" : "100/AUD/mtgox", + }, + callback); + }, + function (callback) { testutils.ledger_close(self.remote, callback); }, + function (callback) { + self.what = "Distribute funds."; + + testutils.payments(self.remote, + { + "mtgox" : [ "1/AUD/alice" ], + }, + callback); + }, + function (callback) { testutils.ledger_close(self.remote, callback); }, + function (callback) { + self.what = "Verify balances."; + + testutils.verify_balances(self.remote, + { + "alice" : "1/AUD/mtgox", + "mtgox" : "-1/AUD/alice", + }, + callback); + }, + function (callback) { + self.what = "Alice sends Bob 1 AUD"; + + self.remote.transaction() + .payment("alice", "bob", "1/AUD/mtgox") + .on('proposed', function (m) { + // console.log("proposed: %s", JSON.stringify(m)); + + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { testutils.ledger_close(self.remote, callback); }, + function (callback) { + self.what = "Verify balances 2."; + + testutils.verify_balances(self.remote, + { + "alice" : "0/AUD/mtgox", + "bob" : "1/AUD/mtgox", + "mtgox" : "-1/AUD/bob", + }, + callback); + }, + function (callback) { + self.what = "Set transfer rate."; + + self.remote.transaction() + .account_set("mtgox") + .transfer_rate(1e9*1.1) + .once('proposed', function (m) { + // console.log("proposed: %s", JSON.stringify(m)); + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { testutils.ledger_close(self.remote, callback); }, + function (callback) { + self.what = "Bob sends Alice 0.5 AUD"; + + self.remote.transaction() + .payment("bob", "alice", "0.5/AUD/mtgox") + .send_max("0.55/AUD/mtgox") // !!! Very important. + .on('proposed', function (m) { + // console.log("proposed: %s", JSON.stringify(m)); + + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Verify balances 3."; + + testutils.verify_balances(self.remote, + { + "alice" : "0.5/AUD/mtgox", + "bob" : "0.45/AUD/mtgox", + "mtgox" : [ "-0.5/AUD/alice","-0.45/AUD/bob" ], + }, + callback); + }, + function (callback) { + self.what = "Subscribe and accept."; + + self.count = 0; + self.found = 0; + + self.remote.on('ledger_closed', function (m) { + // console.log("#### LEDGER_CLOSE: %s", JSON.stringify(m)); + }); + + self.remote + .on('transaction', function (m) { + // console.log("ACCOUNT: %s", JSON.stringify(m)); + self.found = 1; + }) + .on('ledger_closed', function (m) { + // console.log("LEDGER_CLOSE: %d: %s", self.count, JSON.stringify(m)); + + if (self.count) { + callback(!self.found); + } + else { + self.count = 1; + + self.remote.ledger_accept(); + } + }) + .request_subscribe().accounts("mtgox") + .request(); + + self.remote.ledger_accept(); + }, + ], function (error) { + buster.refute(error, self.what); + done(); + }); + }, + + "subscribe test: customer to customer with and without transfer fee: transaction retry logic" : function (done) { + var self = this; + + // self.remote.set_trace(); + + async.waterfall([ + function (callback) { + self.what = "Create accounts."; + + testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob", "mtgox"], callback); + }, + function (callback) { + self.what = "Set credit limits."; + + testutils.credit_limits(self.remote, + { + "alice" : "100/AUD/mtgox", + "bob" : "100/AUD/mtgox", + }, + callback); + }, + function (callback) { + self.what = "Distribute funds."; + + testutils.payments(self.remote, + { + "mtgox" : [ "1/AUD/alice" ], + }, + callback); + }, + function (callback) { + self.what = "Verify balances."; + + testutils.verify_balances(self.remote, + { + "alice" : "1/AUD/mtgox", + "mtgox" : "-1/AUD/alice", + }, + callback); + }, + function (callback) { + self.what = "Alice sends Bob 1 AUD"; + + self.remote.transaction() + .payment("alice", "bob", "1/AUD/mtgox") + .on('proposed', function (m) { + // console.log("proposed: %s", JSON.stringify(m)); + + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Verify balances 2."; + + testutils.verify_balances(self.remote, + { + "alice" : "0/AUD/mtgox", + "bob" : "1/AUD/mtgox", + "mtgox" : "-1/AUD/bob", + }, + callback); + }, + // function (callback) { + // self.what = "Set transfer rate."; + // + // self.remote.transaction() + // .account_set("mtgox") + // .transfer_rate(1e9*1.1) + // .once('proposed', function (m) { + // // console.log("proposed: %s", JSON.stringify(m)); + // callback(m.engine_result !== 'tesSUCCESS'); + // }) + // .submit(); + // }, + function (callback) { + self.what = "Bob sends Alice 0.5 AUD"; + + self.remote.transaction() + .payment("bob", "alice", "0.5/AUD/mtgox") + // .send_max("0.55/AUD/mtgox") // !!! Very important. + .on('proposed', function (m) { + // console.log("proposed: %s", JSON.stringify(m)); + + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Verify balances 3."; + + testutils.verify_balances(self.remote, + { + "alice" : "0.5/AUD/mtgox", + "bob" : "0.5/AUD/mtgox", + "mtgox" : [ "-0.5/AUD/alice","-0.5/AUD/bob" ], + }, + callback); + }, + function (callback) { + self.what = "Subscribe and accept."; + + self.count = 0; + self.found = 0; + + self.remote.on('ledger_closed', function (m) { + // console.log("#### LEDGER_CLOSE: %s", JSON.stringify(m)); + }); + + self.remote + .on('transaction', function (m) { + // console.log("ACCOUNT: %s", JSON.stringify(m)); + self.found = 1; + }) + .on('ledger_closed', function (m) { + // console.log("LEDGER_CLOSE: %d: %s", self.count, JSON.stringify(m)); + + if (self.count) { + callback(!self.found); + } + else { + self.count = 1; + + self.remote.ledger_accept(); + } + }) + .request_subscribe().accounts("mtgox") + .request(); + + self.remote.ledger_accept(); + }, + function (callback) { + self.what = "Verify balances 4."; + + testutils.verify_balances(self.remote, + { + "alice" : "0.5/AUD/mtgox", + "bob" : "0.5/AUD/mtgox", + "mtgox" : [ "-0.5/AUD/alice","-0.5/AUD/bob" ], + }, + callback); + }, + ], function (error) { + buster.refute(error, self.what); + done(); + }); + }, }); buster.testCase("Indirect ripple", { @@ -1051,279 +1008,273 @@ buster.testCase("Indirect ripple", { // 'setUp' : testutils.build_setup({ verbose: true }), 'tearDown' : testutils.build_teardown(), - "indirect ripple" : - function (done) { - var self = this; + "indirect ripple" : function (done) { + var self = this; - // self.remote.set_trace(); + // self.remote.set_trace(); - async.waterfall([ - function (callback) { - self.what = "Create accounts."; + async.waterfall([ + function (callback) { + self.what = "Create accounts."; - testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob", "mtgox"], callback); - }, - function (callback) { - self.what = "Set credit limits."; - - testutils.credit_limits(self.remote, - { - "alice" : "600/USD/mtgox", - "bob" : "700/USD/mtgox", - }, - callback); - }, - function (callback) { - self.what = "Distribute funds."; - - testutils.payments(self.remote, - { - "mtgox" : [ "70/USD/alice", "50/USD/bob" ], - }, - callback); - }, - function (callback) { - self.what = "Verify alice balance with mtgox."; - - testutils.verify_balance(self.remote, "alice", "70/USD/mtgox", callback); - }, - function (callback) { - self.what = "Verify bob balance with mtgox."; - - testutils.verify_balance(self.remote, "bob", "50/USD/mtgox", callback); - }, - function (callback) { - self.what = "Alice sends more than has to issuer: 100 out of 70"; - - self.remote.transaction() - .payment("alice", "mtgox", "100/USD/mtgox") - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tecPATH_PARTIAL'); - }) - .submit(); - }, - function (callback) { - self.what = "Alice sends more than has to bob: 100 out of 70"; - - self.remote.transaction() - .payment("alice", "bob", "100/USD/mtgox") - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tecPATH_PARTIAL'); - }) - .submit(); - }, - ], function (error) { - buster.refute(error, self.what); - done(); - }); + testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob", "mtgox"], callback); }, + function (callback) { + self.what = "Set credit limits."; - "indirect ripple with path" : - function (done) { - var self = this; - - async.waterfall([ - function (callback) { - self.what = "Create accounts."; - - testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob", "mtgox"], callback); - }, - function (callback) { - self.what = "Set credit limits."; - - testutils.credit_limits(self.remote, - { - "alice" : "600/USD/mtgox", - "bob" : "700/USD/mtgox", - }, - callback); - }, - function (callback) { - self.what = "Distribute funds."; - - testutils.payments(self.remote, - { - "mtgox" : [ "70/USD/alice", "50/USD/bob" ], - }, - callback); - }, - function (callback) { - self.what = "Alice sends via a path"; - - self.remote.transaction() - .payment("alice", "bob", "5/USD/mtgox") - .path_add( [ { account: "mtgox" } ]) - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Verify alice balance with mtgox."; - - testutils.verify_balance(self.remote, "alice", "65/USD/mtgox", callback); - }, - function (callback) { - self.what = "Verify bob balance with mtgox."; - - testutils.verify_balance(self.remote, "bob", "55/USD/mtgox", callback); - }, - ], function (error) { - buster.refute(error, self.what); - done(); - }); + testutils.credit_limits(self.remote, + { + "alice" : "600/USD/mtgox", + "bob" : "700/USD/mtgox", + }, + callback); }, + function (callback) { + self.what = "Distribute funds."; - "indirect ripple with multi path" : - function (done) { - var self = this; - - async.waterfall([ - function (callback) { - self.what = "Create accounts."; - - testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob", "carol", "amazon", "mtgox"], callback); - }, - function (callback) { - self.what = "Set credit limits."; - - testutils.credit_limits(self.remote, - { - "amazon" : "2000/USD/mtgox", - "bob" : [ "600/USD/alice", "1000/USD/mtgox" ], - "carol" : [ "700/USD/alice", "1000/USD/mtgox" ], - }, - callback); - }, - function (callback) { - self.what = "Distribute funds."; - - testutils.payments(self.remote, - { - "mtgox" : [ "100/USD/bob", "100/USD/carol" ], - }, - callback); - }, - function (callback) { - self.what = "Alice pays amazon via multiple paths"; - - self.remote.transaction() - .payment("alice", "amazon", "150/USD/mtgox") - .path_add( [ { account: "bob" } ]) - .path_add( [ { account: "carol" } ]) - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, - function (callback) { - self.what = "Verify balances."; - - testutils.verify_balances(self.remote, - { - "alice" : [ "-100/USD/bob", "-50/USD/carol" ], - "amazon" : "150/USD/mtgox", - "bob" : "0/USD/mtgox", - "carol" : "50/USD/mtgox", - }, - callback); - }, - ], function (error) { - buster.refute(error, self.what); - done(); - }); + testutils.payments(self.remote, + { + "mtgox" : [ "70/USD/alice", "50/USD/bob" ], + }, + callback); }, + function (callback) { + self.what = "Verify alice balance with mtgox."; - "indirect ripple with path and transfer fee" : - function (done) { - var self = this; - - async.waterfall([ - function (callback) { - self.what = "Create accounts."; - - testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob", "carol", "amazon", "mtgox"], callback); - }, - function (callback) { - self.what = "Set mtgox transfer rate."; - - testutils.transfer_rate(self.remote, "mtgox", 1.1e9, callback); - }, - function (callback) { - self.what = "Set credit limits."; - - testutils.credit_limits(self.remote, - { - "amazon" : "2000/USD/mtgox", - "bob" : [ "600/USD/alice", "1000/USD/mtgox" ], - "carol" : [ "700/USD/alice", "1000/USD/mtgox" ], - }, - callback); - }, - function (callback) { - self.what = "Distribute funds."; - - testutils.payments(self.remote, - { - "mtgox" : [ "100/USD/bob", "100/USD/carol" ], - }, - callback); - }, - function (callback) { - self.what = "Alice pays amazon via multiple paths"; - - self.remote.transaction() - .payment("alice", "amazon", "150/USD/mtgox") - .send_max("200/USD/alice") - .path_add( [ { account: "bob" } ]) - .path_add( [ { account: "carol" } ]) - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result !== 'tesSUCCESS'); - }) - .submit(); - }, -// function (callback) { -// self.what = "Display ledger"; -// -// self.remote.request_ledger('current', true) -// .on('success', function (m) { -// console.log("Ledger: %s", JSON.stringify(m, undefined, 2)); -// -// callback(); -// }) -// .request(); -// }, - function (callback) { - self.what = "Verify balances."; - - // 65.00000000000001 is correct. - // This is result of limited precision. - testutils.verify_balances(self.remote, - { - "alice" : [ "-100/USD/bob", "-65.00000000000001/USD/carol" ], - "amazon" : "150/USD/mtgox", - "bob" : "0/USD/mtgox", - "carol" : "35/USD/mtgox", - }, - callback); - }, - ], function (error) { - buster.refute(error, self.what); - done(); - }); + testutils.verify_balance(self.remote, "alice", "70/USD/mtgox", callback); }, - // Direct ripple without no liqudity. - // Test with XRP at start and end. + function (callback) { + self.what = "Verify bob balance with mtgox."; + + testutils.verify_balance(self.remote, "bob", "50/USD/mtgox", callback); + }, + function (callback) { + self.what = "Alice sends more than has to issuer: 100 out of 70"; + + self.remote.transaction() + .payment("alice", "mtgox", "100/USD/mtgox") + .once('submitted', function (m) { + // console.log("proposed: %s", JSON.stringify(m)); + callback(m.engine_result !== 'tecPATH_PARTIAL'); + }) + .submit(); + }, + function (callback) { + self.what = "Alice sends more than has to bob: 100 out of 70"; + + self.remote.transaction() + .payment("alice", "bob", "100/USD/mtgox") + .once('submitted', function (m) { + //console.log("proposed: %s", JSON.stringify(m)); + callback(m.engine_result !== 'tecPATH_PARTIAL'); + }) + .submit(); + }, + ], function (error) { + buster.refute(error, self.what); + done(); + }); + }, + + "indirect ripple with path" : function (done) { + var self = this; + + async.waterfall([ + function (callback) { + self.what = "Create accounts."; + + testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob", "mtgox"], callback); + }, + function (callback) { + self.what = "Set credit limits."; + + testutils.credit_limits(self.remote, + { + "alice" : "600/USD/mtgox", + "bob" : "700/USD/mtgox", + }, + callback); + }, + function (callback) { + self.what = "Distribute funds."; + + testutils.payments(self.remote, + { + "mtgox" : [ "70/USD/alice", "50/USD/bob" ], + }, + callback); + }, + function (callback) { + self.what = "Alice sends via a path"; + + self.remote.transaction() + .payment("alice", "bob", "5/USD/mtgox") + .path_add( [ { account: "mtgox" } ]) + .on('proposed', function (m) { + // console.log("proposed: %s", JSON.stringify(m)); + + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Verify alice balance with mtgox."; + + testutils.verify_balance(self.remote, "alice", "65/USD/mtgox", callback); + }, + function (callback) { + self.what = "Verify bob balance with mtgox."; + + testutils.verify_balance(self.remote, "bob", "55/USD/mtgox", callback); + }, + ], function (error) { + buster.refute(error, self.what); + done(); + }); + }, + + "indirect ripple with multi path" : function (done) { + var self = this; + + async.waterfall([ + function (callback) { + self.what = "Create accounts."; + + testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob", "carol", "amazon", "mtgox"], callback); + }, + function (callback) { + self.what = "Set credit limits."; + + testutils.credit_limits(self.remote, + { + "amazon" : "2000/USD/mtgox", + "bob" : [ "600/USD/alice", "1000/USD/mtgox" ], + "carol" : [ "700/USD/alice", "1000/USD/mtgox" ], + }, + callback); + }, + function (callback) { + self.what = "Distribute funds."; + + testutils.payments(self.remote, + { + "mtgox" : [ "100/USD/bob", "100/USD/carol" ], + }, + callback); + }, + function (callback) { + self.what = "Alice pays amazon via multiple paths"; + + self.remote.transaction() + .payment("alice", "amazon", "150/USD/mtgox") + .path_add( [ { account: "bob" } ]) + .path_add( [ { account: "carol" } ]) + .on('proposed', function (m) { + // console.log("proposed: %s", JSON.stringify(m)); + + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + function (callback) { + self.what = "Verify balances."; + + testutils.verify_balances(self.remote, + { + "alice" : [ "-100/USD/bob", "-50/USD/carol" ], + "amazon" : "150/USD/mtgox", + "bob" : "0/USD/mtgox", + "carol" : "50/USD/mtgox", + }, + callback); + }, + ], function (error) { + buster.refute(error, self.what); + done(); + }); + }, + + "indirect ripple with path and transfer fee" : function (done) { + var self = this; + + async.waterfall([ + function (callback) { + self.what = "Create accounts."; + + testutils.create_accounts(self.remote, "root", "10000.0", ["alice", "bob", "carol", "amazon", "mtgox"], callback); + }, + function (callback) { + self.what = "Set mtgox transfer rate."; + + testutils.transfer_rate(self.remote, "mtgox", 1.1e9, callback); + }, + function (callback) { + self.what = "Set credit limits."; + + testutils.credit_limits(self.remote, + { + "amazon" : "2000/USD/mtgox", + "bob" : [ "600/USD/alice", "1000/USD/mtgox" ], + "carol" : [ "700/USD/alice", "1000/USD/mtgox" ], + }, + callback); + }, + function (callback) { + self.what = "Distribute funds."; + + testutils.payments(self.remote, + { + "mtgox" : [ "100/USD/bob", "100/USD/carol" ], + }, + callback); + }, + function (callback) { + self.what = "Alice pays amazon via multiple paths"; + + self.remote.transaction() + .payment("alice", "amazon", "150/USD/mtgox") + .send_max("200/USD/alice") + .path_add( [ { account: "bob" } ]) + .path_add( [ { account: "carol" } ]) + .on('proposed', function (m) { + // console.log("proposed: %s", JSON.stringify(m)); + + callback(m.engine_result !== 'tesSUCCESS'); + }) + .submit(); + }, + // function (callback) { + // self.what = "Display ledger"; + // + // self.remote.request_ledger('current', true) + // .on('success', function (m) { + // console.log("Ledger: %s", JSON.stringify(m, undefined, 2)); + // + // callback(); + // }) + // .request(); + // }, + function (callback) { + self.what = "Verify balances."; + + // 65.00000000000001 is correct. + // This is result of limited precision. + testutils.verify_balances(self.remote, + { + "alice" : [ "-100/USD/bob", "-65.00000000000001/USD/carol" ], + "amazon" : "150/USD/mtgox", + "bob" : "0/USD/mtgox", + "carol" : "35/USD/mtgox", + }, + callback); + }, + ], function (error) { + buster.refute(error, self.what); + done(); + }); + }, + // Direct ripple without no liqudity. + // Test with XRP at start and end. }); -// vim:sw=2:sts=2:ts=8:et +// vim:sw=2:sts=2:ts=8:et \ No newline at end of file diff --git a/test/server-test.js b/test/server-test.js index b2800e1d3..ed12027b8 100644 --- a/test/server-test.js +++ b/test/server-test.js @@ -31,4 +31,4 @@ buster.testCase("Standalone server startup", { } }); -// vim:sw=2:sts=2:ts=8:et +// vim:sw=2:sts=2:ts=8:et \ No newline at end of file diff --git a/test/testutils.js b/test/testutils.js index 0e06d2899..f6b193e69 100644 --- a/test/testutils.js +++ b/test/testutils.js @@ -1,43 +1,58 @@ -var async = require("async"); -var extend = require("extend"); +var async = require('async'); +var extend = require('extend'); -var Amount = require("ripple-lib").Amount; -var Remote = require("ripple-lib").Remote; -var Server = require("./server").Server; -var Transaction = require("ripple-lib").Transaction; +var Amount = require('ripple-lib').Amount; +var Remote = require('ripple-lib').Remote; +var Server = require('./server').Server; +var Transaction = require('ripple-lib').Transaction; -var account_dump = function (remote, account, callback) { +function get_config() { + var cfg = require('./config-example'); + + // See if the person testing wants to override the configuration by creating a + // file called test/config.js. + try { + cfg = extend({}, cfg, require('./config')); + } catch (e) { } + + return cfg; +}; + +function init_config() { + return require('ripple-lib').config.load(get_config()); +}; + +function prepare_tests(tests, fn) { + var tests = typeof tests === 'string' ? [ tests ] : tests; + var result = [ ]; + for (var i in tests) { + result.push(fn(tests[i], i)); + } + return result; +}; + +function account_dump(remote, account, callback) { var self = this; - async.waterfall([ - function (callback) { - self.what = "Get latest account_root"; + this.what = 'Get latest account_root'; - remote - .request_ledger_entry('account_root') - .ledger_hash(remote.ledger_hash()) - .account_root("root") - .on('success', function (r) { - //console.log("account_root: %s", JSON.stringify(r, undefined, 2)); - - callback(); - }) - .on('error', function(m) { - console.log("error: %s", m); - - buster.assert(false); - callback(); - }) - .request(); - }, - ], function (error) { - callback(error); - }); + var request = remote.request_ledger_entry('account_root'); + request.ledger_hash(remote.ledger_hash()); + request.account_root('root'); + request.callback(function(err, r) { + buster.isNull(err); + if (err) { + //console.log('error: %s', m); + callback(err); + } else { + //console.log('account_root: %s', JSON.stringify(r, undefined, 2)); + callback(); + } + }); // get closed ledger hash // get account root // construct a json result - // }; /** @@ -48,7 +63,7 @@ var account_dump = function (remote, account, callback) { * debugging. * * @example - * buster.testCase("Foobar", { + * buster.testCase('Foobar', { * setUp: testutils.build_setup({verbose: true}), * // ... * }); @@ -63,67 +78,69 @@ var account_dump = function (remote, account, callback) { * @param opts.no_server {Bool} Don't auto-run rippled. * @param host {String} Identifier for the host configuration to be used. */ -var build_setup = function (opts, host) { +function build_setup(opts, host) { var config = get_config(); - - opts = opts || {}; + var host = host || config.server_default; + var opts = opts || {}; // Normalize options if (opts.verbose) { - opts.verbose_ws = true; + opts.verbose_ws = true; opts.verbose_server = true; }; - return function (done) { + function setup(done) { var self = this; - + self.compute_fees_amount_for_txs = function(txs) { - var fee_units = Transaction.fee_units["default"] * txs; - return self.remote.fee_tx(fee_units); + var fee_units = Transaction.fee_units['default'] * txs; + return self.remote.fee_tx(fee_units); }; self.amount_for = function(options) { - var reserve = self.remote.reserve(options.ledger_entries || 0); - var fees = self.compute_fees_amount_for_txs(options.default_transactions || 0) - return reserve.add(fees) - .add(options.extra || 0); + var reserve = self.remote.reserve(options.ledger_entries || 0); + var fees = self.compute_fees_amount_for_txs(options.default_transactions || 0) + return reserve.add(fees).add(options.extra || 0); }; - host = host || config.server_default; - this.store = this.store || {}; - - var data = this.store[host] = this.store[host] || {}; + this.store[host] = this.store[host] || { }; + var data = this.store[host]; data.opts = opts; - async.series([ - function runServerStep(callback) { - if (opts.no_server) return callback(); + var series = [ + function run_server(callback) { + if (opts.no_server) { + return callback(); + } - var server_config = extend({}, config.default_server_config, - config.servers[host]); + var server_config = extend({}, config.default_server_config, config.servers[host]); - data.server = Server - .from_config(host, server_config, - !!opts.verbose_server) - .on('started', callback) - .on('exited', function () { - // If know the remote, tell it server is gone. - if (self.remote) - self.remote.server_fatal(); - }) - .start(); + data.server = Server.from_config(host, server_config, !!opts.verbose_server); + + data.server.once('started', callback); + data.server.once('exited', function () { + // If know the remote, tell it server is gone. + if (self.remote) { + self.remote.server_fatal(); + } + }); + + data.server.start(); }, - function connectWebsocketStep(callback) { - self.remote = data.remote = - Remote - .from_config(host, !!opts.verbose_ws) - .once('ledger_closed', callback) - .connect(); + + function connect_websocket(callback) { + self.remote = data.remote = Remote.from_config(host, !!opts.verbose_ws); + self.remote.once('ledger_closed', callback); + self.remote.connect(); } - ], done); + ]; + + async.series(series, done); }; + + return setup; }; /** @@ -131,41 +148,41 @@ var build_setup = function (opts, host) { * * @param host {String} Identifier for the host configuration to be used. */ -var build_teardown = function (host) { +function build_teardown(host) { var config = get_config(); + var host = host || config.server_default; - return function (done) { - host = host || config.server_default; - + function teardown(done) { var data = this.store[host]; var opts = data.opts; - async.series([ - function disconnectWebsocketStep(callback) { + var series = [ + function disconnect_websocket(callback) { + data.remote.once('disconnected', callback) + data.remote.once('error', function (m) { + console.log('server error: ', m); + }) + data.remote.connect(false); + }, - data.remote - .on('disconnected', callback) - .on('error', function (m) { - console.log("server error: ", m); - }) - .connect(false); - }, - function stopServerStep(callback) { - if (opts.no_server) - { - return callback(); - } - - data.server - .on('stopped', callback) - .stop(); + function stop_server(callback) { + if (opts.no_server) { + callback(); + } else { + data.server.once('stopped', callback) + data.server.stop(); } - ], done); + } + ]; + + async.series(series, done); }; + + return teardown; }; -var create_accounts = function (remote, src, amount, accounts, callback) { - assert(5 === arguments.length); +function create_accounts(remote, src, amount, accounts, callback) { + assert(arguments.length === 5); remote.set_account_seq(src, 1); @@ -174,334 +191,311 @@ var create_accounts = function (remote, src, amount, accounts, callback) { // Otherwise, when other operations attempt to opperate async against the account they may get confused. remote.set_account_seq(account, 1); - remote.transaction() - .payment(src, account, amount) - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); + var tx = remote.transaction(); - if (m.result != 'tesSUCCESS') { - callback(new Error("Payment to create account did not succeed.")); - } else callback(null); - }) - .on('error', function (m) { - // console.log("error: %s", JSON.stringify(m)); + tx.payment(src, account, amount); - callback(m); - }) - .submit(); - }, callback); + tx.once('proposed', function (m) { + // console.log('proposed: %s', JSON.stringify(m)); + callback(m.engine_result === 'tesSUCCESS' ? null : new Error()); + }); + + tx.once('error', function (m) { + // console.log('error: %s', JSON.stringify(m)); + callback(m); + }); + + tx.submit(); + }, callback); }; -var credit_limit = function (remote, src, amount, callback) { - assert(4 === arguments.length); +function credit_limit(remote, src, amount, callback) { + assert(arguments.length === 4); + + var _m = amount.match(/^(\d+\/...\/[^\:]+)(?::(\d+)(?:,(\d+))?)?$/); - var _m = amount.match(/^(\d+\/...\/[^\:]+)(?::(\d+)(?:,(\d+))?)?$/); if (!_m) { - console.log("credit_limit: parse error: %s", amount); - - callback('parse_error'); + //console.log('credit_limit: parse error: %s', amount); + return callback(new Error('parse_error')); } - else - { - // console.log("credit_limit: parsed: %s", JSON.stringify(_m, undefined, 2)); - var _account_limit = _m[1]; - var _quality_in = _m[2]; - var _quality_out = _m[3]; - remote.transaction() - .ripple_line_set(src, _account_limit, _quality_in, _quality_out) - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); + // console.log('credit_limit: parsed: %s', JSON.stringify(_m, undefined, 2)); + var account_limit = _m[1]; + var quality_in = _m[2]; + var quality_out = _m[3]; - callback(m.result != 'tesSUCCESS'); - }) - .on('error', function (m) { - // console.log("error: %s", JSON.stringify(m)); + var tx = remote.transaction() - callback(m); - }) - .submit(); - } + tx.ripple_line_set(src, account_limit, quality_in, quality_out) + + tx.once('proposed', function (m) { + // console.log('proposed: %s', JSON.stringify(m)); + callback(m.engine_result === 'tesSUCCESS' ? null : new Error()); + }); + + tx.once('error', function (m) { + // console.log('error: %s', JSON.stringify(m)); + callback(m); + }); + + tx.submit(); }; -function get_config() { - var cfg = require('./config-example'); +function verify_limit(remote, src, amount, callback) { + assert(arguments.length === 4); - // See if the person testing wants to override the configuration by creating a - // file called test/config.js. - try { - cfg = extend({}, cfg, require('./config')); - } catch (e) { } + var _m = amount.match(/^(\d+\/...\/[^\:]+)(?::(\d+)(?:,(\d+))?)?$/); - return cfg; -} - -function init_config() { - var cfg = get_config(); - - return require('ripple-lib').config.load(cfg); -} - -var verify_limit = function (remote, src, amount, callback) { - assert(4 === arguments.length); - - var _m = amount.match(/^(\d+\/...\/[^\:]+)(?::(\d+)(?:,(\d+))?)?$/); if (!_m) { - // console.log("credit_limit: parse error: %s", amount); - - callback('parse_error'); + // console.log('credit_limit: parse error: %s', amount); + return callback(new Error('parse_error')); } - else - { - // console.log("_m", _m.length, _m); - // console.log("verify_limit: parsed: %s", JSON.stringify(_m, undefined, 2)); - var _account_limit = _m[1]; - var _quality_in = _m[2]; - var _quality_out = _m[3]; - var _limit = Amount.from_json(_account_limit); + // console.log('_m', _m.length, _m); + // console.log('verify_limit: parsed: %s', JSON.stringify(_m, undefined, 2)); + var account_limit = _m[1]; + var quality_in = Number(_m[2]); + var quality_out = Number(_m[3]); + var limit = Amount.from_json(account_limit); - remote.request_ripple_balance(src, _limit.issuer().to_json(), _limit.currency().to_json(), 'CURRENT') - .once('ripple_state', function (m) { - buster.assert(m.account_limit.equals(_limit)); - buster.assert('undefined' === _quality_in || m.account_quality_in == _quality_in); - buster.assert('undefined' === _quality_out || m.account_quality_out == _quality_out); + var options = { + account: src, + issuer: limit.issuer().to_json(), + currency: limit.currency().to_json(), + ledger: 'CURRENT' + }; - callback(); - }) - .once('error', function (m) { - // console.log("error: %s", JSON.stringify(m)); - - callback(m); - }) - .request(); - } + remote.request_ripple_balance(options, function(err, m) { + if (err) { + callback(err); + } else { + buster.assert(m.account_limit.equals(limit)); + buster.assert(isNaN(quality_in) || m.account_quality_in === quality_in); + buster.assert(isNaN(quality_out) || m.account_quality_out === quality_out); + callback(null); + } + }); }; -var credit_limits = function (remote, balances, callback) { - assert(3 === arguments.length); +function credit_limits(remote, balances, callback) { + assert(arguments.length === 3); - var limits = []; + var limits = [ ]; for (var src in balances) { - var values_src = balances[src]; - var values = 'string' === typeof values_src ? [ values_src ] : values_src; - - for (var index in values) { - limits.push( { "source" : src, "amount" : values[index] } ); - } + prepare_tests(balances[src], function(amount) { + limits.push({ + source: src, + amount: amount + }); + }); } - async.every(limits, - function (limit, callback) { - credit_limit(remote, limit.source, limit.amount, - function (mismatch) { callback(!mismatch); }); - }, - function (every) { - callback(!every); - }); + function iterator(limit, callback) { + credit_limit(remote, limit.source, limit.amount, callback); + } + + async.some(limits, iterator, callback); }; -var ledger_close = function (remote, callback) { - remote.once('ledger_closed', function (m) { callback(); }).ledger_accept(); -} - -var payment = function (remote, src, dst, amount, callback) { - assert(5 === arguments.length); - - remote.transaction() - .payment(src, dst, amount) - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); - - callback(m.result != 'tesSUCCESS'); - }) - .on('error', function (m) { - // console.log("error: %s", JSON.stringify(m)); - - callback(m); - }) - .submit(); +function ledger_close(remote, callback) { + remote.once('ledger_closed', function (m) { + callback(); + }); + remote.ledger_accept(); }; -var payments = function (remote, balances, callback) { - assert(3 === arguments.length); +function payment(remote, src, dst, amount, callback) { + assert(arguments.length === 5); - var sends = []; + var tx = remote.transaction(); + + tx.payment(src, dst, amount); + + tx.once('proposed', function (m) { + // console.log('proposed: %s', JSON.stringify(m)); + callback(m.engine_result === 'tesSUCCESS' ? null : new Error()); + }); + + tx.once('error', function (m) { + // console.log('error: %s', JSON.stringify(m)); + callback(m); + }); + + tx.submit(); +}; + +function payments(remote, balances, callback) { + assert(arguments.length === 3); + + var sends = [ ]; for (var src in balances) { - var values_src = balances[src]; - var values = 'string' === typeof values_src ? [ values_src ] : values_src; - - for (var index in values) { - var amount_json = values[index]; - var amount = Amount.from_json(amount_json); - - sends.push( { "source" : src, "destination" : amount.issuer().to_json(), "amount" : amount_json } ); - } + prepare_tests(balances[src], function(amount_json) { + sends.push({ + source: src, + destination : Amount.from_json(amount_json).issuer().to_json(), + amount : amount_json + }); + }); } - async.every(sends, - function (send, callback) { - payment(remote, send.source, send.destination, send.amount, - function (mismatch) { callback(!mismatch); }); - }, - function (every) { - callback(!every); - }); + function iterator(send, callback) { + payment(remote, send.source, send.destination, send.amount, callback); + } + + async.some(sends, iterator, callback); }; -var transfer_rate = function (remote, src, billionths, callback) { - assert(4 === arguments.length); +function transfer_rate(remote, src, billionths, callback) { + assert(arguments.length === 4); - remote.transaction() - .account_set(src) - .transfer_rate(billionths) - .on('proposed', function (m) { - // console.log("proposed: %s", JSON.stringify(m)); + var tx = remote.transaction(); + tx.account_set(src); + tx.transfer_rate(billionths); - callback(m.result != 'tesSUCCESS'); - }) - .on('error', function (m) { - // console.log("error: %s", JSON.stringify(m)); + tx.once('proposed', function (m) { + // console.log('proposed: %s', JSON.stringify(m)); + callback(m.engine_result === 'tesSUCCESS' ? null : new Error()); + }); - callback(m); - }) - .submit(); + tx.once('error', function (m) { + // console.log('error: %s', JSON.stringify(m)); + callback(m); + }); + + tx.submit(); }; -var verify_balance = function (remote, src, amount_json, callback) { - assert(4 === arguments.length); +function verify_balance(remote, src, amount_json, callback) { + assert(arguments.length === 4); + var amount_req = Amount.from_json(amount_json); if (amount_req.is_native()) { - remote.request_account_balance(src, 'CURRENT') - .once('account_balance', function (amount_act) { - if (!amount_act.equals(amount_req, true)) { - console.log("verify_balance: failed: %s / %s", - amount_act.to_text_full(), - amount_req.to_text_full()); - } + remote.request_account_balance(src, 'CURRENT', function(err, amount_act) { + if (err) { + return callback(err); + } + var valid_balance = amount_act.equals(amount_req, true); + if (!valid_balance) { + //console.log('verify_balance: failed: %s / %s', + //amount_act.to_text_full(), + //amount_req.to_text_full()); + } + callback(valid_balance ? null : new Error()); + }); + } else { + var issuer = amount_req.issuer().to_json(); + var currency = amount_req.currency().to_json(); + remote.request_ripple_balance(src, issuer, currency, 'CURRENT', function(err, m) { + if (err) { + return callback(err); + } + // console.log('BALANCE: %s', JSON.stringify(m)); + // console.log('account_balance: %s', m.account_balance.to_text_full()); + // console.log('account_limit: %s', m.account_limit.to_text_full()); + // console.log('issuer_balance: %s', m.issuer_balance.to_text_full()); + // console.log('issuer_limit: %s', m.issuer_limit.to_text_full()); + var account_balance = Amount.from_json(m.account_balance); - callback(!amount_act.equals(amount_req, true)); - }) - .request(); - } - else { - remote.request_ripple_balance(src, amount_req.issuer().to_json(), amount_req.currency().to_json(), 'CURRENT') - .once('ripple_state', function (m) { - // console.log("BALANCE: %s", JSON.stringify(m)); - // console.log("account_balance: %s", m.account_balance.to_text_full()); - // console.log("account_limit: %s", m.account_limit.to_text_full()); - // console.log("issuer_balance: %s", m.issuer_balance.to_text_full()); - // console.log("issuer_limit: %s", m.issuer_limit.to_text_full()); + var valid_balance = account_balance.equals(amount_req, true); - var account_balance = Amount.from_json(m.account_balance); + if (!valid_balance) { + //console.log('verify_balance: failed: %s vs %s / %s: %s', + //src, + //account_balance.to_text_full(), + //amount_req.to_text_full(), + //account_balance.not_equals_why(amount_req, true)); + } - if (!account_balance.equals(amount_req, true)) { - console.log("verify_balance: failed: %s vs %s / %s: %s", - src, - account_balance.to_text_full(), - amount_req.to_text_full(), - account_balance.not_equals_why(amount_req, true)); - } - - callback(!account_balance.equals(amount_req, true)); - }) - .request(); + callback(valid_balance ? null : new Error()); + }) } }; -var verify_balances = function (remote, balances, callback) { - var tests = []; +function verify_balances(remote, balances, callback) { + var tests = [ ]; for (var src in balances) { - var values_src = balances[src]; - var values = 'string' === typeof values_src ? [ values_src ] : values_src; - - for (var index in values) { - tests.push( { "source" : src, "amount" : values[index] } ); - } + prepare_tests(balances[src], function(amount) { + tests.push({ source: src, amount: amount }); + }); } - async.every(tests, - function (check, callback) { - verify_balance(remote, check.source, check.amount, - function (mismatch) { callback(!mismatch); }); - }, - function (every) { - callback(!every); - }); + function iterator(test, callback) { + verify_balance(remote, test.source, test.amount, callback) + } + + async.every(tests, iterator, callback); }; // --> owner: account // --> seq: sequence number of creating transaction. // --> taker_gets: json amount // --> taker_pays: json amount -var verify_offer = function (remote, owner, seq, taker_pays, taker_gets, callback) { - assert(6 === arguments.length); +function verify_offer(remote, owner, seq, taker_pays, taker_gets, callback) { + assert(arguments.length === 6); - remote.request_ledger_entry('offer') - .offer_id(owner, seq) - .on('success', function (m) { - var wrong = !Amount.from_json(m.node.TakerGets).equals(Amount.from_json(taker_gets), true) - || !Amount.from_json(m.node.TakerPays).equals(Amount.from_json(taker_pays), true); + var request = remote.request_ledger_entry('offer') + request.offer_id(owner, seq) + request.callback(function(err, m) { + var wrong = err + || !Amount.from_json(m.node.TakerGets).equals(Amount.from_json(taker_gets), true) + || !Amount.from_json(m.node.TakerPays).equals(Amount.from_json(taker_pays), true); - if (wrong) - console.log("verify_offer: failed: %s", JSON.stringify(m)); + if (wrong) { + //console.log('verify_offer: failed: %s', JSON.stringify(m)); + } - callback(wrong); - }) - .request(); + callback(wrong ? (err || new Error()) : null); + }); }; -var verify_offer_not_found = function (remote, owner, seq, callback) { - assert(4 === arguments.length); +function verify_offer_not_found(remote, owner, seq, callback) { + assert(arguments.length === 4); - remote.request_ledger_entry('offer') - .offer_id(owner, seq) - .on('success', function (m) { - console.log("verify_offer_not_found: found offer: %s", JSON.stringify(m)); + var request = remote.request_ledger_entry('offer'); - callback('entryFound'); - }) - .on('error', function (m) { - // console.log("verify_offer_not_found: success: %s", JSON.stringify(m)); + request.offer_id(owner, seq); - callback('remoteError' !== m.error - || 'entryNotFound' !== m.remote.error); - }) - .request(); + request.once('success', function (m) { + //console.log('verify_offer_not_found: found offer: %s', JSON.stringify(m)); + callback(new Error('entryFound')); + }); + + request.once('error', function (m) { + // console.log('verify_offer_not_found: success: %s', JSON.stringify(m)); + var is_not_found = m.error === 'remoteError' && m.remote.error === 'entryNotFound'; + if (is_not_found) { + callback(null); + } else { + callback(new Error()); + } + }); + + request.request(); }; -var verify_owner_count = function (remote, account, value, callback) { - assert(4 === arguments.length); - - remote.request_owner_count(account, 'CURRENT') - .once('owner_count', function (owner_count) { - if (owner_count !== value) - console.log("owner_count: %s/%d", owner_count, value); - - callback(owner_count !== value); - }) - .request(); +function verify_owner_count(remote, account, count, callback) { + assert(arguments.length === 4); + var options = { account: account, ledger: 'CURRENT' }; + remote.request_owner_count(options, function(err, owner_count) { + //console.log('owner_count: %s/%d', owner_count, value); + callback(owner_count === count ? null : new Error()); + }); }; -var verify_owner_counts = function (remote, counts, callback) { - var tests = []; +function verify_owner_counts(remote, counts, callback) { + var tests = prepare_tests(counts, function(account) { + return { account: account, count: counts[account] }; + }); - for (var src in counts) { - tests.push( { "source" : src, "count" : counts[src] } ); + function iterator(test, callback) { + verify_owner_count(remote, test.account, test.count, callback) } - async.every(tests, - function (check, callback) { - verify_owner_count(remote, check.source, check.count, - function (mismatch) { callback(!mismatch); }); - }, - function (every) { - callback(!every); - }); + async.every(tests, iterator, callback); }; exports.account_dump = account_dump;