Create walletdir if datadir doesn't exist and fix tests
This commit is contained in:
parent
9587a9c12b
commit
8263f6a5ac
11 changed files with 45 additions and 34 deletions
|
@ -101,10 +101,6 @@ bool AppInit(int argc, char* argv[])
|
|||
fprintf(stderr, "Error: Specified data directory \"%s\" does not exist.\n", gArgs.GetArg("-datadir", "").c_str());
|
||||
return false;
|
||||
}
|
||||
if (gArgs.IsArgSet("-walletdir") && !fs::is_directory(GetWalletDir())) {
|
||||
fprintf(stderr, "Error: Specified wallet directory \"%s\" does not exist.\n", gArgs.GetArg("-walletdir", "").c_str());
|
||||
return false;
|
||||
}
|
||||
try
|
||||
{
|
||||
gArgs.ReadConfigFile(gArgs.GetArg("-conf", BITCOIN_CONF_FILENAME));
|
||||
|
|
|
@ -1220,7 +1220,6 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler)
|
|||
LogPrintf("Startup time: %s\n", DateTimeStrFormat("%Y-%m-%d %H:%M:%S", GetTime()));
|
||||
LogPrintf("Default data directory %s\n", GetDefaultDataDir().string());
|
||||
LogPrintf("Using data directory %s\n", GetDataDir().string());
|
||||
LogPrintf("Using wallet directory %s\n", GetWalletDir().string());
|
||||
LogPrintf("Using config file %s\n", GetConfigFile(gArgs.GetArg("-conf", BITCOIN_CONF_FILENAME)).string());
|
||||
LogPrintf("Using at most %i automatic connections (%i file descriptors available)\n", nMaxConnections, nFD);
|
||||
|
||||
|
|
|
@ -626,11 +626,6 @@ int main(int argc, char *argv[])
|
|||
QObject::tr("Error: Specified data directory \"%1\" does not exist.").arg(QString::fromStdString(gArgs.GetArg("-datadir", ""))));
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
if (gArgs.IsArgSet("-walletdir") && !fs::is_directory(GetWalletDir())) {
|
||||
QMessageBox::critical(0, QObject::tr(PACKAGE_NAME),
|
||||
QObject::tr("Error: Specified wallet directory \"%1\" does not exist.").arg(QString::fromStdString(gArgs.GetArg("-walletdir", ""))));
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
try {
|
||||
gArgs.ReadConfigFile(gArgs.GetArg("-conf", BITCOIN_CONF_FILENAME));
|
||||
} catch (const std::exception& e) {
|
||||
|
|
|
@ -214,7 +214,10 @@ bool Intro::pickDataDirectory()
|
|||
}
|
||||
dataDir = intro.getDataDirectory();
|
||||
try {
|
||||
TryCreateDirectories(GUIUtil::qstringToBoostPath(dataDir));
|
||||
if (TryCreateDirectories(GUIUtil::qstringToBoostPath(dataDir))) {
|
||||
// If a new data directory has been created, make wallets subdirectory too
|
||||
TryCreateDirectories(GUIUtil::qstringToBoostPath(dataDir) / "wallets");
|
||||
}
|
||||
break;
|
||||
} catch (const fs::filesystem_error&) {
|
||||
QMessageBox::critical(0, tr(PACKAGE_NAME),
|
||||
|
|
|
@ -574,7 +574,10 @@ const fs::path &GetDataDir(bool fNetSpecific)
|
|||
if (fNetSpecific)
|
||||
path /= BaseParams().DataDir();
|
||||
|
||||
fs::create_directories(path);
|
||||
if (fs::create_directories(path)) {
|
||||
// This is the first run, create wallets subdirectory too
|
||||
fs::create_directories(path / "wallets");
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
|
|
|
@ -193,6 +193,12 @@ bool VerifyWallets()
|
|||
return true;
|
||||
}
|
||||
|
||||
if (gArgs.IsArgSet("-walletdir") && !fs::is_directory(GetWalletDir())) {
|
||||
return InitError(strprintf(_("Error: Specified wallet directory \"%s\" does not exist."), gArgs.GetArg("-walletdir", "").c_str()));
|
||||
}
|
||||
|
||||
LogPrintf("Using wallet directory %s\n", GetWalletDir().string());
|
||||
|
||||
uiInterface.InitMessage(_("Verifying wallet(s)..."));
|
||||
|
||||
// Keep track of each wallet absolute path to detect duplicates.
|
||||
|
|
|
@ -33,7 +33,7 @@ class KeypoolRestoreTest(BitcoinTestFramework):
|
|||
|
||||
self.stop_node(1)
|
||||
|
||||
shutil.copyfile(self.tmpdir + "/node1/regtest/wallet.dat", self.tmpdir + "/wallet.bak")
|
||||
shutil.copyfile(self.tmpdir + "/node1/regtest/wallets/wallet.dat", self.tmpdir + "/wallet.bak")
|
||||
self.start_node(1, self.extra_args[1])
|
||||
connect_nodes_bi(self.nodes, 0, 1)
|
||||
|
||||
|
@ -56,7 +56,7 @@ class KeypoolRestoreTest(BitcoinTestFramework):
|
|||
|
||||
self.stop_node(1)
|
||||
|
||||
shutil.copyfile(self.tmpdir + "/wallet.bak", self.tmpdir + "/node1/regtest/wallet.dat")
|
||||
shutil.copyfile(self.tmpdir + "/wallet.bak", self.tmpdir + "/node1/regtest/wallets/wallet.dat")
|
||||
|
||||
self.log.info("Verify keypool is restored and balance is correct")
|
||||
|
||||
|
|
|
@ -27,28 +27,37 @@ class MultiWalletTest(BitcoinTestFramework):
|
|||
self.assert_start_raises_init_error(0, ['-wallet=w1', '-wallet=w1'], 'Error loading wallet w1. Duplicate -wallet filename specified.')
|
||||
|
||||
# should not initialize if wallet file is a directory
|
||||
os.mkdir(os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w11'))
|
||||
wallet_dir = os.path.join(self.options.tmpdir, 'node0', 'regtest', 'wallets')
|
||||
os.mkdir(os.path.join(wallet_dir, 'w11'))
|
||||
self.assert_start_raises_init_error(0, ['-wallet=w11'], 'Error loading wallet w11. -wallet filename must be a regular file.')
|
||||
|
||||
# should not initialize if one wallet is a copy of another
|
||||
shutil.copyfile(os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w2'),
|
||||
os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w22'))
|
||||
shutil.copyfile(os.path.join(wallet_dir, 'w2'), os.path.join(wallet_dir, 'w22'))
|
||||
self.assert_start_raises_init_error(0, ['-wallet=w2', '-wallet=w22'], 'duplicates fileid')
|
||||
|
||||
# should not initialize if wallet file is a symlink
|
||||
os.symlink(os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w1'), os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w12'))
|
||||
os.symlink(os.path.join(wallet_dir, 'w1'), os.path.join(wallet_dir, 'w12'))
|
||||
self.assert_start_raises_init_error(0, ['-wallet=w12'], 'Error loading wallet w12. -wallet filename must be a regular file.')
|
||||
|
||||
# should not initialize if the specified walletdir does not exist
|
||||
self.assert_start_raises_init_error(0, ['-walletdir=bad'], 'Error: Specified wallet directory "bad" does not exist.')
|
||||
|
||||
# running the node with specified walletdir should only have the default wallet in it
|
||||
os.mkdir(os.path.join(self.options.tmpdir, 'node0', 'regtest', 'walletdir'))
|
||||
self.start_node(0, ['-wallet=w4', '-wallet=w5', '-walletdir=' + os.path.join(self.options.tmpdir, 'node0', 'regtest', 'walletdir')])
|
||||
# if wallets/ doesn't exist, datadir should be the default wallet dir
|
||||
wallet_dir2 = os.path.join(self.options.tmpdir, 'node0', 'regtest', 'walletdir')
|
||||
os.rename(wallet_dir, wallet_dir2)
|
||||
self.start_node(0, ['-wallet=w4', '-wallet=w5'])
|
||||
assert_equal(set(self.nodes[0].listwallets()), {"w4", "w5"})
|
||||
w5 = self.nodes[0].get_wallet_rpc("w5")
|
||||
w5.generate(1)
|
||||
self.stop_node(0)
|
||||
|
||||
# now if wallets/ exists again, but the rootdir is specified as the walletdir, w4 and w5 should still be loaded
|
||||
os.rename(wallet_dir2, wallet_dir)
|
||||
self.start_node(0, ['-wallet=w4', '-wallet=w5', '-walletdir=' + os.path.join(self.options.tmpdir, 'node0', 'regtest')])
|
||||
assert_equal(set(self.nodes[0].listwallets()), {"w4", "w5"})
|
||||
w5 = self.nodes[0].get_wallet_rpc("w5")
|
||||
w5_info = w5.getwalletinfo()
|
||||
assert_equal(w5_info['immature_balance'], 0)
|
||||
assert_equal(w5_info['immature_balance'], 50)
|
||||
|
||||
self.stop_node(0)
|
||||
|
||||
|
|
|
@ -432,7 +432,7 @@ class BitcoinTestFramework():
|
|||
self.disable_mocktime()
|
||||
for i in range(MAX_NODES):
|
||||
os.remove(log_filename(self.options.cachedir, i, "debug.log"))
|
||||
os.remove(log_filename(self.options.cachedir, i, "db.log"))
|
||||
os.remove(log_filename(self.options.cachedir, i, "wallets/db.log"))
|
||||
os.remove(log_filename(self.options.cachedir, i, "peers.dat"))
|
||||
os.remove(log_filename(self.options.cachedir, i, "fee_estimates.dat"))
|
||||
|
||||
|
|
|
@ -73,7 +73,7 @@ class WalletHDTest(BitcoinTestFramework):
|
|||
# otherwise node1 would auto-recover all funds in flag the keypool keys as used
|
||||
shutil.rmtree(os.path.join(tmpdir, "node1/regtest/blocks"))
|
||||
shutil.rmtree(os.path.join(tmpdir, "node1/regtest/chainstate"))
|
||||
shutil.copyfile(os.path.join(tmpdir, "hd.bak"), os.path.join(tmpdir, "node1/regtest/wallet.dat"))
|
||||
shutil.copyfile(os.path.join(tmpdir, "hd.bak"), os.path.join(tmpdir, "node1/regtest/wallets/wallet.dat"))
|
||||
self.start_node(1)
|
||||
|
||||
# Assert that derivation is deterministic
|
||||
|
|
|
@ -90,9 +90,9 @@ class WalletBackupTest(BitcoinTestFramework):
|
|||
self.stop_node(2)
|
||||
|
||||
def erase_three(self):
|
||||
os.remove(self.options.tmpdir + "/node0/regtest/wallet.dat")
|
||||
os.remove(self.options.tmpdir + "/node1/regtest/wallet.dat")
|
||||
os.remove(self.options.tmpdir + "/node2/regtest/wallet.dat")
|
||||
os.remove(self.options.tmpdir + "/node0/regtest/wallets/wallet.dat")
|
||||
os.remove(self.options.tmpdir + "/node1/regtest/wallets/wallet.dat")
|
||||
os.remove(self.options.tmpdir + "/node2/regtest/wallets/wallet.dat")
|
||||
|
||||
def run_test(self):
|
||||
self.log.info("Generating initial blockchain")
|
||||
|
@ -154,9 +154,9 @@ class WalletBackupTest(BitcoinTestFramework):
|
|||
shutil.rmtree(self.options.tmpdir + "/node2/regtest/chainstate")
|
||||
|
||||
# Restore wallets from backup
|
||||
shutil.copyfile(tmpdir + "/node0/wallet.bak", tmpdir + "/node0/regtest/wallet.dat")
|
||||
shutil.copyfile(tmpdir + "/node1/wallet.bak", tmpdir + "/node1/regtest/wallet.dat")
|
||||
shutil.copyfile(tmpdir + "/node2/wallet.bak", tmpdir + "/node2/regtest/wallet.dat")
|
||||
shutil.copyfile(tmpdir + "/node0/wallet.bak", tmpdir + "/node0/regtest/wallets/wallet.dat")
|
||||
shutil.copyfile(tmpdir + "/node1/wallet.bak", tmpdir + "/node1/regtest/wallets/wallet.dat")
|
||||
shutil.copyfile(tmpdir + "/node2/wallet.bak", tmpdir + "/node2/regtest/wallets/wallet.dat")
|
||||
|
||||
self.log.info("Re-starting nodes")
|
||||
self.start_three()
|
||||
|
@ -192,10 +192,10 @@ class WalletBackupTest(BitcoinTestFramework):
|
|||
|
||||
# Backup to source wallet file must fail
|
||||
sourcePaths = [
|
||||
tmpdir + "/node0/regtest/wallet.dat",
|
||||
tmpdir + "/node0/./regtest/wallet.dat",
|
||||
tmpdir + "/node0/regtest/",
|
||||
tmpdir + "/node0/regtest"]
|
||||
tmpdir + "/node0/regtest/wallets/wallet.dat",
|
||||
tmpdir + "/node0/./regtest/wallets/wallet.dat",
|
||||
tmpdir + "/node0/regtest/wallets/",
|
||||
tmpdir + "/node0/regtest/wallets"]
|
||||
|
||||
for sourcePath in sourcePaths:
|
||||
assert_raises_rpc_error(-4, "backup failed", self.nodes[0].backupwallet, sourcePath)
|
||||
|
|
Loading…
Reference in a new issue