mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-27 14:35:52 +00:00
General RPC command that can retrieve objects in the account root. * Add account objects integration test. * Support tickets. * Add removeElement in Json::Value
239 lines
6.4 KiB
JavaScript
239 lines
6.4 KiB
JavaScript
var async = require("async");
|
|
var assert = require('assert');
|
|
var http = require("http");
|
|
var jsonrpc = require("simple-jsonrpc");
|
|
var EventEmitter = require('events').EventEmitter;
|
|
var Remote = require("ripple-lib").Remote;
|
|
var testutils = require("./testutils");
|
|
var config = testutils.init_config();
|
|
|
|
function build_setup(options) {
|
|
var setup = testutils.build_setup(options);
|
|
|
|
return function (done) {
|
|
var self = this;
|
|
|
|
var http_config = config.http_servers["zed"];
|
|
|
|
self.server_events = new EventEmitter;
|
|
|
|
self.server = http.createServer(function (req, res) {
|
|
// console.log("REQUEST");
|
|
var input = "";
|
|
|
|
req.setEncoding('utf8');
|
|
|
|
req.on('data', function (buffer) {
|
|
// console.log("DATA: %s", buffer);
|
|
input = input + buffer;
|
|
});
|
|
|
|
req.on('end', function () {
|
|
var request = JSON.parse(input);
|
|
// console.log("REQ: %s", JSON.stringify(request, undefined, 2));
|
|
self.server_events.emit('request', request, res);
|
|
});
|
|
|
|
req.on('close', function () { });
|
|
});
|
|
|
|
self.server.listen(http_config.port, http_config.ip, void(0), function () {
|
|
// console.log("server up: %s %d", http_config.ip, http_config.port);
|
|
setup.call(self, done);
|
|
});
|
|
};
|
|
};
|
|
|
|
function build_teardown() {
|
|
var teardown = testutils.build_teardown();
|
|
|
|
return function (done) {
|
|
var self = this;
|
|
|
|
self.server.close(function () {
|
|
// console.log("server closed");
|
|
|
|
teardown.call(self, done);
|
|
});
|
|
};
|
|
};
|
|
|
|
suite('ACCOUNT_OBJECTS', function() {
|
|
var $ = { };
|
|
|
|
setup(function(done) {
|
|
build_setup().call($, done);
|
|
});
|
|
|
|
teardown(function(done) {
|
|
build_teardown().call($, done);
|
|
});
|
|
|
|
test('account_objects', function(done) {
|
|
var self = this;
|
|
|
|
var rippled_config = testutils.get_server_config(config);
|
|
var client = jsonrpc.client("http://" + rippled_config.rpc_ip + ":" +
|
|
rippled_config.rpc_port);
|
|
var http_config = config.http_servers["zed"];
|
|
|
|
var steps = [
|
|
function (callback) {
|
|
self.what = 'Create accounts';
|
|
|
|
testutils.create_accounts(
|
|
$.remote,
|
|
'root',
|
|
'20000.0',
|
|
[ 'mtgox', 'alice', 'bob' ],
|
|
callback
|
|
);
|
|
},
|
|
|
|
function waitLedgers(callback) {
|
|
self.what = 'Wait ledger';
|
|
|
|
$.remote.once('ledger_closed', function() {
|
|
callback();
|
|
});
|
|
|
|
$.remote.ledger_accept();
|
|
},
|
|
|
|
function verifyBalance(callback) {
|
|
self.what = 'Verify balance';
|
|
|
|
testutils.verify_balance(
|
|
$.remote,
|
|
[ 'mtgox', 'alice', 'bob' ],
|
|
'19999999988',
|
|
callback
|
|
);
|
|
},
|
|
|
|
function (callback) {
|
|
self.what = 'Set transfer rate';
|
|
|
|
var tx = $.remote.transaction('AccountSet', {
|
|
account: 'mtgox'
|
|
});
|
|
|
|
tx.transferRate(1.1 * 1e9);
|
|
|
|
tx.submit(function(err, m) {
|
|
assert.ifError(err);
|
|
assert.strictEqual(m.engine_result, 'tesSUCCESS');
|
|
callback();
|
|
});
|
|
|
|
testutils.ledger_wait($.remote, tx);
|
|
},
|
|
|
|
function (callback) {
|
|
self.what = 'Set limits';
|
|
|
|
testutils.credit_limits($.remote, {
|
|
'alice' : '1000/USD/mtgox',
|
|
'bob' : '1000/USD/mtgox'
|
|
},
|
|
callback);
|
|
},
|
|
|
|
function (callback) {
|
|
self.what = 'Distribute funds';
|
|
|
|
testutils.payments($.remote, {
|
|
'mtgox' : [ '100/USD/alice', '50/USD/bob' ]
|
|
},
|
|
callback);
|
|
},
|
|
|
|
function (callback) {
|
|
self.what = 'Create offer';
|
|
|
|
// get 4000/XRP pay 10/USD : offer pays 10 USD for 4000 XRP
|
|
var tx = $.remote.transaction('OfferCreate', {
|
|
account: 'alice',
|
|
taker_pays: '4000',
|
|
taker_gets: '10/USD/mtgox'
|
|
});
|
|
|
|
tx.submit(function(err, m) {
|
|
assert.ifError(err);
|
|
assert.strictEqual(m.engine_result, 'tesSUCCESS');
|
|
callback();
|
|
});
|
|
|
|
testutils.ledger_wait($.remote, tx);
|
|
},
|
|
|
|
function (callback) {
|
|
self.what = "Get account objects.";
|
|
|
|
client.call('account_objects', [{
|
|
"account": "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn",
|
|
"limit": 10
|
|
}], function (result) {
|
|
// console.log(JSON.stringify(result, undefined, 2));
|
|
assert(typeof result === 'object');
|
|
|
|
assert('account' in result);
|
|
assert.deepEqual(result['account'], 'rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn');
|
|
|
|
assert('account_objects' in result);
|
|
var expected = [{
|
|
Balance: {
|
|
currency: 'USD',
|
|
issuer: 'rrrrrrrrrrrrrrrrrrrrBZbvji',
|
|
value: '-100'
|
|
},
|
|
Flags: 131072,
|
|
HighLimit: {
|
|
currency: 'USD',
|
|
issuer: 'rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn',
|
|
value: '1000'
|
|
},
|
|
HighNode: '0000000000000000',
|
|
LedgerEntryType: 'RippleState',
|
|
LowLimit: {
|
|
currency: 'USD',
|
|
issuer: 'rGihwhaqU8g7ahwAvTq6iX5rvsfcbgZw6v',
|
|
value: '0'
|
|
},
|
|
LowNode: '0000000000000000',
|
|
PreviousTxnID: result['account_objects'][0]['PreviousTxnID'],
|
|
PreviousTxnLgrSeq: result['account_objects'][0]['PreviousTxnLgrSeq'],
|
|
index: 'DE9CF5B006C8EA021CAB2ED20F01FC9D3260875C885155E7FA7A4DB534E36D8A'
|
|
}, {
|
|
Account: 'rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn',
|
|
BookDirectory:
|
|
'AE0A97F385FFE42E3096BA3F98A0173090FE66A3C2482FE0570E35FA931A0000',
|
|
BookNode: '0000000000000000',
|
|
Flags: 0,
|
|
LedgerEntryType: 'Offer',
|
|
OwnerNode: '0000000000000000',
|
|
PreviousTxnID: result['account_objects'][1]['PreviousTxnID'],
|
|
PreviousTxnLgrSeq: result['account_objects'][1]['PreviousTxnLgrSeq'],
|
|
Sequence: 3,
|
|
TakerGets: {
|
|
currency: 'USD',
|
|
issuer: 'rGihwhaqU8g7ahwAvTq6iX5rvsfcbgZw6v',
|
|
value: '10'
|
|
},
|
|
TakerPays: '4000',
|
|
index: '2A432F386EF28151AF60885CE201CC9331FF494A163D40531A9D253C97E81D61'
|
|
}];
|
|
|
|
assert.deepEqual(result['account_objects'], expected);
|
|
callback();
|
|
});
|
|
}
|
|
];
|
|
|
|
async.waterfall(steps, function(error) {
|
|
assert(!error, self.what + ': ' + error);
|
|
done();
|
|
});
|
|
});
|
|
});
|