mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 03:52:49 +01:00
Merge pull request #4564 from Munkybooty/backports-0.19-pr5
Backports 0.19 pr5
This commit is contained in:
commit
649273e703
@ -207,7 +207,7 @@ test_dash_filtered.info: test_dash.info
|
|||||||
$(LCOV) -a $@ $(LCOV_OPTS) -o $@
|
$(LCOV) -a $@ $(LCOV_OPTS) -o $@
|
||||||
|
|
||||||
functional_test.info: test_dash_filtered.info
|
functional_test.info: test_dash_filtered.info
|
||||||
-@TIMEOUT=15 test/functional/test_runner.py $(EXTENDED_FUNCTIONAL_TESTS)
|
@TIMEOUT=15 test/functional/test_runner.py $(EXTENDED_FUNCTIONAL_TESTS)
|
||||||
$(LCOV) -c $(LCOV_OPTS) -d $(abs_builddir)/src --t functional-tests -o $@
|
$(LCOV) -c $(LCOV_OPTS) -d $(abs_builddir)/src --t functional-tests -o $@
|
||||||
$(LCOV) -z $(LCOV_OPTS) -d $(abs_builddir)/src
|
$(LCOV) -z $(LCOV_OPTS) -d $(abs_builddir)/src
|
||||||
|
|
||||||
|
@ -52,8 +52,6 @@ script: |
|
|||||||
|
|
||||||
export QT_RCC_TEST=1
|
export QT_RCC_TEST=1
|
||||||
export QT_RCC_SOURCE_DATE_OVERRIDE=1
|
export QT_RCC_SOURCE_DATE_OVERRIDE=1
|
||||||
export GZIP="-9n"
|
|
||||||
export TAR_OPTIONS="--mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME""
|
|
||||||
export TZ="UTC"
|
export TZ="UTC"
|
||||||
export BUILD_DIR="$PWD"
|
export BUILD_DIR="$PWD"
|
||||||
mkdir -p ${WRAP_DIR}
|
mkdir -p ${WRAP_DIR}
|
||||||
@ -179,8 +177,8 @@ script: |
|
|||||||
# Correct tar file order
|
# Correct tar file order
|
||||||
mkdir -p temp
|
mkdir -p temp
|
||||||
pushd temp
|
pushd temp
|
||||||
tar xf ../$SOURCEDIST
|
tar -xf ../$SOURCEDIST
|
||||||
find dashcore-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST
|
find dashcore-* | sort | tar --mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME" --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST
|
||||||
popd
|
popd
|
||||||
|
|
||||||
# Workaround for tarball not building with the bare tag version (prep)
|
# Workaround for tarball not building with the bare tag version (prep)
|
||||||
@ -220,8 +218,8 @@ script: |
|
|||||||
find ${DISTNAME}/bin -type f -executable -print0 | xargs -0 -n1 -I{} ../contrib/devtools/split-debug.sh {} {} {}.dbg
|
find ${DISTNAME}/bin -type f -executable -print0 | xargs -0 -n1 -I{} ../contrib/devtools/split-debug.sh {} {} {}.dbg
|
||||||
find ${DISTNAME}/lib -type f -print0 | xargs -0 -n1 -I{} ../contrib/devtools/split-debug.sh {} {} {}.dbg
|
find ${DISTNAME}/lib -type f -print0 | xargs -0 -n1 -I{} ../contrib/devtools/split-debug.sh {} {} {}.dbg
|
||||||
cp ../doc/README.md ${DISTNAME}/
|
cp ../doc/README.md ${DISTNAME}/
|
||||||
find ${DISTNAME} -not -name "*.dbg" | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz
|
find ${DISTNAME} -not -name "*.dbg" | sort | tar --mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME" --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz
|
||||||
find ${DISTNAME} -name "*.dbg" | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}-debug.tar.gz
|
find ${DISTNAME} -name "*.dbg" | sort | tar --mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME" --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}-debug.tar.gz
|
||||||
cd ../../
|
cd ../../
|
||||||
rm -rf distsrc-${i}
|
rm -rf distsrc-${i}
|
||||||
done
|
done
|
||||||
|
@ -46,8 +46,6 @@ script: |
|
|||||||
|
|
||||||
export QT_RCC_TEST=1
|
export QT_RCC_TEST=1
|
||||||
export QT_RCC_SOURCE_DATE_OVERRIDE=1
|
export QT_RCC_SOURCE_DATE_OVERRIDE=1
|
||||||
export GZIP="-9n"
|
|
||||||
export TAR_OPTIONS="--mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME""
|
|
||||||
export TZ="UTC"
|
export TZ="UTC"
|
||||||
export BUILD_DIR="$PWD"
|
export BUILD_DIR="$PWD"
|
||||||
mkdir -p ${WRAP_DIR}
|
mkdir -p ${WRAP_DIR}
|
||||||
@ -133,8 +131,8 @@ script: |
|
|||||||
# Correct tar file order
|
# Correct tar file order
|
||||||
mkdir -p temp
|
mkdir -p temp
|
||||||
pushd temp
|
pushd temp
|
||||||
tar xf ../$SOURCEDIST
|
tar -xf ../$SOURCEDIST
|
||||||
find dashcore-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST
|
find dashcore-* | sort | tar --mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME" --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST
|
||||||
popd
|
popd
|
||||||
|
|
||||||
# Workaround for tarball not building with the bare tag version (prep)
|
# Workaround for tarball not building with the bare tag version (prep)
|
||||||
@ -171,7 +169,7 @@ script: |
|
|||||||
cp ${BASEPREFIX}/${i}/native/bin/${i}-pagestuff unsigned-app-${i}/pagestuff
|
cp ${BASEPREFIX}/${i}/native/bin/${i}-pagestuff unsigned-app-${i}/pagestuff
|
||||||
mv dist unsigned-app-${i}
|
mv dist unsigned-app-${i}
|
||||||
pushd unsigned-app-${i}
|
pushd unsigned-app-${i}
|
||||||
find . | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-osx-unsigned.tar.gz
|
find . | sort | tar --mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME" --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-osx-unsigned.tar.gz
|
||||||
popd
|
popd
|
||||||
|
|
||||||
make deploy OSX_DMG="${OUTDIR}/${DISTNAME}-osx-unsigned.dmg"
|
make deploy OSX_DMG="${OUTDIR}/${DISTNAME}-osx-unsigned.dmg"
|
||||||
@ -181,8 +179,8 @@ script: |
|
|||||||
find . -name "lib*.a" -delete
|
find . -name "lib*.a" -delete
|
||||||
rm -rf ${DISTNAME}/lib/pkgconfig
|
rm -rf ${DISTNAME}/lib/pkgconfig
|
||||||
find .. -name "*.dSYM" -exec cp -ra {} ${DISTNAME}/bin \;
|
find .. -name "*.dSYM" -exec cp -ra {} ${DISTNAME}/bin \;
|
||||||
find ${DISTNAME} -not -path '*.dSYM*' | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz
|
find ${DISTNAME} -not -path '*.dSYM*' | sort | tar --mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME" --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz
|
||||||
find ${DISTNAME} -path '*.dSYM*' | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}-debug.tar.gz
|
find ${DISTNAME} -path '*.dSYM*' | sort | tar --mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME" --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}-debug.tar.gz
|
||||||
cd ../../
|
cd ../../
|
||||||
done
|
done
|
||||||
mkdir -p $OUTDIR/src
|
mkdir -p $OUTDIR/src
|
||||||
|
@ -41,8 +41,6 @@ script: |
|
|||||||
|
|
||||||
export QT_RCC_TEST=1
|
export QT_RCC_TEST=1
|
||||||
export QT_RCC_SOURCE_DATE_OVERRIDE=1
|
export QT_RCC_SOURCE_DATE_OVERRIDE=1
|
||||||
export GZIP="-9n"
|
|
||||||
export TAR_OPTIONS="--mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME""
|
|
||||||
export TZ="UTC"
|
export TZ="UTC"
|
||||||
export BUILD_DIR="$PWD"
|
export BUILD_DIR="$PWD"
|
||||||
mkdir -p ${WRAP_DIR}
|
mkdir -p ${WRAP_DIR}
|
||||||
@ -151,8 +149,8 @@ script: |
|
|||||||
# Correct tar file order
|
# Correct tar file order
|
||||||
mkdir -p temp
|
mkdir -p temp
|
||||||
pushd temp
|
pushd temp
|
||||||
tar xf ../$SOURCEDIST
|
tar -xf ../$SOURCEDIST
|
||||||
find dashcore-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST
|
find dashcore-* | sort | tar --mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME" --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST
|
||||||
mkdir -p $OUTDIR/src
|
mkdir -p $OUTDIR/src
|
||||||
cp ../$SOURCEDIST $OUTDIR/src
|
cp ../$SOURCEDIST $OUTDIR/src
|
||||||
popd
|
popd
|
||||||
@ -198,7 +196,7 @@ script: |
|
|||||||
cd $BUILD_DIR/windeploy
|
cd $BUILD_DIR/windeploy
|
||||||
mkdir unsigned
|
mkdir unsigned
|
||||||
cp $OUTDIR/dashcore-*setup-unsigned.exe unsigned/
|
cp $OUTDIR/dashcore-*setup-unsigned.exe unsigned/
|
||||||
find . | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-win-unsigned.tar.gz
|
find . | sort | tar --mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME" --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-win-unsigned.tar.gz
|
||||||
mv ${OUTDIR}/${DISTNAME}-x86_64-*-debug.zip ${OUTDIR}/${DISTNAME}-win64-debug.zip
|
mv ${OUTDIR}/${DISTNAME}-x86_64-*-debug.zip ${OUTDIR}/${DISTNAME}-win64-debug.zip
|
||||||
mv ${OUTDIR}/${DISTNAME}-x86_64-*.zip ${OUTDIR}/${DISTNAME}-win64.zip
|
mv ${OUTDIR}/${DISTNAME}-x86_64-*.zip ${OUTDIR}/${DISTNAME}-win64.zip
|
||||||
|
|
||||||
|
@ -76,6 +76,14 @@ bool BCLog::Logger::StartLogging()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BCLog::Logger::DisconnectTestLogger()
|
||||||
|
{
|
||||||
|
StdLockGuard scoped_lock(m_cs);
|
||||||
|
m_buffering = true;
|
||||||
|
if (m_fileout != nullptr) fclose(m_fileout);
|
||||||
|
m_fileout = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
void BCLog::Logger::EnableCategory(BCLog::LogFlags flag)
|
void BCLog::Logger::EnableCategory(BCLog::LogFlags flag)
|
||||||
{
|
{
|
||||||
m_categories |= flag;
|
m_categories |= flag;
|
||||||
|
@ -125,6 +125,8 @@ namespace BCLog {
|
|||||||
|
|
||||||
/** Start logging (and flush all buffered messages) */
|
/** Start logging (and flush all buffered messages) */
|
||||||
bool StartLogging();
|
bool StartLogging();
|
||||||
|
/** Only for testing */
|
||||||
|
void DisconnectTestLogger();
|
||||||
|
|
||||||
void ShrinkDebugFile();
|
void ShrinkDebugFile();
|
||||||
|
|
||||||
|
36
src/noui.cpp
36
src/noui.cpp
@ -25,26 +25,30 @@ bool noui_ThreadSafeMessageBox(const std::string& message, const std::string& ca
|
|||||||
{
|
{
|
||||||
bool fSecure = style & CClientUIInterface::SECURE;
|
bool fSecure = style & CClientUIInterface::SECURE;
|
||||||
style &= ~CClientUIInterface::SECURE;
|
style &= ~CClientUIInterface::SECURE;
|
||||||
|
bool prefix = !(style & CClientUIInterface::MSG_NOPREFIX);
|
||||||
|
style &= ~CClientUIInterface::MSG_NOPREFIX;
|
||||||
|
|
||||||
std::string strCaption;
|
std::string strCaption;
|
||||||
// Check for usage of predefined caption
|
if (prefix) {
|
||||||
switch (style) {
|
switch (style) {
|
||||||
case CClientUIInterface::MSG_ERROR:
|
case CClientUIInterface::MSG_ERROR:
|
||||||
strCaption += _("Error");
|
strCaption = "Error: ";
|
||||||
break;
|
break;
|
||||||
case CClientUIInterface::MSG_WARNING:
|
case CClientUIInterface::MSG_WARNING:
|
||||||
strCaption += _("Warning");
|
strCaption = "Warning: ";
|
||||||
break;
|
break;
|
||||||
case CClientUIInterface::MSG_INFORMATION:
|
case CClientUIInterface::MSG_INFORMATION:
|
||||||
strCaption += _("Information");
|
strCaption = "Information: ";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
strCaption += caption; // Use supplied caption (can be empty)
|
strCaption = caption + ": "; // Use supplied caption (can be empty)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fSecure)
|
if (!fSecure) {
|
||||||
LogPrintf("%s: %s\n", strCaption, message);
|
LogPrintf("%s%s\n", strCaption, message);
|
||||||
tfm::format(std::cerr, "%s: %s\n", strCaption.c_str(), message.c_str());
|
}
|
||||||
|
tfm::format(std::cerr, "%s%s\n", strCaption.c_str(), message.c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1504,49 +1504,51 @@ void BitcoinGUI::setAdditionalDataSyncProgress(double nSyncProgress)
|
|||||||
progressBar->setToolTip(tooltip);
|
progressBar->setToolTip(tooltip);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BitcoinGUI::message(const QString &title, const QString &message, unsigned int style, bool *ret)
|
void BitcoinGUI::message(const QString& title, QString message, unsigned int style, bool* ret)
|
||||||
{
|
{
|
||||||
QString strTitle = tr("Dash Core"); // default title
|
// Default title. On macOS, the window title is ignored (as required by the macOS Guidelines).
|
||||||
|
QString strTitle{PACKAGE_NAME};
|
||||||
// Default to information icon
|
// Default to information icon
|
||||||
int nMBoxIcon = QMessageBox::Information;
|
int nMBoxIcon = QMessageBox::Information;
|
||||||
int nNotifyIcon = Notificator::Information;
|
int nNotifyIcon = Notificator::Information;
|
||||||
|
|
||||||
QString msgType;
|
bool prefix = !(style & CClientUIInterface::MSG_NOPREFIX);
|
||||||
|
style &= ~CClientUIInterface::MSG_NOPREFIX;
|
||||||
|
|
||||||
// Prefer supplied title over style based title
|
QString msgType;
|
||||||
if (!title.isEmpty()) {
|
if (!title.isEmpty()) {
|
||||||
msgType = title;
|
msgType = title;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
switch (style) {
|
switch (style) {
|
||||||
case CClientUIInterface::MSG_ERROR:
|
case CClientUIInterface::MSG_ERROR:
|
||||||
msgType = tr("Error");
|
msgType = tr("Error");
|
||||||
|
if (prefix) message = tr("Error: %1").arg(message);
|
||||||
break;
|
break;
|
||||||
case CClientUIInterface::MSG_WARNING:
|
case CClientUIInterface::MSG_WARNING:
|
||||||
msgType = tr("Warning");
|
msgType = tr("Warning");
|
||||||
|
if (prefix) message = tr("Warning: %1").arg(message);
|
||||||
break;
|
break;
|
||||||
case CClientUIInterface::MSG_INFORMATION:
|
case CClientUIInterface::MSG_INFORMATION:
|
||||||
msgType = tr("Information");
|
msgType = tr("Information");
|
||||||
|
// No need to prepend the prefix here.
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Append title to "Dash Core - "
|
|
||||||
if (!msgType.isEmpty())
|
|
||||||
strTitle += " - " + msgType;
|
|
||||||
|
|
||||||
// Check for error/warning icon
|
if (!msgType.isEmpty()) {
|
||||||
|
strTitle += " - " + msgType;
|
||||||
|
}
|
||||||
|
|
||||||
if (style & CClientUIInterface::ICON_ERROR) {
|
if (style & CClientUIInterface::ICON_ERROR) {
|
||||||
nMBoxIcon = QMessageBox::Critical;
|
nMBoxIcon = QMessageBox::Critical;
|
||||||
nNotifyIcon = Notificator::Critical;
|
nNotifyIcon = Notificator::Critical;
|
||||||
}
|
} else if (style & CClientUIInterface::ICON_WARNING) {
|
||||||
else if (style & CClientUIInterface::ICON_WARNING) {
|
|
||||||
nMBoxIcon = QMessageBox::Warning;
|
nMBoxIcon = QMessageBox::Warning;
|
||||||
nNotifyIcon = Notificator::Warning;
|
nNotifyIcon = Notificator::Warning;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Display message
|
|
||||||
if (style & CClientUIInterface::MODAL) {
|
if (style & CClientUIInterface::MODAL) {
|
||||||
// Check for buttons, use OK as default, if none was supplied
|
// Check for buttons, use OK as default, if none was supplied
|
||||||
QMessageBox::StandardButton buttons;
|
QMessageBox::StandardButton buttons;
|
||||||
@ -1559,9 +1561,9 @@ void BitcoinGUI::message(const QString &title, const QString &message, unsigned
|
|||||||
int r = mBox.exec();
|
int r = mBox.exec();
|
||||||
if (ret != nullptr)
|
if (ret != nullptr)
|
||||||
*ret = r == QMessageBox::Ok;
|
*ret = r == QMessageBox::Ok;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
notificator->notify(static_cast<Notificator::Class>(nNotifyIcon), strTitle, message);
|
notificator->notify(static_cast<Notificator::Class>(nNotifyIcon), strTitle, message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BitcoinGUI::changeEvent(QEvent *e)
|
void BitcoinGUI::changeEvent(QEvent *e)
|
||||||
|
@ -262,7 +262,7 @@ public Q_SLOTS:
|
|||||||
@see CClientUIInterface::MessageBoxFlags
|
@see CClientUIInterface::MessageBoxFlags
|
||||||
@param[in] ret pointer to a bool that will be modified to whether Ok was clicked (modal only)
|
@param[in] ret pointer to a bool that will be modified to whether Ok was clicked (modal only)
|
||||||
*/
|
*/
|
||||||
void message(const QString &title, const QString &message, unsigned int style, bool *ret = nullptr);
|
void message(const QString& title, QString message, unsigned int style, bool* ret = nullptr);
|
||||||
|
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
void setCurrentWallet(WalletModel* wallet_model);
|
void setCurrentWallet(WalletModel* wallet_model);
|
||||||
|
@ -344,7 +344,7 @@ void BitcoinApplication::initializeResult(bool success)
|
|||||||
if(success)
|
if(success)
|
||||||
{
|
{
|
||||||
// Log this only after AppInitMain finishes, as then logging setup is guaranteed complete
|
// Log this only after AppInitMain finishes, as then logging setup is guaranteed complete
|
||||||
qWarning() << "Platform customization:" << gArgs.GetArg("-uiplatform", BitcoinGUI::DEFAULT_UIPLATFORM).c_str();
|
qInfo() << "Platform customization:" << gArgs.GetArg("-uiplatform", BitcoinGUI::DEFAULT_UIPLATFORM).c_str();
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
m_wallet_controller = new WalletController(m_node, optionsModel, this);
|
m_wallet_controller = new WalletController(m_node, optionsModel, this);
|
||||||
#ifdef ENABLE_BIP70
|
#ifdef ENABLE_BIP70
|
||||||
|
@ -296,7 +296,7 @@ static void CopySettings(QSettings& dst, const QSettings& src)
|
|||||||
/** Back up a QSettings to an ini-formatted file. */
|
/** Back up a QSettings to an ini-formatted file. */
|
||||||
static void BackupSettings(const fs::path& filename, const QSettings& src)
|
static void BackupSettings(const fs::path& filename, const QSettings& src)
|
||||||
{
|
{
|
||||||
qWarning() << "Backing up GUI settings to" << GUIUtil::boostPathToQString(filename);
|
qInfo() << "Backing up GUI settings to" << GUIUtil::boostPathToQString(filename);
|
||||||
QSettings dst(GUIUtil::boostPathToQString(filename), QSettings::IniFormat);
|
QSettings dst(GUIUtil::boostPathToQString(filename), QSettings::IniFormat);
|
||||||
dst.clear();
|
dst.clear();
|
||||||
CopySettings(dst, src);
|
CopySettings(dst, src);
|
||||||
|
@ -493,7 +493,7 @@ void PaymentServer::LoadRootCAs(X509_STORE* _store)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
qWarning() << "PaymentServer::LoadRootCAs: Loaded " << nRootCerts << " root certificates";
|
qInfo() << "PaymentServer::LoadRootCAs: Loaded " << nRootCerts << " root certificates";
|
||||||
|
|
||||||
// Project for another day:
|
// Project for another day:
|
||||||
// Fetch certificate revocation lists, and add them to certStore.
|
// Fetch certificate revocation lists, and add them to certStore.
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include <chainparams.h>
|
#include <chainparams.h>
|
||||||
#include <init.h>
|
#include <init.h>
|
||||||
|
#include <key.h>
|
||||||
#include <qt/dash.h>
|
#include <qt/dash.h>
|
||||||
#include <qt/bitcoingui.h>
|
#include <qt/bitcoingui.h>
|
||||||
#include <qt/networkstyle.h>
|
#include <qt/networkstyle.h>
|
||||||
@ -67,6 +68,9 @@ void AppTests::appTests()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
ECC_Stop(); // Already started by the common test setup, so stop it to avoid interference
|
||||||
|
LogInstance().DisconnectTestLogger();
|
||||||
|
|
||||||
m_app.parameterSetup();
|
m_app.parameterSetup();
|
||||||
GUIUtil::loadFonts();
|
GUIUtil::loadFonts();
|
||||||
m_app.createOptionsModel(true /* reset settings */);
|
m_app.createOptionsModel(true /* reset settings */);
|
||||||
|
@ -41,6 +41,9 @@ void RPCNestedTests::rpcNestedTests()
|
|||||||
tableRPC.appendCommand("rpcNestedTest", &vRPCCommands[0]);
|
tableRPC.appendCommand("rpcNestedTest", &vRPCCommands[0]);
|
||||||
//mempool.setSanityCheck(1.0);
|
//mempool.setSanityCheck(1.0);
|
||||||
|
|
||||||
|
ECC_Stop(); // Already started by the common test setup, so stop it to avoid interference
|
||||||
|
LogInstance().DisconnectTestLogger();
|
||||||
|
|
||||||
TestingSetup test;
|
TestingSetup test;
|
||||||
|
|
||||||
if (RPCIsInWarmup(nullptr)) SetRPCWarmupFinished();
|
if (RPCIsInWarmup(nullptr)) SetRPCWarmupFinished();
|
||||||
|
@ -12,10 +12,10 @@
|
|||||||
#include <qt/dash.h>
|
#include <qt/dash.h>
|
||||||
#include <qt/test/apptests.h>
|
#include <qt/test/apptests.h>
|
||||||
#include <qt/test/rpcnestedtests.h>
|
#include <qt/test/rpcnestedtests.h>
|
||||||
#include <util/system.h>
|
|
||||||
#include <qt/test/uritests.h>
|
#include <qt/test/uritests.h>
|
||||||
#include <qt/test/compattests.h>
|
#include <qt/test/compattests.h>
|
||||||
#include <qt/test/trafficgraphdatatests.h>
|
#include <qt/test/trafficgraphdatatests.h>
|
||||||
|
#include <test/setup_common.h>
|
||||||
|
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
#include <qt/test/addressbooktests.h>
|
#include <qt/test/addressbooktests.h>
|
||||||
@ -50,14 +50,8 @@ extern void noui_connect();
|
|||||||
// This is all you need to run all the tests
|
// This is all you need to run all the tests
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
SetupEnvironment();
|
BasicTestingSetup test{CBaseChainParams::REGTEST};
|
||||||
SetupNetworking();
|
|
||||||
SelectParams(CBaseChainParams::REGTEST);
|
|
||||||
noui_connect();
|
|
||||||
ClearDatadirCache();
|
|
||||||
fs::path pathTemp = fs::temp_directory_path() / strprintf("test_dash-qt_%lu_%i", (unsigned long)GetTime(), (int)GetRand(1 << 30));
|
|
||||||
fs::create_directories(pathTemp);
|
|
||||||
gArgs.ForceSetArg("-datadir", pathTemp.string());
|
|
||||||
auto node = interfaces::MakeNode();
|
auto node = interfaces::MakeNode();
|
||||||
|
|
||||||
bool fInvalid = false;
|
bool fInvalid = false;
|
||||||
|
@ -50,7 +50,7 @@ void WinShutdownMonitor::registerShutdownBlockReason(const QString& strReason, c
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (shutdownBRCreate(mainWinId, strReason.toStdWString().c_str()))
|
if (shutdownBRCreate(mainWinId, strReason.toStdWString().c_str()))
|
||||||
qWarning() << "registerShutdownBlockReason: Successfully registered: " + strReason;
|
qInfo() << "registerShutdownBlockReason: Successfully registered: " + strReason;
|
||||||
else
|
else
|
||||||
qWarning() << "registerShutdownBlockReason: Failed to register: " + strReason;
|
qWarning() << "registerShutdownBlockReason: Failed to register: " + strReason;
|
||||||
}
|
}
|
||||||
|
@ -1226,7 +1226,12 @@ static UniValue pruneblockchain(const JSONRPCRequest& request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
PruneBlockFilesManual(height);
|
PruneBlockFilesManual(height);
|
||||||
return uint64_t(height);
|
const CBlockIndex* block = ::ChainActive().Tip();
|
||||||
|
assert(block);
|
||||||
|
while (block->pprev && (block->pprev->nStatus & BLOCK_HAVE_DATA)) {
|
||||||
|
block = block->pprev;
|
||||||
|
}
|
||||||
|
return uint64_t(block->nHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
static UniValue gettxoutsetinfo(const JSONRPCRequest& request)
|
static UniValue gettxoutsetinfo(const JSONRPCRequest& request)
|
||||||
|
@ -267,8 +267,6 @@ BOOST_FIXTURE_TEST_CASE(blockfilter_index_initial_sync, TestChain100Setup)
|
|||||||
|
|
||||||
BOOST_FIXTURE_TEST_CASE(blockfilter_index_init_destroy, BasicTestingSetup)
|
BOOST_FIXTURE_TEST_CASE(blockfilter_index_init_destroy, BasicTestingSetup)
|
||||||
{
|
{
|
||||||
SetDataDir("tempdir");
|
|
||||||
|
|
||||||
BlockFilterIndex* filter_index;
|
BlockFilterIndex* filter_index;
|
||||||
|
|
||||||
filter_index = GetBlockFilterIndex(BlockFilterType::BASIC_FILTER);
|
filter_index = GetBlockFilterIndex(BlockFilterType::BASIC_FILTER);
|
||||||
|
@ -27,7 +27,7 @@ BOOST_AUTO_TEST_CASE(dbwrapper)
|
|||||||
{
|
{
|
||||||
// Perform tests both obfuscated and non-obfuscated.
|
// Perform tests both obfuscated and non-obfuscated.
|
||||||
for (const bool obfuscate : {false, true}) {
|
for (const bool obfuscate : {false, true}) {
|
||||||
fs::path ph = SetDataDir(std::string("dbwrapper").append(obfuscate ? "_true" : "_false"));
|
fs::path ph = GetDataDir() / (obfuscate ? "dbwrapper_obfuscate_true" : "dbwrapper_obfuscate_false");
|
||||||
CDBWrapper dbw(ph, (1 << 20), true, false, obfuscate);
|
CDBWrapper dbw(ph, (1 << 20), true, false, obfuscate);
|
||||||
char key = 'k';
|
char key = 'k';
|
||||||
uint256 in = InsecureRand256();
|
uint256 in = InsecureRand256();
|
||||||
@ -46,7 +46,7 @@ BOOST_AUTO_TEST_CASE(dbwrapper_basic_data)
|
|||||||
{
|
{
|
||||||
// Perform tests both obfuscated and non-obfuscated.
|
// Perform tests both obfuscated and non-obfuscated.
|
||||||
for (bool obfuscate : {false, true}) {
|
for (bool obfuscate : {false, true}) {
|
||||||
fs::path ph = SetDataDir(std::string("dbwrapper_1").append(obfuscate ? "_true" : "_false"));
|
fs::path ph = GetDataDir() / (obfuscate ? "dbwrapper_1_obfuscate_true" : "dbwrapper_1_obfuscate_false");
|
||||||
CDBWrapper dbw(ph, (1 << 20), false, true, obfuscate);
|
CDBWrapper dbw(ph, (1 << 20), false, true, obfuscate);
|
||||||
|
|
||||||
uint256 res;
|
uint256 res;
|
||||||
@ -127,7 +127,7 @@ BOOST_AUTO_TEST_CASE(dbwrapper_batch)
|
|||||||
{
|
{
|
||||||
// Perform tests both obfuscated and non-obfuscated.
|
// Perform tests both obfuscated and non-obfuscated.
|
||||||
for (const bool obfuscate : {false, true}) {
|
for (const bool obfuscate : {false, true}) {
|
||||||
fs::path ph = SetDataDir(std::string("dbwrapper_batch").append(obfuscate ? "_true" : "_false"));
|
fs::path ph = GetDataDir() / (obfuscate ? "dbwrapper_batch_obfuscate_true" : "dbwrapper_batch_obfuscate_false");
|
||||||
CDBWrapper dbw(ph, (1 << 20), true, false, obfuscate);
|
CDBWrapper dbw(ph, (1 << 20), true, false, obfuscate);
|
||||||
|
|
||||||
char key = 'i';
|
char key = 'i';
|
||||||
@ -163,7 +163,7 @@ BOOST_AUTO_TEST_CASE(dbwrapper_iterator)
|
|||||||
{
|
{
|
||||||
// Perform tests both obfuscated and non-obfuscated.
|
// Perform tests both obfuscated and non-obfuscated.
|
||||||
for (const bool obfuscate : {false, true}) {
|
for (const bool obfuscate : {false, true}) {
|
||||||
fs::path ph = SetDataDir(std::string("dbwrapper_iterator").append(obfuscate ? "_true" : "_false"));
|
fs::path ph = GetDataDir() / (obfuscate ? "dbwrapper_iterator_obfuscate_true" : "dbwrapper_iterator_obfuscate_false");
|
||||||
CDBWrapper dbw(ph, (1 << 20), true, false, obfuscate);
|
CDBWrapper dbw(ph, (1 << 20), true, false, obfuscate);
|
||||||
|
|
||||||
// The two keys are intentionally chosen for ordering
|
// The two keys are intentionally chosen for ordering
|
||||||
@ -203,7 +203,7 @@ BOOST_AUTO_TEST_CASE(dbwrapper_iterator)
|
|||||||
BOOST_AUTO_TEST_CASE(existing_data_no_obfuscate)
|
BOOST_AUTO_TEST_CASE(existing_data_no_obfuscate)
|
||||||
{
|
{
|
||||||
// We're going to share this fs::path between two wrappers
|
// We're going to share this fs::path between two wrappers
|
||||||
fs::path ph = SetDataDir("existing_data_no_obfuscate");
|
fs::path ph = GetDataDir() / "existing_data_no_obfuscate";
|
||||||
create_directories(ph);
|
create_directories(ph);
|
||||||
|
|
||||||
// Set up a non-obfuscated wrapper to write some initial data.
|
// Set up a non-obfuscated wrapper to write some initial data.
|
||||||
@ -244,7 +244,7 @@ BOOST_AUTO_TEST_CASE(existing_data_no_obfuscate)
|
|||||||
BOOST_AUTO_TEST_CASE(existing_data_reindex)
|
BOOST_AUTO_TEST_CASE(existing_data_reindex)
|
||||||
{
|
{
|
||||||
// We're going to share this fs::path between two wrappers
|
// We're going to share this fs::path between two wrappers
|
||||||
fs::path ph = SetDataDir("existing_data_reindex");
|
fs::path ph = GetDataDir() / "existing_data_reindex";
|
||||||
create_directories(ph);
|
create_directories(ph);
|
||||||
|
|
||||||
// Set up a non-obfuscated wrapper to write some initial data.
|
// Set up a non-obfuscated wrapper to write some initial data.
|
||||||
@ -279,7 +279,7 @@ BOOST_AUTO_TEST_CASE(existing_data_reindex)
|
|||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(iterator_ordering)
|
BOOST_AUTO_TEST_CASE(iterator_ordering)
|
||||||
{
|
{
|
||||||
fs::path ph = SetDataDir("iterator_ordering");
|
fs::path ph = GetDataDir() / "iterator_ordering";
|
||||||
CDBWrapper dbw(ph, (1 << 20), true, false, false);
|
CDBWrapper dbw(ph, (1 << 20), true, false, false);
|
||||||
for (int x=0x00; x<256; ++x) {
|
for (int x=0x00; x<256; ++x) {
|
||||||
uint8_t key = x;
|
uint8_t key = x;
|
||||||
@ -359,7 +359,7 @@ BOOST_AUTO_TEST_CASE(iterator_string_ordering)
|
|||||||
{
|
{
|
||||||
char buf[10];
|
char buf[10];
|
||||||
|
|
||||||
fs::path ph = SetDataDir("iterator_string_ordering");
|
fs::path ph = GetDataDir() / "iterator_string_ordering";
|
||||||
CDBWrapper dbw(ph, (1 << 20), true, false, false);
|
CDBWrapper dbw(ph, (1 << 20), true, false, false);
|
||||||
for (int x=0x00; x<10; ++x) {
|
for (int x=0x00; x<10; ++x) {
|
||||||
for (int y = 0; y < 10; y++) {
|
for (int y = 0; y < 10; y++) {
|
||||||
@ -405,7 +405,7 @@ BOOST_AUTO_TEST_CASE(unicodepath)
|
|||||||
// On Windows this test will fail if the directory is created using
|
// On Windows this test will fail if the directory is created using
|
||||||
// the ANSI CreateDirectoryA call and the code page isn't UTF8.
|
// the ANSI CreateDirectoryA call and the code page isn't UTF8.
|
||||||
// It will succeed if the created with CreateDirectoryW.
|
// It will succeed if the created with CreateDirectoryW.
|
||||||
fs::path ph = SetDataDir("test_runner_₿_🏃_20191128_104644");
|
fs::path ph = GetDataDir() / "test_runner_₿_🏃_20191128_104644";
|
||||||
CDBWrapper dbw(ph, (1 << 20));
|
CDBWrapper dbw(ph, (1 << 20));
|
||||||
|
|
||||||
fs::path lockPath = ph / "LOCK";
|
fs::path lockPath = ph / "LOCK";
|
||||||
|
@ -11,7 +11,7 @@ BOOST_FIXTURE_TEST_SUITE(flatfile_tests, BasicTestingSetup)
|
|||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(flatfile_filename)
|
BOOST_AUTO_TEST_CASE(flatfile_filename)
|
||||||
{
|
{
|
||||||
auto data_dir = SetDataDir("flatfile_test");
|
const auto data_dir = GetDataDir();
|
||||||
|
|
||||||
FlatFilePos pos(456, 789);
|
FlatFilePos pos(456, 789);
|
||||||
|
|
||||||
@ -24,7 +24,7 @@ BOOST_AUTO_TEST_CASE(flatfile_filename)
|
|||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(flatfile_open)
|
BOOST_AUTO_TEST_CASE(flatfile_open)
|
||||||
{
|
{
|
||||||
auto data_dir = SetDataDir("flatfile_test");
|
const auto data_dir = GetDataDir();
|
||||||
FlatFileSeq seq(data_dir, "a", 16 * 1024);
|
FlatFileSeq seq(data_dir, "a", 16 * 1024);
|
||||||
|
|
||||||
std::string line1("A purely peer-to-peer version of electronic cash would allow online "
|
std::string line1("A purely peer-to-peer version of electronic cash would allow online "
|
||||||
@ -85,7 +85,7 @@ BOOST_AUTO_TEST_CASE(flatfile_open)
|
|||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(flatfile_allocate)
|
BOOST_AUTO_TEST_CASE(flatfile_allocate)
|
||||||
{
|
{
|
||||||
auto data_dir = SetDataDir("flatfile_test");
|
const auto data_dir = GetDataDir();
|
||||||
FlatFileSeq seq(data_dir, "a", 100);
|
FlatFileSeq seq(data_dir, "a", 100);
|
||||||
|
|
||||||
bool out_of_space;
|
bool out_of_space;
|
||||||
@ -105,7 +105,7 @@ BOOST_AUTO_TEST_CASE(flatfile_allocate)
|
|||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(flatfile_flush)
|
BOOST_AUTO_TEST_CASE(flatfile_flush)
|
||||||
{
|
{
|
||||||
auto data_dir = SetDataDir("flatfile_test");
|
const auto data_dir = GetDataDir();
|
||||||
FlatFileSeq seq(data_dir, "a", 100);
|
FlatFileSeq seq(data_dir, "a", 100);
|
||||||
|
|
||||||
bool out_of_space;
|
bool out_of_space;
|
||||||
|
@ -12,7 +12,7 @@ BOOST_FIXTURE_TEST_SUITE(fs_tests, BasicTestingSetup)
|
|||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(fsbridge_fstream)
|
BOOST_AUTO_TEST_CASE(fsbridge_fstream)
|
||||||
{
|
{
|
||||||
fs::path tmpfolder = SetDataDir("fsbridge_fstream");
|
fs::path tmpfolder = GetDataDir();
|
||||||
// tmpfile1 should be the same as tmpfile2
|
// tmpfile1 should be the same as tmpfile2
|
||||||
fs::path tmpfile1 = tmpfolder / "fs_tests_₿_🏃";
|
fs::path tmpfile1 = tmpfolder / "fs_tests_₿_🏃";
|
||||||
fs::path tmpfile2 = tmpfolder / "fs_tests_₿_🏃";
|
fs::path tmpfile2 = tmpfolder / "fs_tests_₿_🏃";
|
||||||
|
@ -93,7 +93,6 @@ BOOST_AUTO_TEST_CASE(cnode_listen_port)
|
|||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(caddrdb_read)
|
BOOST_AUTO_TEST_CASE(caddrdb_read)
|
||||||
{
|
{
|
||||||
SetDataDir("caddrdb_read");
|
|
||||||
CAddrManUncorrupted addrmanUncorrupted;
|
CAddrManUncorrupted addrmanUncorrupted;
|
||||||
addrmanUncorrupted.MakeDeterministic();
|
addrmanUncorrupted.MakeDeterministic();
|
||||||
|
|
||||||
@ -138,7 +137,6 @@ BOOST_AUTO_TEST_CASE(caddrdb_read)
|
|||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(caddrdb_read_corrupted)
|
BOOST_AUTO_TEST_CASE(caddrdb_read_corrupted)
|
||||||
{
|
{
|
||||||
SetDataDir("caddrdb_read_corrupted");
|
|
||||||
CAddrManCorrupted addrmanCorrupted;
|
CAddrManCorrupted addrmanCorrupted;
|
||||||
addrmanCorrupted.MakeDeterministic();
|
addrmanCorrupted.MakeDeterministic();
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include <consensus/validation.h>
|
#include <consensus/validation.h>
|
||||||
#include <crypto/sha256.h>
|
#include <crypto/sha256.h>
|
||||||
#include <index/txindex.h>
|
#include <index/txindex.h>
|
||||||
|
#include <init.h>
|
||||||
#include <miner.h>
|
#include <miner.h>
|
||||||
#include <net_processing.h>
|
#include <net_processing.h>
|
||||||
#include <noui.h>
|
#include <noui.h>
|
||||||
@ -43,6 +44,13 @@ std::ostream& operator<<(std::ostream& os, const uint256& num)
|
|||||||
BasicTestingSetup::BasicTestingSetup(const std::string& chainName)
|
BasicTestingSetup::BasicTestingSetup(const std::string& chainName)
|
||||||
: m_path_root(fs::temp_directory_path() / "test_common_" PACKAGE_NAME / strprintf("%lu_%i", (unsigned long)GetTime(), (int)(InsecureRandRange(1 << 30))))
|
: m_path_root(fs::temp_directory_path() / "test_common_" PACKAGE_NAME / strprintf("%lu_%i", (unsigned long)GetTime(), (int)(InsecureRandRange(1 << 30))))
|
||||||
{
|
{
|
||||||
|
fs::create_directories(m_path_root);
|
||||||
|
gArgs.ForceSetArg("-datadir", m_path_root.string());
|
||||||
|
ClearDatadirCache();
|
||||||
|
SelectParams(chainName);
|
||||||
|
gArgs.ForceSetArg("-printtoconsole", "0");
|
||||||
|
InitLogging();
|
||||||
|
LogInstance().StartLogging();
|
||||||
SHA256AutoDetect();
|
SHA256AutoDetect();
|
||||||
ECC_Start();
|
ECC_Start();
|
||||||
BLSInit();
|
BLSInit();
|
||||||
@ -52,7 +60,6 @@ BasicTestingSetup::BasicTestingSetup(const std::string& chainName)
|
|||||||
InitScriptExecutionCache();
|
InitScriptExecutionCache();
|
||||||
CCoinJoin::InitStandardDenominations();
|
CCoinJoin::InitStandardDenominations();
|
||||||
fCheckBlockIndex = true;
|
fCheckBlockIndex = true;
|
||||||
SelectParams(chainName);
|
|
||||||
evoDb.reset(new CEvoDB(1 << 20, true, true));
|
evoDb.reset(new CEvoDB(1 << 20, true, true));
|
||||||
deterministicMNManager.reset(new CDeterministicMNManager(*evoDb));
|
deterministicMNManager.reset(new CDeterministicMNManager(*evoDb));
|
||||||
static bool noui_connected = false;
|
static bool noui_connected = false;
|
||||||
@ -67,26 +74,17 @@ BasicTestingSetup::~BasicTestingSetup()
|
|||||||
deterministicMNManager.reset();
|
deterministicMNManager.reset();
|
||||||
evoDb.reset();
|
evoDb.reset();
|
||||||
|
|
||||||
|
LogInstance().DisconnectTestLogger();
|
||||||
fs::remove_all(m_path_root);
|
fs::remove_all(m_path_root);
|
||||||
ECC_Stop();
|
ECC_Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
fs::path BasicTestingSetup::SetDataDir(const std::string& name)
|
|
||||||
{
|
|
||||||
fs::path ret = m_path_root / name;
|
|
||||||
fs::create_directories(ret);
|
|
||||||
gArgs.ForceSetArg("-datadir", ret.string());
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
TestingSetup::TestingSetup(const std::string& chainName) : BasicTestingSetup(chainName)
|
TestingSetup::TestingSetup(const std::string& chainName) : BasicTestingSetup(chainName)
|
||||||
{
|
{
|
||||||
SetDataDir("tempdir");
|
|
||||||
const CChainParams& chainparams = Params();
|
const CChainParams& chainparams = Params();
|
||||||
// Ideally we'd move all the RPC tests to the functional testing framework
|
// Ideally we'd move all the RPC tests to the functional testing framework
|
||||||
// instead of unit tests, but for now we need these here.
|
// instead of unit tests, but for now we need these here.
|
||||||
RegisterAllCoreRPCCommands(tableRPC);
|
RegisterAllCoreRPCCommands(tableRPC);
|
||||||
ClearDatadirCache();
|
|
||||||
|
|
||||||
// We have to run a scheduler thread to prevent ActivateBestChain
|
// We have to run a scheduler thread to prevent ActivateBestChain
|
||||||
// from blocking due to queue overrun.
|
// from blocking due to queue overrun.
|
||||||
|
@ -54,22 +54,19 @@ static inline bool InsecureRandBool() { return g_insecure_rand_ctx.randbool(); }
|
|||||||
static constexpr CAmount CENT{1000000};
|
static constexpr CAmount CENT{1000000};
|
||||||
|
|
||||||
/** Basic testing setup.
|
/** Basic testing setup.
|
||||||
* This just configures logging and chain parameters.
|
* This just configures logging, data dir and chain parameters.
|
||||||
*/
|
*/
|
||||||
struct BasicTestingSetup {
|
struct BasicTestingSetup {
|
||||||
ECCVerifyHandle globalVerifyHandle;
|
ECCVerifyHandle globalVerifyHandle;
|
||||||
|
|
||||||
explicit BasicTestingSetup(const std::string& chainName = CBaseChainParams::MAIN);
|
explicit BasicTestingSetup(const std::string& chainName = CBaseChainParams::MAIN);
|
||||||
~BasicTestingSetup();
|
~BasicTestingSetup();
|
||||||
|
|
||||||
fs::path SetDataDir(const std::string& name);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const fs::path m_path_root;
|
const fs::path m_path_root;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Testing setup that configures a complete environment.
|
/** Testing setup that configures a complete environment.
|
||||||
* Included are data directory, coins database, script check threads setup.
|
* Included are coins database, script check threads setup.
|
||||||
*/
|
*/
|
||||||
struct TestingSetup : public BasicTestingSetup {
|
struct TestingSetup : public BasicTestingSetup {
|
||||||
boost::thread_group threadGroup;
|
boost::thread_group threadGroup;
|
||||||
|
@ -1136,7 +1136,7 @@ static constexpr char ExitCommand = 'X';
|
|||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(test_LockDirectory)
|
BOOST_AUTO_TEST_CASE(test_LockDirectory)
|
||||||
{
|
{
|
||||||
fs::path dirname = SetDataDir("test_LockDirectory") / fs::unique_path();
|
fs::path dirname = GetDataDir() / "lock_dir";
|
||||||
const std::string lockname = ".lock";
|
const std::string lockname = ".lock";
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
// Revert SIGCHLD to default, otherwise boost.test will catch and fail on
|
// Revert SIGCHLD to default, otherwise boost.test will catch and fail on
|
||||||
@ -1225,7 +1225,7 @@ BOOST_AUTO_TEST_CASE(test_LockDirectory)
|
|||||||
BOOST_AUTO_TEST_CASE(test_DirIsWritable)
|
BOOST_AUTO_TEST_CASE(test_DirIsWritable)
|
||||||
{
|
{
|
||||||
// Should be able to write to the data dir.
|
// Should be able to write to the data dir.
|
||||||
fs::path tmpdirname = SetDataDir("test_DirIsWritable");
|
fs::path tmpdirname = GetDataDir();
|
||||||
BOOST_CHECK_EQUAL(DirIsWritable(tmpdirname), true);
|
BOOST_CHECK_EQUAL(DirIsWritable(tmpdirname), true);
|
||||||
|
|
||||||
// Should not be able to write to a non-existent dir.
|
// Should not be able to write to a non-existent dir.
|
||||||
|
@ -70,6 +70,9 @@ public:
|
|||||||
/** Force blocking, modal message box dialog (not just OS notification) */
|
/** Force blocking, modal message box dialog (not just OS notification) */
|
||||||
MODAL = 0x10000000U,
|
MODAL = 0x10000000U,
|
||||||
|
|
||||||
|
/** Do not prepend error/warning prefix */
|
||||||
|
MSG_NOPREFIX = 0x20000000U,
|
||||||
|
|
||||||
/** Do not print contents of message to debug log */
|
/** Do not print contents of message to debug log */
|
||||||
SECURE = 0x40000000U,
|
SECURE = 0x40000000U,
|
||||||
|
|
||||||
|
@ -768,19 +768,16 @@ fs::path GetDefaultDataDir()
|
|||||||
static fs::path g_blocks_path_cache_net_specific;
|
static fs::path g_blocks_path_cache_net_specific;
|
||||||
static fs::path pathCached;
|
static fs::path pathCached;
|
||||||
static fs::path pathCachedNetSpecific;
|
static fs::path pathCachedNetSpecific;
|
||||||
static CCriticalSection csPathCached;
|
static RecursiveMutex csPathCached;
|
||||||
|
|
||||||
const fs::path &GetBlocksDir()
|
const fs::path &GetBlocksDir()
|
||||||
{
|
{
|
||||||
|
|
||||||
LOCK(csPathCached);
|
LOCK(csPathCached);
|
||||||
|
|
||||||
fs::path &path = g_blocks_path_cache_net_specific;
|
fs::path &path = g_blocks_path_cache_net_specific;
|
||||||
|
|
||||||
// This can be called during exceptions by LogPrintf(), so we cache the
|
// Cache the path to avoid calling fs::create_directories on every call of
|
||||||
// value so we don't have to do memory allocations after that.
|
// this function
|
||||||
if (!path.empty())
|
if (!path.empty()) return path;
|
||||||
return path;
|
|
||||||
|
|
||||||
if (gArgs.IsArgSet("-blocksdir")) {
|
if (gArgs.IsArgSet("-blocksdir")) {
|
||||||
path = fs::system_complete(gArgs.GetArg("-blocksdir", ""));
|
path = fs::system_complete(gArgs.GetArg("-blocksdir", ""));
|
||||||
@ -800,15 +797,12 @@ const fs::path &GetBlocksDir()
|
|||||||
|
|
||||||
const fs::path &GetDataDir(bool fNetSpecific)
|
const fs::path &GetDataDir(bool fNetSpecific)
|
||||||
{
|
{
|
||||||
|
|
||||||
LOCK(csPathCached);
|
LOCK(csPathCached);
|
||||||
|
|
||||||
fs::path &path = fNetSpecific ? pathCachedNetSpecific : pathCached;
|
fs::path &path = fNetSpecific ? pathCachedNetSpecific : pathCached;
|
||||||
|
|
||||||
// This can be called during exceptions by LogPrintf(), so we cache the
|
// Cache the path to avoid calling fs::create_directories on every call of
|
||||||
// value so we don't have to do memory allocations after that.
|
// this function
|
||||||
if (!path.empty())
|
if (!path.empty()) return path;
|
||||||
return path;
|
|
||||||
|
|
||||||
if (gArgs.IsArgSet("-datadir")) {
|
if (gArgs.IsArgSet("-datadir")) {
|
||||||
path = fs::system_complete(gArgs.GetArg("-datadir", ""));
|
path = fs::system_complete(gArgs.GetArg("-datadir", ""));
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||||
// Copyright (c) 2009-2018 The Bitcoin Core developers
|
// Copyright (c) 2009-2019 The Bitcoin Core developers
|
||||||
// Copyright (c) 2014-2021 The Dash Core developers
|
// Copyright (c) 2014-2021 The Dash Core developers
|
||||||
// Distributed under the MIT software license, see the accompanying
|
// Distributed under the MIT software license, see the accompanying
|
||||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
@ -21,20 +21,17 @@
|
|||||||
#include <fs.h>
|
#include <fs.h>
|
||||||
#include <logging.h>
|
#include <logging.h>
|
||||||
#include <sync.h>
|
#include <sync.h>
|
||||||
#include <util/threadnames.h>
|
|
||||||
#include <tinyformat.h>
|
#include <tinyformat.h>
|
||||||
#include <util/memory.h>
|
#include <util/memory.h>
|
||||||
|
#include <util/threadnames.h>
|
||||||
#include <util/time.h>
|
#include <util/time.h>
|
||||||
#include <amount.h>
|
#include <amount.h>
|
||||||
|
|
||||||
#include <atomic>
|
|
||||||
#include <exception>
|
#include <exception>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_map>
|
|
||||||
#include <unordered_set>
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@ -107,6 +104,7 @@ fs::path GetDefaultDataDir();
|
|||||||
const fs::path &GetBlocksDir();
|
const fs::path &GetBlocksDir();
|
||||||
const fs::path &GetDataDir(bool fNetSpecific = true);
|
const fs::path &GetDataDir(bool fNetSpecific = true);
|
||||||
fs::path GetBackupsDir();
|
fs::path GetBackupsDir();
|
||||||
|
/** Tests only */
|
||||||
void ClearDatadirCache();
|
void ClearDatadirCache();
|
||||||
fs::path GetConfigFile(const std::string& confPath);
|
fs::path GetConfigFile(const std::string& confPath);
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
@ -1549,20 +1549,22 @@ bool UndoReadFromDisk(CBlockUndo& blockundo, const CBlockIndex* pindex)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Abort with a message */
|
/** Abort with a message */
|
||||||
static bool AbortNode(const std::string& strMessage, const std::string& userMessage="")
|
static bool AbortNode(const std::string& strMessage, const std::string& userMessage = "", unsigned int prefix = 0)
|
||||||
{
|
{
|
||||||
SetMiscWarning(strMessage);
|
SetMiscWarning(strMessage);
|
||||||
LogPrintf("*** %s\n", strMessage);
|
LogPrintf("*** %s\n", strMessage);
|
||||||
uiInterface.ThreadSafeMessageBox(
|
if (!userMessage.empty()) {
|
||||||
userMessage.empty() ? _("Error: A fatal internal error occurred, see debug.log for details") : userMessage,
|
uiInterface.ThreadSafeMessageBox(userMessage, "", CClientUIInterface::MSG_ERROR | prefix);
|
||||||
"", CClientUIInterface::MSG_ERROR);
|
} else {
|
||||||
|
uiInterface.ThreadSafeMessageBox(_("Error: A fatal internal error occurred, see debug.log for details"), "", CClientUIInterface::MSG_ERROR | CClientUIInterface::MSG_NOPREFIX);
|
||||||
|
}
|
||||||
StartShutdown();
|
StartShutdown();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool AbortNode(CValidationState& state, const std::string& strMessage, const std::string& userMessage="")
|
static bool AbortNode(CValidationState& state, const std::string& strMessage, const std::string& userMessage = "", unsigned int prefix = 0)
|
||||||
{
|
{
|
||||||
AbortNode(strMessage, userMessage);
|
AbortNode(strMessage, userMessage, prefix);
|
||||||
return state.Error(strMessage);
|
return state.Error(strMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2485,7 +2487,7 @@ bool CChainState::FlushStateToDisk(
|
|||||||
if (fDoFullFlush || fPeriodicWrite) {
|
if (fDoFullFlush || fPeriodicWrite) {
|
||||||
// Depend on nMinDiskSpace to ensure we can write block index
|
// Depend on nMinDiskSpace to ensure we can write block index
|
||||||
if (!CheckDiskSpace(GetBlocksDir())) {
|
if (!CheckDiskSpace(GetBlocksDir())) {
|
||||||
return AbortNode(state, "Disk space is low!", _("Error: Disk space is low!"));
|
return AbortNode(state, "Disk space is too low!", _("Error: Disk space is too low!"), CClientUIInterface::MSG_NOPREFIX);
|
||||||
}
|
}
|
||||||
// First make sure all block and undo data is flushed to disk.
|
// First make sure all block and undo data is flushed to disk.
|
||||||
{
|
{
|
||||||
@ -2534,7 +2536,7 @@ bool CChainState::FlushStateToDisk(
|
|||||||
// an overestimation, as most will delete an existing entry or
|
// an overestimation, as most will delete an existing entry or
|
||||||
// overwrite one. Still, use a conservative safety factor of 2.
|
// overwrite one. Still, use a conservative safety factor of 2.
|
||||||
if (!CheckDiskSpace(GetDataDir(), 48 * 2 * 2 * CoinsTip().GetCacheSize())) {
|
if (!CheckDiskSpace(GetDataDir(), 48 * 2 * 2 * CoinsTip().GetCacheSize())) {
|
||||||
return AbortNode(state, "Disk space is low!", _("Error: Disk space is low!"));
|
return AbortNode(state, "Disk space is too low!", _("Error: Disk space is too low!"), CClientUIInterface::MSG_NOPREFIX);
|
||||||
}
|
}
|
||||||
// Flush the chainstate (which may refer to block index entries).
|
// Flush the chainstate (which may refer to block index entries).
|
||||||
if (!CoinsTip().Flush())
|
if (!CoinsTip().Flush())
|
||||||
@ -3639,7 +3641,7 @@ static bool FindBlockPos(FlatFilePos &pos, unsigned int nAddSize, unsigned int n
|
|||||||
bool out_of_space;
|
bool out_of_space;
|
||||||
size_t bytes_allocated = BlockFileSeq().Allocate(pos, nAddSize, out_of_space);
|
size_t bytes_allocated = BlockFileSeq().Allocate(pos, nAddSize, out_of_space);
|
||||||
if (out_of_space) {
|
if (out_of_space) {
|
||||||
return AbortNode("Disk space is low!", _("Error: Disk space is low!"));
|
return AbortNode("Disk space is too low!", _("Error: Disk space is too low!"), CClientUIInterface::MSG_NOPREFIX);
|
||||||
}
|
}
|
||||||
if (bytes_allocated != 0 && fPruneMode) {
|
if (bytes_allocated != 0 && fPruneMode) {
|
||||||
fCheckForPruning = true;
|
fCheckForPruning = true;
|
||||||
@ -3663,7 +3665,7 @@ static bool FindUndoPos(CValidationState &state, int nFile, FlatFilePos &pos, un
|
|||||||
bool out_of_space;
|
bool out_of_space;
|
||||||
size_t bytes_allocated = UndoFileSeq().Allocate(pos, nAddSize, out_of_space);
|
size_t bytes_allocated = UndoFileSeq().Allocate(pos, nAddSize, out_of_space);
|
||||||
if (out_of_space) {
|
if (out_of_space) {
|
||||||
return AbortNode(state, "Disk space is low!", _("Error: Disk space is low!"));
|
return AbortNode(state, "Disk space is too low!", _("Error: Disk space is too low!"), CClientUIInterface::MSG_NOPREFIX);
|
||||||
}
|
}
|
||||||
if (bytes_allocated != 0 && fPruneMode) {
|
if (bytes_allocated != 0 && fPruneMode) {
|
||||||
fCheckForPruning = true;
|
fCheckForPruning = true;
|
||||||
|
@ -16,7 +16,7 @@ BOOST_FIXTURE_TEST_SUITE(db_tests, BasicTestingSetup)
|
|||||||
BOOST_AUTO_TEST_CASE(getwalletenv_file)
|
BOOST_AUTO_TEST_CASE(getwalletenv_file)
|
||||||
{
|
{
|
||||||
std::string test_name = "test_name.dat";
|
std::string test_name = "test_name.dat";
|
||||||
fs::path datadir = SetDataDir("tempdir");
|
const fs::path datadir = GetDataDir();
|
||||||
fs::path file_path = datadir / test_name;
|
fs::path file_path = datadir / test_name;
|
||||||
std::ofstream f(file_path.BOOST_FILESYSTEM_C_STR);
|
std::ofstream f(file_path.BOOST_FILESYSTEM_C_STR);
|
||||||
f.close();
|
f.close();
|
||||||
@ -30,7 +30,7 @@ BOOST_AUTO_TEST_CASE(getwalletenv_file)
|
|||||||
BOOST_AUTO_TEST_CASE(getwalletenv_directory)
|
BOOST_AUTO_TEST_CASE(getwalletenv_directory)
|
||||||
{
|
{
|
||||||
std::string expected_name = "wallet.dat";
|
std::string expected_name = "wallet.dat";
|
||||||
fs::path datadir = SetDataDir("tempdir");
|
const fs::path datadir = GetDataDir();
|
||||||
|
|
||||||
std::string filename;
|
std::string filename;
|
||||||
std::shared_ptr<BerkeleyEnvironment> env = GetWalletEnv(datadir, filename);
|
std::shared_ptr<BerkeleyEnvironment> env = GetWalletEnv(datadir, filename);
|
||||||
@ -40,8 +40,8 @@ BOOST_AUTO_TEST_CASE(getwalletenv_directory)
|
|||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(getwalletenv_g_dbenvs_multiple)
|
BOOST_AUTO_TEST_CASE(getwalletenv_g_dbenvs_multiple)
|
||||||
{
|
{
|
||||||
fs::path datadir = SetDataDir("tempdir");
|
fs::path datadir = GetDataDir() / "1";
|
||||||
fs::path datadir_2 = SetDataDir("tempdir_2");
|
fs::path datadir_2 = GetDataDir() / "2";
|
||||||
std::string filename;
|
std::string filename;
|
||||||
|
|
||||||
std::shared_ptr<BerkeleyEnvironment> env_1 = GetWalletEnv(datadir, filename);
|
std::shared_ptr<BerkeleyEnvironment> env_1 = GetWalletEnv(datadir, filename);
|
||||||
@ -54,8 +54,8 @@ BOOST_AUTO_TEST_CASE(getwalletenv_g_dbenvs_multiple)
|
|||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(getwalletenv_g_dbenvs_free_instance)
|
BOOST_AUTO_TEST_CASE(getwalletenv_g_dbenvs_free_instance)
|
||||||
{
|
{
|
||||||
fs::path datadir = SetDataDir("tempdir");
|
fs::path datadir = GetDataDir() / "1";
|
||||||
fs::path datadir_2 = SetDataDir("tempdir_2");
|
fs::path datadir_2 = GetDataDir() / "2";
|
||||||
std::string filename;
|
std::string filename;
|
||||||
|
|
||||||
std::shared_ptr <BerkeleyEnvironment> env_1_a = GetWalletEnv(datadir, filename);
|
std::shared_ptr <BerkeleyEnvironment> env_1_a = GetWalletEnv(datadir, filename);
|
||||||
|
@ -13,7 +13,7 @@ InitWalletDirTestingSetup::InitWalletDirTestingSetup(const std::string& chainNam
|
|||||||
std::string sep;
|
std::string sep;
|
||||||
sep += fs::path::preferred_separator;
|
sep += fs::path::preferred_separator;
|
||||||
|
|
||||||
m_datadir = SetDataDir("tempdir");
|
m_datadir = GetDataDir();
|
||||||
m_cwd = fs::current_path();
|
m_cwd = fs::current_path();
|
||||||
|
|
||||||
m_walletdir_path_cases["default"] = m_datadir / "wallets";
|
m_walletdir_path_cases["default"] = m_datadir / "wallets";
|
||||||
@ -41,4 +41,4 @@ InitWalletDirTestingSetup::~InitWalletDirTestingSetup()
|
|||||||
void InitWalletDirTestingSetup::SetWalletDir(const fs::path& walletdir_path)
|
void InitWalletDirTestingSetup::SetWalletDir(const fs::path& walletdir_path)
|
||||||
{
|
{
|
||||||
gArgs.ForceSetArg("-walletdir", walletdir_path.string());
|
gArgs.ForceSetArg("-walletdir", walletdir_path.string());
|
||||||
}
|
}
|
||||||
|
@ -195,7 +195,7 @@ BOOST_FIXTURE_TEST_CASE(importwallet_rescan, TestChain100Setup)
|
|||||||
auto locked_chain = chain->lock();
|
auto locked_chain = chain->lock();
|
||||||
LockAnnotation lock(::cs_main);
|
LockAnnotation lock(::cs_main);
|
||||||
|
|
||||||
std::string backup_file = (SetDataDir("importwallet_rescan") / "wallet.backup").string();
|
std::string backup_file = (GetDataDir() / "wallet.backup").string();
|
||||||
|
|
||||||
// Import key into wallet and call dumpwallet to create backup file.
|
// Import key into wallet and call dumpwallet to create backup file.
|
||||||
{
|
{
|
||||||
|
@ -16,8 +16,6 @@ from test_framework.script import CScript, OP_RETURN, OP_NOP
|
|||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import assert_equal, assert_greater_than, assert_raises_rpc_error, connect_nodes, disconnect_nodes, wait_until
|
from test_framework.util import assert_equal, assert_greater_than, assert_raises_rpc_error, connect_nodes, disconnect_nodes, wait_until
|
||||||
|
|
||||||
MIN_BLOCKS_TO_KEEP = 288
|
|
||||||
|
|
||||||
# Rescans start at the earliest block up to 2 hours before a key timestamp, so
|
# Rescans start at the earliest block up to 2 hours before a key timestamp, so
|
||||||
# the manual prune RPC avoids pruning blocks in the same window to be
|
# the manual prune RPC avoids pruning blocks in the same window to be
|
||||||
# compatible with pruning based on key creation time.
|
# compatible with pruning based on key creation time.
|
||||||
@ -267,20 +265,9 @@ class PruneTest(BitcoinTestFramework):
|
|||||||
else:
|
else:
|
||||||
return index
|
return index
|
||||||
|
|
||||||
def prune(index, expected_ret=None):
|
def prune(index):
|
||||||
ret = node.pruneblockchain(height=height(index))
|
ret = node.pruneblockchain(height=height(index))
|
||||||
# Check the return value. When use_timestamp is True, just check
|
assert_equal(ret, node.getblockchaininfo()['pruneheight'])
|
||||||
# that the return value is less than or equal to the expected
|
|
||||||
# value, because when more than one block is generated per second,
|
|
||||||
# a timestamp will not be granular enough to uniquely identify an
|
|
||||||
# individual block.
|
|
||||||
if expected_ret is None:
|
|
||||||
expected_ret = index
|
|
||||||
if use_timestamp:
|
|
||||||
assert_greater_than(ret, 0)
|
|
||||||
assert_greater_than(expected_ret + 1, ret)
|
|
||||||
else:
|
|
||||||
assert_equal(ret, expected_ret)
|
|
||||||
|
|
||||||
def has_block(index):
|
def has_block(index):
|
||||||
return os.path.isfile(os.path.join(self.nodes[node_number].datadir, self.chain, "blocks", "blk{:05}.dat".format(index)))
|
return os.path.isfile(os.path.join(self.nodes[node_number].datadir, self.chain, "blocks", "blk{:05}.dat".format(index)))
|
||||||
@ -320,7 +307,7 @@ class PruneTest(BitcoinTestFramework):
|
|||||||
assert not has_block(1), "blk00001.dat is still there, should be pruned by now"
|
assert not has_block(1), "blk00001.dat is still there, should be pruned by now"
|
||||||
|
|
||||||
# height=1000 should not prune anything more, because tip-288 is in blk00002.dat.
|
# height=1000 should not prune anything more, because tip-288 is in blk00002.dat.
|
||||||
prune(1000, 1001 - MIN_BLOCKS_TO_KEEP)
|
prune(1000)
|
||||||
assert has_block(2), "blk00002.dat is still there, should be pruned by now"
|
assert has_block(2), "blk00002.dat is still there, should be pruned by now"
|
||||||
|
|
||||||
# advance the tip so blk00002.dat and blk00003.dat can be pruned (the last 288 blocks should now be in blk00004.dat)
|
# advance the tip so blk00002.dat and blk00003.dat can be pruned (the last 288 blocks should now be in blk00004.dat)
|
||||||
|
Loading…
Reference in New Issue
Block a user