From 7936d3a3dbf04c7a0354f0dd3a55b89658b42964 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Tue, 30 Jul 2013 11:36:18 -0700 Subject: [PATCH 01/15] Fix compile error --- src/cpp/ripple/ripple_Main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/ripple_Main.cpp b/src/cpp/ripple/ripple_Main.cpp index 40f8dbf68f..a2babe10b1 100644 --- a/src/cpp/ripple/ripple_Main.cpp +++ b/src/cpp/ripple/ripple_Main.cpp @@ -243,7 +243,7 @@ int rippleMain (int argc, char** argv) if (HaveSustain () && !iResult && !vm.count ("parameters") && !vm.count ("fg") && !vm.count ("standalone") && !vm.count ("unittest")) { - std::string logMe = DoSustain (theConfig.DEBUG_LOGFILE.c_str()); + std::string logMe = DoSustain (theConfig.DEBUG_LOGFILE.string()); if (!logMe.empty ()) Log (lsWARNING) << logMe; From 2e507c98deb4f10492b9e5ecf9e98ee54bf51509 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Tue, 30 Jul 2013 11:55:18 -0700 Subject: [PATCH 02/15] Add memory backend --- .../node/ripple_MemoryBackendFactory.cpp | 101 ++++++++++++++++++ .../node/ripple_MemoryBackendFactory.h | 30 ++++++ modules/ripple_app/ripple_app.cpp | 2 + 3 files changed, 133 insertions(+) create mode 100644 modules/ripple_app/node/ripple_MemoryBackendFactory.cpp create mode 100644 modules/ripple_app/node/ripple_MemoryBackendFactory.h diff --git a/modules/ripple_app/node/ripple_MemoryBackendFactory.cpp b/modules/ripple_app/node/ripple_MemoryBackendFactory.cpp new file mode 100644 index 0000000000..d0536b3505 --- /dev/null +++ b/modules/ripple_app/node/ripple_MemoryBackendFactory.cpp @@ -0,0 +1,101 @@ +//------------------------------------------------------------------------------ +/* + Copyright (c) 2011-2013, OpenCoin, Inc. +*/ +//============================================================================== + +class MemoryBackendFactory::Backend : public NodeStore::Backend +{ +private: + typedef std::map Map; + +public: + Backend (size_t keyBytes, StringPairArray const& keyValues) + : m_keyBytes (keyBytes) + { + } + + ~Backend () + { + } + + std::string getDataBaseName () + { + return "memory"; + } + + //-------------------------------------------------------------------------- + + NodeObject::pointer retrieve (uint256 const &hash) + { + Map::iterator iter = m_map.find (hash); + + if (iter != m_map.end ()) + return iter->second; + + return NodeObject::pointer (); + } + + bool store (NodeObject::ref object) + { + Map::iterator iter = m_map.find (object->getHash ()); + + if (iter == m_map.end ()) + { + m_map.insert (std::make_pair (object->getHash (), object)); + } + + return true; + } + + bool bulkStore (const std::vector< NodeObject::pointer >& batch) + { + for (int i = 0; i < batch.size (); ++i) + store (batch [i]); + + return true; + } + + void visitAll (FUNCTION_TYPE f) + { + for (Map::const_iterator iter = m_map.begin (); iter != m_map.end (); ++iter) + f (iter->second); + } + + //-------------------------------------------------------------------------- + +private: + size_t const m_keyBytes; + + Map m_map; +}; + +//------------------------------------------------------------------------------ + +MemoryBackendFactory::MemoryBackendFactory () +{ +} + +MemoryBackendFactory::~MemoryBackendFactory () +{ +} + +MemoryBackendFactory& MemoryBackendFactory::getInstance () +{ + static MemoryBackendFactory instance; + + return instance; +} + +String MemoryBackendFactory::getName () const +{ + return "Memory"; +} + +NodeStore::Backend* MemoryBackendFactory::createInstance (StringPairArray const& keyValues) +{ + return new MemoryBackendFactory::Backend (32, keyValues); +} + +//------------------------------------------------------------------------------ + diff --git a/modules/ripple_app/node/ripple_MemoryBackendFactory.h b/modules/ripple_app/node/ripple_MemoryBackendFactory.h new file mode 100644 index 0000000000..5bb4cf2700 --- /dev/null +++ b/modules/ripple_app/node/ripple_MemoryBackendFactory.h @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +/* + Copyright (c) 2011-2013, OpenCoin, Inc. +*/ +//============================================================================== + +#ifndef RIPPLE_MEMORYBACKENDFACTORY_H_INCLUDED +#define RIPPLE_MEMORYBACKENDFACTORY_H_INCLUDED + +/** Factory to produce a RAM based backend for the NodeStore. + + @see NodeStore +*/ +class MemoryBackendFactory : public NodeStore::BackendFactory +{ +private: + class Backend; + + MemoryBackendFactory (); + ~MemoryBackendFactory (); + +public: + static MemoryBackendFactory& getInstance (); + + String getName () const; + + NodeStore::Backend* createInstance (StringPairArray const& keyValues); +}; + +#endif diff --git a/modules/ripple_app/ripple_app.cpp b/modules/ripple_app/ripple_app.cpp index 4660d7caa7..b263b583dc 100644 --- a/modules/ripple_app/ripple_app.cpp +++ b/modules/ripple_app/ripple_app.cpp @@ -103,6 +103,7 @@ namespace ripple #include "node/ripple_NodeObject.h" #include "node/ripple_NodeStore.h" #include "node/ripple_LevelDBBackendFactory.h" +#include "node/ripple_MemoryBackendFactory.h" #include "node/ripple_HyperLevelDBBackendFactory.h" #include "node/ripple_MdbBackendFactory.h" #include "node/ripple_NullBackendFactory.h" @@ -246,6 +247,7 @@ static const uint64 tenTo17m1 = tenTo17 - 1; #include "node/ripple_NodeObject.cpp" #include "node/ripple_NodeStore.cpp" #include "node/ripple_LevelDBBackendFactory.cpp" +#include "node/ripple_MemoryBackendFactory.cpp" #include "node/ripple_HyperLevelDBBackendFactory.cpp" #include "node/ripple_MdbBackendFactory.cpp" #include "node/ripple_NullBackendFactory.cpp" From daa9e2a9fb7976e807df35955f9bba893ff8a19c Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 30 Jul 2013 12:11:22 -0700 Subject: [PATCH 03/15] Revert "A new-master version of the code to save only validated transactions into the SQL databases." This reverts commit bc1a83db27100e485def7a86ec960ee0a90bded3. --- src/cpp/ripple/Ledger.cpp | 49 ++++++++++++++----------- src/cpp/ripple/Ledger.h | 14 +++---- src/cpp/ripple/LedgerMaster.cpp | 40 ++++++++++++-------- src/cpp/ripple/LedgerMaster.h | 2 +- src/cpp/ripple/NetworkOPs.cpp | 2 +- src/cpp/ripple/ripple_LedgerHistory.cpp | 13 ++++--- src/cpp/ripple/ripple_LedgerHistory.h | 2 +- 7 files changed, 69 insertions(+), 53 deletions(-) diff --git a/src/cpp/ripple/Ledger.cpp b/src/cpp/ripple/Ledger.cpp index 1f353bd2b4..4b0300a554 100644 --- a/src/cpp/ripple/Ledger.cpp +++ b/src/cpp/ripple/Ledger.cpp @@ -15,7 +15,7 @@ Ledger::Ledger (const RippleAddress& masterID, uint64 startAmount) , mCloseFlags (0) , mClosed (false) , mValidHash (false) - , mValidated (false) + , mAccepted (false) , mImmutable (false) , mTransactionMap (boost::make_shared (smtTRANSACTION)) , mAccountStateMap (boost::make_shared (smtSTATE)) @@ -59,7 +59,7 @@ Ledger::Ledger (uint256 const& parentHash, , mCloseFlags (closeFlags) , mClosed (false) , mValidHash (false) - , mValidated (false) + , mAccepted (false) , mImmutable (true) , mTransactionMap (boost::make_shared (smtTRANSACTION, transHash)) , mAccountStateMap (boost::make_shared (smtSTATE, accountHash)) @@ -98,7 +98,7 @@ Ledger::Ledger (Ledger& ledger, , mCloseFlags (ledger.mCloseFlags) , mClosed (ledger.mClosed) , mValidHash (false) - , mValidated (ledger.mValidated) + , mAccepted (ledger.mAccepted) , mImmutable (!isMutable) , mTransactionMap (ledger.mTransactionMap->snapShot (isMutable)) , mAccountStateMap (ledger.mAccountStateMap->snapShot (isMutable)) @@ -117,7 +117,7 @@ Ledger::Ledger (bool /* dummy */, , mCloseFlags (0) , mClosed (false) , mValidHash (false) - , mValidated (true) + , mAccepted (false) , mImmutable (false) , mTransactionMap (boost::make_shared (smtTRANSACTION)) , mAccountStateMap (prevLedger.mAccountStateMap->snapShot (true)) @@ -149,7 +149,7 @@ Ledger::Ledger (Blob const& rawLedger, bool hasPrefix) : mClosed (false) , mValidHash (false) - , mValidated (false) + , mAccepted (false) , mImmutable (true) { Serializer s (rawLedger); @@ -160,7 +160,7 @@ Ledger::Ledger (Blob const& rawLedger, } Ledger::Ledger (const std::string& rawLedger, bool hasPrefix) : - mClosed (false), mValidHash (false), mValidated (false), mImmutable (true) + mClosed (false), mValidHash (false), mAccepted (false), mImmutable (true) { Serializer s (rawLedger); setRaw (s, hasPrefix); @@ -243,10 +243,11 @@ void Ledger::addRaw (Serializer& s) const void Ledger::setAccepted (uint32 closeTime, int closeResolution, bool correctCloseTime) { // used when we witnessed the consensus - assert (mClosed); + assert (mClosed && !mAccepted); mCloseTime = correctCloseTime ? roundCloseTime (closeTime, closeResolution) : closeTime; mCloseResolution = closeResolution; mCloseFlags = correctCloseTime ? 0 : sLCF_NoConsensusTime; + mAccepted = true; setImmutable (); } @@ -257,6 +258,7 @@ void Ledger::setAccepted () if ((mCloseFlags & sLCF_NoConsensusTime) == 0) mCloseTime = roundCloseTime (mCloseTime, mCloseResolution); + mAccepted = true; setImmutable (); } @@ -497,9 +499,9 @@ uint256 Ledger::getHash () return mHash; } -void Ledger::saveValidatedLedger (Job&) +void Ledger::saveAcceptedLedger (Job&, bool fromConsensus) { - WriteLog (lsTRACE, Ledger) << "saveValidatedLedger " << getLedgerSeq (); + WriteLog (lsTRACE, Ledger) << "saveAcceptedLedger " << (fromConsensus ? "fromConsensus " : "fromAcquire ") << getLedgerSeq (); static boost::format ledgerExists ("SELECT LedgerSeq FROM Ledgers INDEXED BY SeqLedger where LedgerSeq = %u;"); static boost::format deleteLedger ("DELETE FROM Ledgers WHERE LedgerSeq = %u;"); static boost::format deleteTrans1 ("DELETE FROM Transactions WHERE LedgerSeq = %u;"); @@ -521,7 +523,7 @@ void Ledger::saveValidatedLedger (Job&) if (getAccountHash () != mAccountStateMap->getHash ()) { WriteLog (lsFATAL, Ledger) << "sAL: " << getAccountHash () << " != " << mAccountStateMap->getHash (); - WriteLog (lsFATAL, Ledger) << "saveValidatedLedger: seq=" << mLedgerSeq; + WriteLog (lsFATAL, Ledger) << "saveAcceptedLedger: seq=" << mLedgerSeq << ", fromcons=" << fromConsensus; assert (false); } @@ -604,6 +606,9 @@ void Ledger::saveValidatedLedger (Job&) mCloseResolution % mCloseFlags % mAccountHash.GetHex () % mTransHash.GetHex ())); } + if (!fromConsensus && (theConfig.NODE_SIZE < 2)) // tiny or small + dropCache (); + if (getApp().getJobQueue ().getJobCountTotal (jtPUBOLDLEDGER) < 2) getApp().getLedgerMaster ().resumeAcquiring (); else @@ -727,9 +732,11 @@ Ledger::pointer Ledger::getSQL (const std::string& sql) if (!loaded) return Ledger::pointer (); - ret->setValidated (); ret->setClosed (); + if (getApp().getOPs ().haveLedger (ledgerSeq)) + ret->setAccepted (); + if (ret->getHash () != ledgerHash) { if (ShouldLog (lsERROR, Ledger)) @@ -793,7 +800,9 @@ void Ledger::getSQL2 (Ledger::ref ret) { ret->setClosed (); ret->setImmutable (); - ret->setValidated (); + + if (getApp().getOPs ().haveLedger (ret->getLedgerSeq ())) + ret->setAccepted (); WriteLog (lsTRACE, Ledger) << "Loaded ledger: " << ret->getHash ().GetHex (); } @@ -950,7 +959,7 @@ Json::Value Ledger::getJson (int options) ledger["ledger_hash"] = mHash.GetHex (); ledger["transaction_hash"] = mTransHash.GetHex (); ledger["account_hash"] = mAccountHash.GetHex (); - ledger["validated"] = mValidated; + ledger["accepted"] = mAccepted; ledger["total_coins"] = boost::lexical_cast (mTotCoins); if (mCloseTime != 0) @@ -1794,19 +1803,17 @@ uint32 Ledger::roundCloseTime (uint32 closeTime, uint32 closeResolution) return closeTime - (closeTime % closeResolution); } -void Ledger::pendSaveValidated () +void Ledger::pendSave (bool fromConsensus) { - if (getApp().getHashRouter ().setFlag (getHash (), SF_SAVED)) + if (!fromConsensus && !getApp().getHashRouter ().setFlag (getHash (), SF_SAVED)) return; - assert (isImmutable() && isValidated()); - - bool isNew = getLedgerSeq() > getApp().getLedgerMaster().getPublishedLedger()->getLedgerSeq(); + assert (isImmutable ()); getApp().getJobQueue ().addJob ( - isNew ? jtPUBLEDGER : jtPUBOLDLEDGER, - isNew ? "Ledger::pendSave" : "Ledger::pendOldSave", - BIND_TYPE (&Ledger::saveValidatedLedger, shared_from_this (), P_1)); + fromConsensus ? jtPUBLEDGER : jtPUBOLDLEDGER, + fromConsensus ? "Ledger::pendSave" : "Ledger::pendOldSave", + BIND_TYPE (&Ledger::saveAcceptedLedger, shared_from_this (), P_1, fromConsensus)); } diff --git a/src/cpp/ripple/Ledger.h b/src/cpp/ripple/Ledger.h index b581716080..6d0ddc686a 100644 --- a/src/cpp/ripple/Ledger.h +++ b/src/cpp/ripple/Ledger.h @@ -93,18 +93,14 @@ public: } void setAccepted (uint32 closeTime, int closeResolution, bool correctCloseTime); void setAccepted (); - void setValidated () - { - mValidated = mClosed = true; - } void setImmutable (); bool isClosed () { return mClosed; } - bool isValidated () + bool isAccepted () { - return mValidated; + return mAccepted; } bool isImmutable () { @@ -232,7 +228,7 @@ public: static uint256 getHashByIndex (uint32 index); static bool getHashesByIndex (uint32 index, uint256 & ledgerHash, uint256 & parentHash); static std::map< uint32, std::pair > getHashesByIndex (uint32 minSeq, uint32 maxSeq); - void pendSaveValidated (); + void pendSave (bool fromConsensus); // next/prev function SLE::pointer getSLE (uint256 const & uHash); // SLE is mutable @@ -430,7 +426,7 @@ protected: // returned SLE is immutable SLE::pointer getASNodeI (uint256 const & nodeID, LedgerEntryType let); - void saveValidatedLedger (Job&); + void saveAcceptedLedger (Job&, bool fromConsensus); void updateFees (); @@ -453,7 +449,7 @@ private: uint32 mParentCloseTime; // when the previous ledger closed int mCloseResolution; // the resolution for this ledger close time (2-120 seconds) uint32 mCloseFlags; // flags indicating how this ledger close took place - bool mClosed, mValidHash, mValidated, mImmutable; + bool mClosed, mValidHash, mAccepted, mImmutable; uint32 mReferenceFeeUnits; // Fee units for the reference transaction uint32 mReserveBase, mReserveIncrement; // Reserve basse and increment in fee units diff --git a/src/cpp/ripple/LedgerMaster.cpp b/src/cpp/ripple/LedgerMaster.cpp index a807bba2bf..b38aa654a4 100644 --- a/src/cpp/ripple/LedgerMaster.cpp +++ b/src/cpp/ripple/LedgerMaster.cpp @@ -105,16 +105,23 @@ void LedgerMaster::pushLedger (Ledger::pointer newLedger) mFinalizedLedger = mCurrentLedger; mCurrentLedger = newLedger; mEngine.setLedger (newLedger); - mLedgerHistory.addLedger (newLedger); } void LedgerMaster::pushLedger (Ledger::pointer newLCL, Ledger::pointer newOL, bool fromConsensus) { - assert (newLCL->isClosed () && newLCL->isImmutable()); - assert (!newOL->isClosed ()); + assert (newLCL->isClosed () && newLCL->isAccepted ()); + assert (!newOL->isClosed () && !newOL->isAccepted ()); boost::recursive_mutex::scoped_lock ml (mLock); + if (newLCL->isAccepted ()) + { + assert (newLCL->isClosed ()); + assert (newLCL->isImmutable ()); + mLedgerHistory.addAcceptedLedger (newLCL, fromConsensus); + WriteLog (lsINFO, LedgerMaster) << "StashAccepted: " << newLCL->getHash (); + } + { boost::recursive_mutex::scoped_lock ml (mLock); mFinalizedLedger = newLCL; @@ -145,6 +152,9 @@ void LedgerMaster::switchLedgers (Ledger::pointer lastClosed, Ledger::pointer cu void LedgerMaster::storeLedger (Ledger::pointer ledger) { mLedgerHistory.addLedger (ledger); + + if (ledger->isAccepted ()) + mLedgerHistory.addAcceptedLedger (ledger, false); } Ledger::pointer LedgerMaster::closeLedger (bool recover) @@ -320,10 +330,7 @@ bool LedgerMaster::acquireMissingLedger (Ledger::ref origLedger, uint256 const& Ledger::pointer lgr = mMissingLedger->getLedger (); if (lgr && (lgr->getLedgerSeq () == ledgerSeq)) - { - lgr->setValidated(); missingAcquireComplete (mMissingLedger); - } mMissingLedger.reset (); return true; @@ -366,8 +373,8 @@ bool LedgerMaster::acquireMissingLedger (Ledger::ref origLedger, uint256 const& if (acq && acq->isComplete ()) { acq->getLedger ()->setAccepted (); - setValidatedLedger (acq->getLedger ()); - mLedgerHistory.addValidatedLedger (acq->getLedger ()); + setFullLedger (acq->getLedger ()); + mLedgerHistory.addAcceptedLedger (acq->getLedger (), false); } else ++fetchCount; @@ -431,8 +438,9 @@ void LedgerMaster::missingAcquireComplete (InboundLedger::pointer acq) if (acq->isComplete ()) { - setValidatedLedger (acq->getLedger ()); - mLedgerHistory.addValidatedLedger (acq->getLedger ()); + acq->getLedger ()->setAccepted (); + setFullLedger (acq->getLedger ()); + mLedgerHistory.addAcceptedLedger (acq->getLedger (), false); } } @@ -528,7 +536,7 @@ void LedgerMaster::fixMismatch (Ledger::ref ledger) CondLog (invalidate != 0, lsWARNING, LedgerMaster) << "All " << invalidate << " prior ledgers invalidated"; } -void LedgerMaster::setValidatedLedger (Ledger::pointer ledger) +void LedgerMaster::setFullLedger (Ledger::pointer ledger) { // A new ledger has been accepted as part of the trusted chain WriteLog (lsDEBUG, LedgerMaster) << "Ledger " << ledger->getLedgerSeq () << " accepted :" << ledger->getHash (); @@ -539,11 +547,13 @@ void LedgerMaster::setValidatedLedger (Ledger::pointer ledger) boost::recursive_mutex::scoped_lock ml (mLock); - ledger->setValidated(); - mCompleteLedgers.setValue (ledger->getLedgerSeq ()); - ledger->pendSaveValidated (); + if (Ledger::getHashByIndex (ledger->getLedgerSeq ()) != ledger->getHash ()) + { + ledger->pendSave (false); + return; + } if ((ledger->getLedgerSeq () != 0) && mCompleteLedgers.hasValue (ledger->getLedgerSeq () - 1)) { @@ -809,7 +819,7 @@ void LedgerMaster::pubThread () BOOST_FOREACH (Ledger::ref l, ledgers) { WriteLog (lsDEBUG, LedgerMaster) << "Publishing ledger " << l->getLedgerSeq (); - setValidatedLedger (l); + setFullLedger (l); // OPTIMIZEME: This is actually more work than we need to do getApp().getOPs ().pubLedger (l); published = true; } diff --git a/src/cpp/ripple/LedgerMaster.h b/src/cpp/ripple/LedgerMaster.h index 91cd0aab88..d000566ae5 100644 --- a/src/cpp/ripple/LedgerMaster.h +++ b/src/cpp/ripple/LedgerMaster.h @@ -89,7 +89,7 @@ public: void pushLedger (Ledger::pointer newLCL, Ledger::pointer newOL, bool fromConsensus); void storeLedger (Ledger::pointer); - void setValidatedLedger (Ledger::pointer ledger); + void setFullLedger (Ledger::pointer ledger); void switchLedgers (Ledger::pointer lastClosed, Ledger::pointer newCurrent); diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index d4325e5285..cba75861dc 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -1255,7 +1255,7 @@ NetworkOPs::getAccountTxs (const RippleAddress& account, int32 minLedger, int32 WriteLog(lsWARNING, NetworkOPs) << "Recovering ledger " << seq << ", txn " << txn->getID(); Ledger::pointer ledger = getLedgerBySeq(seq); if (ledger) - ledger->pendSaveValidated(); + ledger->pendSave(false); } TransactionMetaSet::pointer meta = boost::make_shared (txn->getID (), txn->getLedger (), rawMeta.getData ()); diff --git a/src/cpp/ripple/ripple_LedgerHistory.cpp b/src/cpp/ripple/ripple_LedgerHistory.cpp index 25ed41b5db..f15fd67bdc 100644 --- a/src/cpp/ripple/ripple_LedgerHistory.cpp +++ b/src/cpp/ripple/ripple_LedgerHistory.cpp @@ -27,16 +27,19 @@ void LedgerHistory::addLedger (Ledger::pointer ledger) mLedgersByHash.canonicalize (ledger->getHash (), ledger, true); } -void LedgerHistory::addValidatedLedger (Ledger::pointer ledger) +void LedgerHistory::addAcceptedLedger (Ledger::pointer ledger, bool fromConsensus) { - assert (ledger && ledger->isValidated () && ledger->isImmutable ()); + assert (ledger && ledger->isAccepted () && ledger->isImmutable ()); assert (ledger->peekAccountStateMap ()->getHash ().isNonZero ()); uint256 h (ledger->getHash ()); boost::recursive_mutex::scoped_lock sl (mLedgersByHash.peekMutex ()); - mLedgersByHash.canonicalize (h, ledger); + mLedgersByHash.canonicalize (h, ledger, true); + assert (ledger); + assert (ledger->isAccepted ()); + assert (ledger->isImmutable ()); mLedgersByIndex[ledger->getLedgerSeq ()] = ledger->getHash (); - ledger->pendSaveValidated (); + ledger->pendSave (fromConsensus); } uint256 LedgerHistory::getLedgerHash (uint32 index) @@ -123,7 +126,7 @@ Ledger::pointer LedgerHistory::canonicalizeLedger (Ledger::pointer ledger, bool boost::recursive_mutex::scoped_lock sl (mLedgersByHash.peekMutex ()); mLedgersByHash.canonicalize (h, ledger); - if (ledger->isValidated ()) + if (ledger->isAccepted ()) mLedgersByIndex[ledger->getLedgerSeq ()] = ledger->getHash (); return ledger; diff --git a/src/cpp/ripple/ripple_LedgerHistory.h b/src/cpp/ripple/ripple_LedgerHistory.h index 8e756004eb..a0629a79f4 100644 --- a/src/cpp/ripple/ripple_LedgerHistory.h +++ b/src/cpp/ripple/ripple_LedgerHistory.h @@ -15,7 +15,7 @@ public: void addLedger (Ledger::pointer ledger); - void addValidatedLedger (Ledger::pointer ledger); + void addAcceptedLedger (Ledger::pointer ledger, bool fromConsensus); float getCacheHitRate () { From b10ba1589376fc622812a64b3170ff2dadb3d4f7 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Tue, 30 Jul 2013 11:40:20 -0700 Subject: [PATCH 04/15] Add Null backend --- src/cpp/ripple/ripple_Main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cpp/ripple/ripple_Main.cpp b/src/cpp/ripple/ripple_Main.cpp index a2babe10b1..28bf95289b 100644 --- a/src/cpp/ripple/ripple_Main.cpp +++ b/src/cpp/ripple/ripple_Main.cpp @@ -196,6 +196,7 @@ int rippleMain (int argc, char** argv) // These must be added before the Application object is created NodeStore::addBackendFactory (SqliteBackendFactory::getInstance ()); NodeStore::addBackendFactory (LevelDBBackendFactory::getInstance ()); + NodeStore::addBackendFactory (NullBackendFactory::getInstance ()); #if RIPPLE_HYPERLEVELDB_AVAILABLE NodeStore::addBackendFactory (HyperLevelDBBackendFactory::getInstance ()); #endif From 244c436888cecbb216a7b8cfa9ff3d56d63c546e Mon Sep 17 00:00:00 2001 From: wltsmrz Date: Thu, 25 Jul 2013 10:18:06 +0900 Subject: [PATCH 05/15] Update config-example --- test/config-example.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/config-example.js b/test/config-example.js index 45bb945967..175c016aa8 100644 --- a/test/config-example.js +++ b/test/config-example.js @@ -33,6 +33,7 @@ exports.servers = { // 'validation_seed' : "shhDFVsmS2GSu5vUyZSPXYfj1r79h", // 'validators' : "n9L8LZZCwsdXzKUN9zoVxs4YznYXZ9hEhsQZY7aVpxtFaSceiyDZ beta", 'local_signing' : false, + 'node_db': 'type=memory' } }; From 35b44139e6c05417e4d7f0a5ec43151263d2343b Mon Sep 17 00:00:00 2001 From: Stefan Thomas Date: Fri, 26 Jul 2013 12:59:07 -0700 Subject: [PATCH 06/15] JS Tests: Replace one of the hard-coded fees in the testsuite. More to go. --- test/offer-test.js | 22 ++++++++++++++-------- test/testutils.js | 4 +++- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/test/offer-test.js b/test/offer-test.js index 6d4af9584f..c2bc13df78 100644 --- a/test/offer-test.js +++ b/test/offer-test.js @@ -1651,14 +1651,16 @@ buster.testCase("Offer tfSell", { "basic sell" : function (done) { var self = this; - var final_create; + var final_create, seq_carol; async.waterfall([ function (callback) { // Provide micro amounts to compensate for fees to make results round nice. self.what = "Create accounts."; - testutils.create_accounts(self.remote, "root", "350.000020", ["alice", "bob", "mtgox"], callback); + var req_amount = self.remote.reserve(1).add(self.remote.fee_tx(20)).add(100000000); + testutils.create_accounts(self.remote, "root", req_amount.to_json(), + ["alice", "bob", "mtgox"], callback); }, function (callback) { self.what = "Set limits."; @@ -1687,19 +1689,21 @@ buster.testCase("Offer tfSell", { .set_flags('Sell') // Should not matter at all. .on('proposed', function (m) { // console.log("proposed: offer_create: %s", json.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + if (m.result !== 'tesSUCCESS') { + throw new Error("Bob's OfferCreate tx did not succeed: "+m.result); + } else callback(null); seq_carol = m.tx_json.sequence; }) .submit(); }, function (callback) { - // Alice has 350 fees - a reserve of 50 = 250 reserve = 100 available. + // Alice has 350 + fees - a reserve of 50 = 250 reserve = 100 available. // Ask for more than available to prove reserve works. self.what = "Create offer alice."; self.remote.transaction() - .offer_create("alice", "100/USD/mtgox", "100.0") + .offer_create("alice", "200/USD/mtgox", "200.0") .set_flags('Sell') // Should not matter at all. .on('proposed', function (m) { // console.log("proposed: offer_create: %s", json.stringify(m)); @@ -1732,7 +1736,7 @@ buster.testCase("Offer tfSell", { }, ], function (error) { // console.log("result: error=%s", error); - buster.refute(error); + buster.refute(error, self.what); done(); }); @@ -1741,7 +1745,7 @@ buster.testCase("Offer tfSell", { "2x sell exceed limit" : function (done) { var self = this; - var final_create; + var final_create, seq_carol; async.waterfall([ function (callback) { @@ -1797,7 +1801,9 @@ buster.testCase("Offer tfSell", { .set_flags('Sell') .on('proposed', function (m) { // console.log("proposed: offer_create: %s", json.stringify(m)); - callback(m.result !== 'tesSUCCESS'); + if (m.result !== 'tesSUCCESS') { + callback(new Error("Alice's OfferCreate didn't succeed: "+m.result)); + } else callback(null); seq_carol = m.tx_json.sequence; }) diff --git a/test/testutils.js b/test/testutils.js index 53bc3c8560..8b997909cc 100644 --- a/test/testutils.js +++ b/test/testutils.js @@ -160,7 +160,9 @@ var create_accounts = function (remote, src, amount, accounts, callback) { .on('proposed', function (m) { // console.log("proposed: %s", JSON.stringify(m)); - callback(m.result != 'tesSUCCESS'); + 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)); From a4ab94267968e4d00931d9e3d3c0f80ddf3a5294 Mon Sep 17 00:00:00 2001 From: Nicholas Dudfield Date: Sat, 27 Jul 2013 12:46:26 -0700 Subject: [PATCH 07/15] Make test suites pass (with tip of ripple-lib). Needs refactoring to use mocha --- test/offer-test.js | 144 ++++++++++++++++++++++++++++++++------------- test/testutils.js | 24 ++++++-- 2 files changed, 123 insertions(+), 45 deletions(-) diff --git a/test/offer-test.js b/test/offer-test.js index c2bc13df78..a15f205699 100644 --- a/test/offer-test.js +++ b/test/offer-test.js @@ -67,7 +67,7 @@ buster.testCase("Offer tests", { } ], function (error) { // console.log("result: error=%s", error); - buster.refute(error); + buster.refute(error, self.what || "Unspecifide Error"); done(); }); @@ -95,7 +95,7 @@ buster.testCase("Offer tests", { buster.assert.equals('tesSUCCESS', m.metadata.TransactionResult); buster.assert(final_create); - if (3 === ++dones) + if (3 === ++dones) done(); }) .submit(); @@ -116,7 +116,7 @@ buster.testCase("Offer tests", { buster.assert.equals('tesSUCCESS', m.metadata.TransactionResult); buster.assert(final_create); - if (3 === ++dones) + if (3 === ++dones) done(); }) .submit(); @@ -146,7 +146,7 @@ buster.testCase("Offer tests", { buster.assert.equals('tesSUCCESS', m.metadata.TransactionResult); buster.assert(final_create); - if (3 === ++dones) + if (3 === ++dones) done(); }) .submit(); @@ -161,7 +161,7 @@ buster.testCase("Offer tests", { } ], function (error) { // console.log("result: error=%s", error); - buster.refute(error); + buster.refute(error, self.what); done(); }); @@ -207,21 +207,23 @@ buster.testCase("Offer tests", { function (done) { var self = this; + var alices_initial_balance = 499946999680; + var bobs_initial_balance = 10199999920; + async.waterfall([ function (callback) { self.what = "Create mtgox account."; - - testutils.payment(self.remote, "root", "mtgox", "1149999730", callback); + testutils.payment(self.remote, "root", "mtgox", 1149999730, callback); }, function (callback) { self.what = "Create alice account."; - testutils.payment(self.remote, "root", "alice", "499946999680", callback); + testutils.payment(self.remote, "root", "alice", alices_initial_balance, callback); }, function (callback) { self.what = "Create bob account."; - testutils.payment(self.remote, "root", "bob", "10199999920", callback); + testutils.payment(self.remote, "root", "bob", bobs_initial_balance, callback); }, function (callback) { self.what = "Set transfer rate."; @@ -286,7 +288,7 @@ buster.testCase("Offer tests", { callback); }, function (callback) { - self.what = "Verify balances."; + self.what = "Verify balances. 1"; testutils.verify_balances(self.remote, { @@ -308,12 +310,36 @@ buster.testCase("Offer tests", { .submit(); }, function (callback) { - self.what = "Verify balances."; + self.what = "Verify balances. 2"; + + var alices_fees, alices_num_transactions, alices_tx_fee_units_total, + alices_tx_fee_units_total, alices_final_balance, + + bobs_fees, bobs_num_transactions, bobs_tx_fee_units_total, + bobs_tx_fee_units_total, bobs_final_balance; + + alices_num_transactions = 3; + alices_tx_fee_units_total = alices_num_transactions * Transaction.fee_units["default"] + alices_tx_fees_total = self.remote.fee_tx(alices_tx_fee_units_total); + alices_final_balance = Amount.from_json(alices_initial_balance) + .subtract(alices_tx_fees_total); + + bobs_num_transactions = 2; + bobs_tx_fee_units_total = bobs_num_transactions * Transaction.fee_units["default"] + bobs_tx_fees_total = self.remote.fee_tx(bobs_tx_fee_units_total); + bobs_final_balance = Amount.from_json(bobs_initial_balance) + .subtract(bobs_tx_fees_total); testutils.verify_balances(self.remote, { - "alice" : [ "-50/USD/mtgox", String(499946999680-3*(Transaction.fees['default'].to_number())) ], - "bob" : [ "2710505431213761e-33/USD/mtgox", String(10199999920-2*(Transaction.fees['default'].to_number())) ], + "alice" : [ "-50/USD/mtgox", alices_final_balance.to_json()], + "bob" : [ "2710505431213761e-33/USD/mtgox", + + bobs_final_balance.to_json() + + // bobs_final_balance.to_json() + // String(10199999920-(self.remote.fee_tx(2*(Transaction.fee_units['default'])))).to_number() + ], }, callback); }, @@ -397,8 +423,9 @@ buster.testCase("Offer tests", { testutils.verify_balances(self.remote, { - "alice" : [ "499/USD/mtgox", String(100000000000+4000000000-2*(Transaction.fees['default'].to_number())) ], - "bob" : [ "1/USD/mtgox", String(100000000000-4000000000-2*(Transaction.fees['default'].to_number())) ], + // "bob" : [ "1/USD/mtgox", String(100000000000-4000000000-(Number(self.remote.fee_tx(Transaction.fee_units['default'] * 2).to_json()))) ], + "bob" : [ "1/USD/mtgox", String(100000000000-4000000000-(self.remote.fee_tx(Transaction.fee_units['default'] * 2).to_number())) ], + "alice" : [ "499/USD/mtgox", String(100000000000+4000000000-(self.remote.fee_tx(Transaction.fee_units['default'] * 2).to_number())) ], }, callback); }, @@ -482,8 +509,8 @@ buster.testCase("Offer tests", { testutils.verify_balances(self.remote, { - "alice" : [ "499/USD/mtgox", String(100000000000+3000000000-2*(Transaction.fees['default'].to_number())) ], - "bob" : [ "1/USD/mtgox", String(100000000000-3000000000-2*(Transaction.fees['default'].to_number())) ], + "alice" : [ "499/USD/mtgox", String(100000000000+3000000000-(self.remote.fee_tx(2*(Transaction.fee_units['default'])).to_number())) ], + "bob" : [ "1/USD/mtgox", String(100000000000-3000000000-(self.remote.fee_tx(2*(Transaction.fee_units['default'])).to_number())) ], }, callback); }, @@ -561,7 +588,7 @@ buster.testCase("Offer tests", { self.what = "Create crossing offer."; self.remote.transaction() - .offer_create("bob", "1/USD/mtgox", "3000.0") // + .offer_create("bob", "1/USD/mtgox", "3000.0") // .on('proposed', function (m) { // console.log("PROPOSED: offer_create: %s", JSON.stringify(m)); @@ -574,8 +601,8 @@ buster.testCase("Offer tests", { testutils.verify_balances(self.remote, { - "alice" : [ "499/USD/mtgox", String(100000000000+3000000000-2*(Transaction.fees['default'].to_number())) ], - "bob" : [ "1/USD/mtgox", String(100000000000-3000000000-1*(Transaction.fees['default'].to_number())) ], + "alice" : [ "499/USD/mtgox", String(100000000000+3000000000-(self.remote.fee_tx(2*(Transaction.fee_units['default'])).to_number())) ], + "bob" : [ "1/USD/mtgox", String(100000000000-3000000000-(self.remote.fee_tx(1*(Transaction.fee_units['default'])).to_number())) ], }, callback); }, @@ -676,7 +703,7 @@ buster.testCase("Offer tests", { }, ], function (error) { // console.log("result: error=%s", error); - buster.refute(error); + buster.refute(error, self.what); if (error) done(); }); @@ -771,7 +798,7 @@ buster.testCase("Offer tests", { }, ], function (error) { // console.log("result: error=%s", error); - buster.refute(error); + buster.refute(error, self.what); if (error) done(); }); }, @@ -849,7 +876,7 @@ buster.testCase("Offer tests", { } ], function (error) { // console.log("result: error=%s", error); - buster.refute(error); + buster.refute(error, self.what); done(); }); @@ -947,7 +974,7 @@ buster.testCase("Offer tests", { testutils.verify_balances(self.remote, { - "alice" : [ "0/USD/mtgox", String(10000000000+500-2*(Transaction.fees['default'].to_number())) ], + "alice" : [ "0/USD/mtgox", String(10000000000+500-(self.remote.fee_tx(2*(Transaction.fee_units['default'])).to_number())) ], "bob" : "100/USD/mtgox", }, callback); @@ -1110,7 +1137,7 @@ buster.testCase("Offer tests", { testutils.verify_balances(self.remote, { - "alice" : [ "160/USD/mtgox", String(10000000000+200-2*(Transaction.fees['default'].to_number())) ], + "alice" : [ "160/USD/mtgox", String(10000000000+200-(self.remote.fee_tx(2*(Transaction.fee_units['default'])).to_number())) ], "bob" : "40/USD/mtgox", }, callback); @@ -1152,7 +1179,7 @@ buster.testCase("Offer tests", { testutils.verify_balances(self.remote, { - "alice" : [ "100/USD/mtgox", String(10000000000+200+300-4*(Transaction.fees['default'].to_number())) ], + "alice" : [ "100/USD/mtgox", String(10000000000+200+300-(self.remote.fee_tx(4*(Transaction.fee_units['default'])).to_number())) ], "bob" : "100/USD/mtgox", }, callback); @@ -1456,15 +1483,43 @@ buster.testCase("Offer tests 3", { // Provide micro amounts to compensate for fees to make results round nice. self.what = "Create accounts."; - testutils.create_accounts(self.remote, "root", "350.000020", ["alice", "bob", "mtgox"], callback); + // Alice has 3 entries in the ledger, via trust lines + var max_owner_count = 3; // + // We start off with a + var reserve_amount = self.remote.reserve(max_owner_count); + // console.log("\n"); + // console.log("reserve_amount reserve(max_owner_count=%s): %s", max_owner_count, reserve_amount.to_human()); + + // this.tx_json.Fee = this.remote.fee_tx(this.fee_units()).to_json(); + + // 1 for each trust limit == 3 (alice < mtgox/amazon/bitstamp) + // 1 for payment == 4 + var max_txs_per_user = 4; + + // We don't have access to the tx object[s] created below so we + // just dig into fee_units straight away + var fee_units_for_all_txs = ( Transaction.fee_units["default"] * + max_txs_per_user ); + + starting_xrp = reserve_amount.add(self.remote.fee_tx(fee_units_for_all_txs)) + // console.log("starting_xrp after %s fee units: ", fee_units_for_all_txs, starting_xrp.to_human()); + + starting_xrp = starting_xrp.add(Amount.from_json('100.0')); + // console.log("starting_xrp adding 100 xrp to sell", starting_xrp.to_human()); + + testutils.create_accounts(self.remote, + "root", + starting_xrp.to_json(), + ["alice", "bob", "mtgox", "amazon", "bitstamp"], + callback); }, function (callback) { self.what = "Set limits."; testutils.credit_limits(self.remote, { - "alice" : "1000/USD/mtgox", - "bob" : "1000/USD/mtgox", + "alice" : ["1000/USD/mtgox", "1000/USD/amazon","1000/USD/bitstamp"], + "bob" : ["1000/USD/mtgox", "1000/USD/amazon"], }, callback); }, @@ -1485,7 +1540,6 @@ buster.testCase("Offer tests 3", { .on('proposed', function (m) { // console.log("proposed: offer_create: %s", json.stringify(m)); callback(m.result !== 'tesSUCCESS'); - seq_carol = m.tx_json.sequence; }) .submit(); @@ -1521,14 +1575,14 @@ buster.testCase("Offer tests 3", { testutils.verify_balances(self.remote, { - "alice" : [ "100/USD/mtgox", "250.0" ], - "bob" : "400/USD/mtgox", + "alice" : [ "100/USD/mtgox", "350.0"], + "bob" : ["400/USD/mtgox", ], }, callback); }, ], function (error) { // console.log("result: error=%s", error); - buster.refute(error); + buster.refute(error, self.what); done(); }); @@ -1635,7 +1689,7 @@ buster.testCase("Offer tests 3", { }, ], function (error) { // console.log("result: error=%s", error); - buster.refute(error); + buster.refute(error, self.what); done(); }); @@ -1751,8 +1805,13 @@ buster.testCase("Offer tfSell", { function (callback) { // Provide micro amounts to compensate for fees to make results round nice. self.what = "Create accounts."; - - testutils.create_accounts(self.remote, "root", "350.000020", ["alice", "bob", "mtgox"], callback); + + var starting_xrp = self.amount_for({ + ledger_entries: 1, + default_transactions: 2, + extra: '100.0' + }); + testutils.create_accounts(self.remote, "root", starting_xrp, ["alice", "bob", "mtgox"], callback); }, function (callback) { self.what = "Set limits."; @@ -1783,7 +1842,6 @@ buster.testCase("Offer tfSell", { .on('proposed', function (m) { // console.log("proposed: offer_create: %s", json.stringify(m)); callback(m.result !== 'tesSUCCESS'); - seq_carol = m.tx_json.sequence; }) .submit(); @@ -1832,7 +1890,7 @@ buster.testCase("Offer tfSell", { }, ], function (error) { // console.log("result: error=%s", error); - buster.refute(error); + buster.refute(error, self.what); done(); }); @@ -1854,8 +1912,14 @@ 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, + extra: '100.0' + }); - testutils.create_accounts(self.remote, "root", "350.000020", ["alice", "bob", "mtgox"], callback); + testutils.create_accounts(self.remote, "root", starting_xrp, ["alice", "bob", "mtgox"], callback); }, function (callback) { self.what = "Set limits."; @@ -1928,7 +1992,7 @@ buster.testCase("Client Issue #535", { ], function (error) { if (error) console.log("result: %s: error=%s", self.what, error); - buster.refute(error); + buster.refute(error, self.what); done(); }); diff --git a/test/testutils.js b/test/testutils.js index 8b997909cc..748363e68e 100644 --- a/test/testutils.js +++ b/test/testutils.js @@ -1,10 +1,11 @@ -var async = require("async"); +var async = require("async"); -var Amount = require("ripple-lib").Amount; -var Remote = require("ripple-lib").Remote; -var Server = require("./server").Server; +var Amount = require("ripple-lib").Amount; +var Remote = require("ripple-lib").Remote; +var Server = require("./server").Server; +var Transaction = require("ripple-lib").Transaction; -var config = require('ripple-lib').config.load(require('./config')); +var config = require('ripple-lib').config.load(require('./config')); var account_dump = function (remote, account, callback) { var self = this; @@ -74,6 +75,18 @@ var build_setup = function (opts, host) { return function (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); + }; + + 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); + }; host = host || config.server_default; @@ -216,6 +229,7 @@ var verify_limit = function (remote, src, amount, callback) { } 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]; From 9576983d9c6cd716ab1896cf0835880a8ae6a2aa Mon Sep 17 00:00:00 2001 From: Stefan Thomas Date: Sat, 27 Jul 2013 19:47:51 -0700 Subject: [PATCH 08/15] JS Tests: Fallback to config-example if config is not present. --- test/account_set-test.js | 3 +-- test/account_tx-test.js | 5 ++--- test/jsonrpc-test.js | 2 +- test/monitor-test.js | 3 +-- test/offer-test.js | 5 ++--- test/path-test.js | 4 ++-- test/remote-test.js | 3 +-- test/send-test.js | 3 +-- test/testutils.js | 15 +++++++++++++++ test/websocket-test.js | 9 +++++---- 10 files changed, 31 insertions(+), 21 deletions(-) diff --git a/test/account_set-test.js b/test/account_set-test.js index 65352c3524..be89b23259 100644 --- a/test/account_set-test.js +++ b/test/account_set-test.js @@ -7,8 +7,7 @@ var Request = require("ripple-lib").Request; var Server = require("./server").Server; var testutils = require("./testutils"); - -var config = require('ripple-lib').config.load(require('./config')); +var config = testutils.init_config(); // How long to wait for server to start. var serverDelay = 1500; diff --git a/test/account_tx-test.js b/test/account_tx-test.js index 6c7a8babec..56b81c64c4 100644 --- a/test/account_tx-test.js +++ b/test/account_tx-test.js @@ -6,9 +6,8 @@ var Remote = require("ripple-lib").Remote; var Transaction = require("ripple-lib").Transaction; var Server = require("./server").Server; -var testutils = require("./testutils"); - -require('ripple-lib').config.load(require('./config')); +var testutils = require("./testutils"); +var config = testutils.init_config(); buster.testRunner.timeout = 350000; //This is a very long test! diff --git a/test/jsonrpc-test.js b/test/jsonrpc-test.js index c19c2636e1..7a6b9d61dd 100644 --- a/test/jsonrpc-test.js +++ b/test/jsonrpc-test.js @@ -10,7 +10,7 @@ var Server = require("./server").Server; var testutils = require("./testutils"); -var config = require('ripple-lib').config.load(require('./config')); +var config = testutils.init_config(); // How long to wait for server to start. var serverDelay = 1500; diff --git a/test/monitor-test.js b/test/monitor-test.js index 342dd7e4fb..e2ef06a738 100644 --- a/test/monitor-test.js +++ b/test/monitor-test.js @@ -6,8 +6,7 @@ var Remote = require("ripple-lib").Remote; var Server = require("./server").Server; var testutils = require("./testutils"); - -require('ripple-lib').config.load(require('./config')); +var config = testutils.init_config(); buster.testRunner.timeout = 5000; diff --git a/test/offer-test.js b/test/offer-test.js index a15f205699..ed015ab7a6 100644 --- a/test/offer-test.js +++ b/test/offer-test.js @@ -7,9 +7,8 @@ var Remote = require("ripple-lib").Remote; var Transaction = require("ripple-lib").Transaction; var Server = require("./server").Server; -var testutils = require("./testutils"); - -require('ripple-lib').config.load(require('./config')); +var testutils = require("./testutils"); +var config = testutils.init_config(); buster.testRunner.timeout = 5000; diff --git a/test/path-test.js b/test/path-test.js index 31aea5f4a6..3616122b3b 100644 --- a/test/path-test.js +++ b/test/path-test.js @@ -6,9 +6,9 @@ var Remote = require("ripple-lib").Remote; var Transaction = require("ripple-lib").Transaction; var Server = require("./server").Server; -var testutils = require("./testutils"); +var testutils = require("./testutils"); +var config = testutils.init_config(); -require('ripple-lib').config.load(require('./config')); buster.testRunner.timeout = 5000; diff --git a/test/remote-test.js b/test/remote-test.js index 841f3df0d0..0b390e3005 100644 --- a/test/remote-test.js +++ b/test/remote-test.js @@ -5,8 +5,7 @@ var Remote = require("ripple-lib").Remote; var Server = require("./server.js").Server; var testutils = require("./testutils.js"); - -var config = require('ripple-lib').config.load(require('./config')); +var config = testutils.init_config(); // How long to wait for server to start. var serverDelay = 1500; // XXX Not implemented. diff --git a/test/send-test.js b/test/send-test.js index dd98c41bc4..15d363ddf5 100644 --- a/test/send-test.js +++ b/test/send-test.js @@ -6,8 +6,7 @@ var Remote = require("ripple-lib").Remote; var Server = require("./server").Server; var testutils = require("./testutils"); - -var config = require('ripple-lib').config.load(require('./config')); +var config = testutils.init_config(); // How long to wait for server to start. var serverDelay = 1500; diff --git a/test/testutils.js b/test/testutils.js index 748363e68e..579d57ed05 100644 --- a/test/testutils.js +++ b/test/testutils.js @@ -218,6 +218,20 @@ var credit_limit = function (remote, src, amount, callback) { } }; +function init_config() { + var cfg; + + // See if the person testing wants to override the configuration by creating a + // file called test/config.js. + try { + cfg = require('./config'); + } catch (e) { + cfg = require('./config-example'); + } + + return require('ripple-lib').config.load(cfg); +} + var verify_limit = function (remote, src, amount, callback) { assert(4 === arguments.length); @@ -486,6 +500,7 @@ exports.build_teardown = build_teardown; exports.create_accounts = create_accounts; exports.credit_limit = credit_limit; exports.credit_limits = credit_limits; +exports.init_config = init_config; exports.ledger_close = ledger_close; exports.payment = payment; exports.payments = payments; diff --git a/test/websocket-test.js b/test/websocket-test.js index e0a9704984..a96bc3bf9d 100644 --- a/test/websocket-test.js +++ b/test/websocket-test.js @@ -1,9 +1,10 @@ -var buster = require("buster"); +var buster = require("buster"); -var Server = require("./server").Server; -var Remote = require("ripple-lib").Remote; +var Server = require("./server").Server; +var Remote = require("ripple-lib").Remote; -var config = require('ripple-lib').config.load(require('./config')); +var testutils = require('./testutils'); +var config = testutils.init_config(); buster.testRunner.timeout = 5000; From 5d1b5c735306f1a26c1a771d4184ad130b277f29 Mon Sep 17 00:00:00 2001 From: Stefan Thomas Date: Sat, 27 Jul 2013 20:18:59 -0700 Subject: [PATCH 09/15] JS Tests: Refactored config handling. Still far from perfect, but better than it was. --- test/config-example.js | 8 +++++--- test/server-test.js | 30 ++++++++++++++++++------------ test/server.js | 12 +++++++----- test/testutils.js | 29 ++++++++++++++++++++--------- test/websocket-test.js | 20 ++++++++++++++++++-- 5 files changed, 68 insertions(+), 31 deletions(-) diff --git a/test/config-example.js b/test/config-example.js index 175c016aa8..3b8bfa250d 100644 --- a/test/config-example.js +++ b/test/config-example.js @@ -7,11 +7,13 @@ var testconfig = require("./testconfig.js"); exports.accounts = testconfig.accounts; -// Where to find the binary. -exports.rippled = path.resolve("build/rippled"); - exports.server_default = "alpha"; +exports.default_server_config = { + // Where to find the binary. + rippled_path: path.resolve(__dirname, "../build/rippled") +}; + // // Configuration for servers. // diff --git a/test/server-test.js b/test/server-test.js index 434563c166..b2800e1d31 100644 --- a/test/server-test.js +++ b/test/server-test.js @@ -1,6 +1,9 @@ -var buster = require("buster"); +var buster = require("buster"); +var extend = require("extend"); +var Server = require("./server").Server; + var testutils = require("./testutils"); -var Server = require("./server").Server; +var config = testutils.init_config(); // How long to wait for server to start. // var serverDelay = 1500; @@ -9,19 +12,22 @@ var alpha; buster.testCase("Standalone server startup", { "server start and stop" : function (done) { - alpha = Server.from_config("alpha", false); //ADD ,true for verbosity + var cfg = extend({}, config.default_server_config, + config.servers.alpha); - alpha - .on('started', function () { - alpha - .on('stopped', function () { - buster.assert(true); + alpha = Server.from_config("alpha", cfg); - done(); - }) - .stop(); + alpha + .on('started', function () { + alpha + .on('stopped', function () { + buster.assert(true); + + done(); }) - .start(); + .stop(); + }) + .start(); } }); diff --git a/test/server.js b/test/server.js index f47189cafd..cbdf68475d 100644 --- a/test/server.js +++ b/test/server.js @@ -22,7 +22,6 @@ var path = require("path"); var util = require("util"); var EventEmitter = require('events').EventEmitter; -var config = require("./config"); var nodeutils = require("./nodeutils"); // Create a server object @@ -58,8 +57,8 @@ var Server = function (name, config, verbose) { util.inherits(Server, EventEmitter); -Server.from_config = function (name, verbose) { - return new Server(name, config.servers[name], verbose); +Server.from_config = function (name, config, verbose) { + return new Server(name, config, verbose); }; Server.prototype.on = function (e, c) { @@ -106,7 +105,7 @@ Server.prototype._serverSpawnSync = function() { // Spawn in standalone mode for now. this.child = child.spawn( - config.rippled, + this.config.rippled_path, args, { cwd: this.serverPath(), @@ -116,7 +115,10 @@ Server.prototype._serverSpawnSync = function() { if (!this.quiet) console.log("server: start %s: %s --conf=%s", - this.child.pid, config.rippled, args.join(" "), this.configPath()); + this.child.pid, + this.config.rippled_path, + args.join(" "), + this.configPath()); // By default, just log exits. this.child.on('exit', function(code, signal) { diff --git a/test/testutils.js b/test/testutils.js index 579d57ed05..0e06d28992 100644 --- a/test/testutils.js +++ b/test/testutils.js @@ -1,12 +1,11 @@ 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 config = require('ripple-lib').config.load(require('./config')); - var account_dump = function (remote, account, callback) { var self = this; @@ -65,6 +64,8 @@ var account_dump = function (remote, account, callback) { * @param host {String} Identifier for the host configuration to be used. */ var build_setup = function (opts, host) { + var config = get_config(); + opts = opts || {}; // Normalize options @@ -100,8 +101,12 @@ var build_setup = function (opts, host) { function runServerStep(callback) { if (opts.no_server) return callback(); + var server_config = extend({}, config.default_server_config, + config.servers[host]); + data.server = Server - .from_config(host, !!opts.verbose_server) + .from_config(host, server_config, + !!opts.verbose_server) .on('started', callback) .on('exited', function () { // If know the remote, tell it server is gone. @@ -127,6 +132,7 @@ var build_setup = function (opts, host) { * @param host {String} Identifier for the host configuration to be used. */ var build_teardown = function (host) { + var config = get_config(); return function (done) { host = host || config.server_default; @@ -218,16 +224,20 @@ var credit_limit = function (remote, src, amount, callback) { } }; -function init_config() { - var cfg; +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 = require('./config'); - } catch (e) { - cfg = require('./config-example'); - } + cfg = extend({}, cfg, require('./config')); + } catch (e) { } + + return cfg; +} + +function init_config() { + var cfg = get_config(); return require('ripple-lib').config.load(cfg); } @@ -500,6 +510,7 @@ exports.build_teardown = build_teardown; exports.create_accounts = create_accounts; exports.credit_limit = credit_limit; exports.credit_limits = credit_limits; +exports.get_config = get_config; exports.init_config = init_config; exports.ledger_close = ledger_close; exports.payment = payment; diff --git a/test/websocket-test.js b/test/websocket-test.js index a96bc3bf9d..2415288f02 100644 --- a/test/websocket-test.js +++ b/test/websocket-test.js @@ -1,4 +1,5 @@ var buster = require("buster"); +var extend = require("extend"); var Server = require("./server").Server; var Remote = require("ripple-lib").Remote; @@ -8,12 +9,27 @@ var config = testutils.init_config(); buster.testRunner.timeout = 5000; +var server; buster.testCase("WebSocket connection", { 'setUp' : - function (done) { if (config.servers.alpha.no_server) done(); else server = Server.from_config("alpha").on('started', done).start(); }, + function (done) { + var cfg = extend({}, config.default_server_config, + config.servers.alpha); + if (cfg.no_server) { + done(); + } else { + server = Server.from_config("alpha", cfg).on('started', done).start(); + } + }, 'tearDown' : - function (done) { if (config.servers.alpha.no_server) done(); else server.on('stopped', done).stop(); }, + function (done) { + if (config.servers.alpha.no_server) { + done(); + } else { + server.on('stopped', done).stop(); + } + }, "websocket connect and disconnect" : function (done) { From 05c7fc5cd46686e0b570c425135917aa9ed1a253 Mon Sep 17 00:00:00 2001 From: wltsmrz Date: Thu, 25 Jul 2013 10:23:54 +0900 Subject: [PATCH 10/15] Bump ripple-lib version, add mocha --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9b13c2daab..ef3ee95112 100644 --- a/package.json +++ b/package.json @@ -10,13 +10,14 @@ }, "dependencies": { - "ripple-lib": "0.7.10", + "ripple-lib": "0.7.17", "async": "~0.1.22", "extend": "~1.1.1", "simple-jsonrpc": "~0.0.1" }, "devDependencies": { - "buster": "~0.6.12" + "buster": "~0.6.12", + "mocha": "~1.12.0" }, "scripts": { From 26978aaa3af32dc7e24cc0125c723c6ebaab1f2d Mon Sep 17 00:00:00 2001 From: Stefan Thomas Date: Sat, 27 Jul 2013 19:27:23 -0700 Subject: [PATCH 11/15] JS Tests: Link to buster-test module directly. More reliable. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ef3ee95112..a42ed320ad 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ }, "scripts": { - "test": "./node_modules/buster/bin/buster test" + "test": "./node_modules/buster/bin/buster-test" }, "repository": { From 87c4a41a0b2e381413b6b64f967104bf81184589 Mon Sep 17 00:00:00 2001 From: Stefan Thomas Date: Sat, 27 Jul 2013 19:37:37 -0700 Subject: [PATCH 12/15] Update ripple-lib to 0.7.18. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a42ed320ad..3009ee8227 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ }, "dependencies": { - "ripple-lib": "0.7.17", + "ripple-lib": "0.7.18", "async": "~0.1.22", "extend": "~1.1.1", "simple-jsonrpc": "~0.0.1" From a8efd9aa78fb0790d81abe226af44895ad81981d Mon Sep 17 00:00:00 2001 From: Stefan Thomas Date: Tue, 30 Jul 2013 14:11:54 -0700 Subject: [PATCH 13/15] Add memory backend. --- src/cpp/ripple/ripple_Main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cpp/ripple/ripple_Main.cpp b/src/cpp/ripple/ripple_Main.cpp index 28bf95289b..9c4e758546 100644 --- a/src/cpp/ripple/ripple_Main.cpp +++ b/src/cpp/ripple/ripple_Main.cpp @@ -194,6 +194,7 @@ int rippleMain (int argc, char** argv) p.add ("parameters", -1); // These must be added before the Application object is created + NodeStore::addBackendFactory (MemoryBackendFactory::getInstance ()); NodeStore::addBackendFactory (SqliteBackendFactory::getInstance ()); NodeStore::addBackendFactory (LevelDBBackendFactory::getInstance ()); NodeStore::addBackendFactory (NullBackendFactory::getInstance ()); From d588bb35edb6e7185b8ed8c673f759583214245f Mon Sep 17 00:00:00 2001 From: Stefan Thomas Date: Tue, 30 Jul 2013 14:14:45 -0700 Subject: [PATCH 14/15] Make "type=Memory" correct case. --- test/config-example.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/config-example.js b/test/config-example.js index 3b8bfa250d..4191a745ca 100644 --- a/test/config-example.js +++ b/test/config-example.js @@ -35,7 +35,7 @@ exports.servers = { // 'validation_seed' : "shhDFVsmS2GSu5vUyZSPXYfj1r79h", // 'validators' : "n9L8LZZCwsdXzKUN9zoVxs4YznYXZ9hEhsQZY7aVpxtFaSceiyDZ beta", 'local_signing' : false, - 'node_db': 'type=memory' + 'node_db': 'type=Memory' } }; From c81a4d301e54695b028c1effe13c26d16186b887 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 30 Jul 2013 14:46:01 -0700 Subject: [PATCH 15/15] Release candidate is 0.9-c --- modules/ripple_app/basics/ripple_Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ripple_app/basics/ripple_Version.h b/modules/ripple_app/basics/ripple_Version.h index 05cfc437aa..f5fb669e4a 100644 --- a/modules/ripple_app/basics/ripple_Version.h +++ b/modules/ripple_app/basics/ripple_Version.h @@ -14,7 +14,7 @@ // VFALCO TODO Roll this together into ripple_BuildVersion #define SERVER_VERSION_MAJOR 0 #define SERVER_VERSION_MINOR 9 -#define SERVER_VERSION_SUB "-b" +#define SERVER_VERSION_SUB "-c" #define SERVER_NAME "Ripple" #define SV_STRINGIZE(x) SV_STRINGIZE2(x)