From 73e4a73f954d9a270db9ab2d870683550bc29407 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Wed, 26 Sep 2012 14:07:07 -0700 Subject: [PATCH 1/3] getLedgerID to NetworkOPs. --- src/NetworkOPs.cpp | 5 +++++ src/NetworkOPs.h | 1 + 2 files changed, 6 insertions(+) diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index 0433892263..38a43580db 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -67,6 +67,11 @@ void NetworkOPs::closeTimeOffset(int offset) Log(lsINFO) << "Close time offset now " << mCloseTimeOffset; } +uint32 NetworkOPs::getLedgerID(const uint256& hash) +{ + return mLedgerMaster->getLedgerByHash(hash)->getLedgerSeq(); +} + uint32 NetworkOPs::getCurrentLedgerID() { return mLedgerMaster->getCurrentLedger()->getLedgerSeq(); diff --git a/src/NetworkOPs.h b/src/NetworkOPs.h index 43b7da9f4e..b62a362bec 100644 --- a/src/NetworkOPs.h +++ b/src/NetworkOPs.h @@ -96,6 +96,7 @@ public: uint32 getValidationTimeNC(); void closeTimeOffset(int); boost::posix_time::ptime getNetworkTimePT(); + uint32 getLedgerID(const uint256& hash); uint32 getCurrentLedgerID(); OperatingMode getOperatingMode() { return mMode; } inline bool available() { From 4cec959e78cf1830eebe547130ef37924a025848 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Wed, 26 Sep 2012 14:08:10 -0700 Subject: [PATCH 2/3] WS add command ledger_closed and revise ledger_current. --- src/WSDoor.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/src/WSDoor.cpp b/src/WSDoor.cpp index bea4e7ed27..a44ee9098e 100644 --- a/src/WSDoor.cpp +++ b/src/WSDoor.cpp @@ -76,7 +76,9 @@ public: boost::unordered_set parseAccountIds(const Json::Value& jvArray); // Request-Response Commands + void doLedgerClosed(Json::Value& jvResult, const Json::Value& jvRequest); void doLedgerCurrent(Json::Value& jvResult, const Json::Value& jvRequest); + void doLedgerEntry(Json::Value& jvResult, const Json::Value& jvRequest); // Streaming Commands void doAccountInfoSubscribe(Json::Value& jvResult, const Json::Value& jvRequest); @@ -297,7 +299,9 @@ Json::Value WSConnection::invokeCommand(const Json::Value& jvRequest) doFuncPtr dfpFunc; } commandsA[] = { // Request-Response Commands: - { "ledger_current", &WSConnection::doLedgerCurrent }, + { "ledger_closed", &WSConnection::doLedgerClosed }, + { "ledger_current", &WSConnection::doLedgerCurrent }, + { "ledger_entry", &WSConnection::doLedgerEntry }, // Streaming commands: { "account_info_subscribe", &WSConnection::doAccountInfoSubscribe }, @@ -548,9 +552,55 @@ void WSConnection::doLedgerAccountsUnsubscribe(Json::Value& jvResult, const Json } } +void WSConnection::doLedgerClosed(Json::Value& jvResult, const Json::Value& jvRequest) +{ + uint256 uLedger = theApp->getOPs().getClosedLedger(); + + jvResult["ledger_index"] = theApp->getOPs().getLedgerID(uLedger); + jvResult["ledger"] = uLedger.ToString(); +} + void WSConnection::doLedgerCurrent(Json::Value& jvResult, const Json::Value& jvRequest) { - jvResult["ledger"] = theApp->getOPs().getCurrentLedgerID(); + jvResult["ledger_index"] = theApp->getOPs().getCurrentLedgerID(); +} + +void WSConnection::doLedgerEntry(Json::Value& jvResult, const Json::Value& jvRequest) +{ + // Get from request. + uint256 uLedger; + + jvResult["ledger_index"] = theApp->getOPs().getLedgerID(uLedger); + jvResult["ledger"] = uLedger.ToString(); + + if (jvRequest.isMember("index")) + { + jvResult["error"] = "notImplemented"; + } + else if (jvRequest.isMember("account_root")) + { + jvResult["error"] = "notImplemented"; + } + else if (jvRequest.isMember("directory")) + { + jvResult["error"] = "notImplemented"; + } + else if (jvRequest.isMember("generator")) + { + jvResult["error"] = "notImplemented"; + } + else if (jvRequest.isMember("offer")) + { + jvResult["error"] = "notImplemented"; + } + else if (jvRequest.isMember("ripple_state")) + { + jvResult["error"] = "notImplemented"; + } + else + { + jvResult["error"] = "unknownOption"; + } } void WSConnection::doTransactionSubcribe(Json::Value& jvResult, const Json::Value& jvRequest) From 8993c8f26838f9773f5d68f9f6ed80870b458fb7 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Wed, 26 Sep 2012 14:08:56 -0700 Subject: [PATCH 3/3] UT add testing for ledger_closed and update ledger_current. --- js/remote.js | 10 +++++-- test/standalone-test.js | 66 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 70 insertions(+), 6 deletions(-) diff --git a/js/remote.js b/js/remote.js index d1fa4430cc..c98129d102 100644 --- a/js/remote.js +++ b/js/remote.js @@ -82,7 +82,7 @@ Remote.method('connect_helper', function() { self.done(ws.readyState); }; - // XXX Why doesn't onmessage work? + // Node's ws module doesn't pass arguments to onmessage. ws.on('message', function(json, flags) { var message = JSON.parse(json); // console.log("message: %s", json); @@ -167,12 +167,16 @@ Remote.method('request', function(command, done) { ws.send(JSON.stringify(command)); }); -// Get the current ledger entry (may be live or not). +Remote.method('ledger_closed', function(done) { + this.request({ 'command' : 'ledger_closed' }, done); +}); + +// Get the current proposed ledger entry. May be closed (and revised) at any time (even before returning). +// Only for use by unit tests. Remote.method('ledger_current', function(done) { this.request({ 'command' : 'ledger_current' }, done); }); - // Submit a json transaction. // done(value) // <-> value: { 'status', status, 'result' : result, ... } diff --git a/test/standalone-test.js b/test/standalone-test.js index 2a725dffac..92289ffcfc 100644 --- a/test/standalone-test.js +++ b/test/standalone-test.js @@ -92,15 +92,75 @@ buster.testCase("Websocket commands", { }); }, - "ledger_current" : + 'ledger_closed' : + function(done) { + alpha.ledger_closed(function (r) { + console.log(r); + + buster.assert(r.ledger === 1); + done(); + }); + }, + + 'ledger_current' : function(done) { alpha.ledger_current(function (r) { console.log(r); - buster.assert(r.ledger === 2); + buster.assert.equals(r.ledger_index, 2); done(); }); - } + }, + + 'ledger_closed' : + function(done) { + alpha.ledger_closed(function (r) { + console.log("result: %s", JSON.stringify(r)); + + buster.assert.equals(r.ledger_index, 1); + done(); + }); + }, }); +buster.testCase("// Work in progress", { + 'setUp' : + function(done) { + server.start("alpha", + function(e) { + buster.refute(e); + + alpha = remote.remoteConfig(config, "alpha"); + + alpha.connect(function(stat) { + buster.assert(1 == stat); // OPEN + + done(); + }, serverDelay); + }); + }, + + 'tearDown' : + function(done) { + alpha.disconnect(function(stat) { + buster.assert(3 == stat); // CLOSED + + server.stop("alpha", function(e) { + buster.refute(e); + + done(); + }); + }); + }, + + 'ledger_closed' : + function(done) { + alpha.ledger_closed(function (r) { + console.log("result: %s", JSON.stringify(r)); + + buster.assert.equals(r.ledger_index, 1); + done(); + }); + }, +}); // vim:ts=4