mirror of
https://github.com/bisq-network/bisq.git
synced 2024-11-19 09:52:23 +01:00
Refresh dao-setup files in Scaffold setup
Many test cases will need to run on a clean, initialized dao-setup; we do not want call dao-setup.gradle tasks from Java. For now, every JUnit test case will refresh the dao-setup data in @BeforeClass, but @AfterClass will not clean out the dao-setup files. We want to be able to look at bitcoin-core and bisq app data & log files after a test. Given the difficulty of refreshing dao-setup files using Java, I took a short cut and used the apitest.linux pkg's BashCommand to replace dao-setup files. Some bitcoin.conf and blocknotify configuratation logic was also moved from ApiTestConfig to Scaffold in this commit.
This commit is contained in:
parent
2678b31a18
commit
486f06beef
@ -18,9 +18,18 @@
|
|||||||
package bisq.apitest;
|
package bisq.apitest;
|
||||||
|
|
||||||
import bisq.common.config.BisqHelpFormatter;
|
import bisq.common.config.BisqHelpFormatter;
|
||||||
|
import bisq.common.storage.FileUtil;
|
||||||
import bisq.common.util.Utilities;
|
import bisq.common.util.Utilities;
|
||||||
|
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.nio.file.attribute.PosixFilePermissions;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
@ -38,6 +47,7 @@ import static java.lang.String.format;
|
|||||||
import static java.lang.System.err;
|
import static java.lang.System.err;
|
||||||
import static java.lang.System.exit;
|
import static java.lang.System.exit;
|
||||||
import static java.lang.System.out;
|
import static java.lang.System.out;
|
||||||
|
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
|
||||||
import static java.util.Arrays.stream;
|
import static java.util.Arrays.stream;
|
||||||
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
||||||
import static java.util.concurrent.TimeUnit.SECONDS;
|
import static java.util.concurrent.TimeUnit.SECONDS;
|
||||||
@ -46,6 +56,7 @@ import static java.util.concurrent.TimeUnit.SECONDS;
|
|||||||
|
|
||||||
import bisq.apitest.config.ApiTestConfig;
|
import bisq.apitest.config.ApiTestConfig;
|
||||||
import bisq.apitest.config.BisqAppConfig;
|
import bisq.apitest.config.BisqAppConfig;
|
||||||
|
import bisq.apitest.linux.BashCommand;
|
||||||
import bisq.apitest.linux.BisqApp;
|
import bisq.apitest.linux.BisqApp;
|
||||||
import bisq.apitest.linux.BitcoinDaemon;
|
import bisq.apitest.linux.BitcoinDaemon;
|
||||||
|
|
||||||
@ -101,6 +112,8 @@ public class Scaffold {
|
|||||||
|
|
||||||
public Scaffold setUp() {
|
public Scaffold setUp() {
|
||||||
try {
|
try {
|
||||||
|
installDaoSetupDirectories();
|
||||||
|
|
||||||
// Start each background process from an executor, then add a shutdown hook.
|
// Start each background process from an executor, then add a shutdown hook.
|
||||||
CountDownLatch countdownLatch = new CountDownLatch(config.numSetupTasks);
|
CountDownLatch countdownLatch = new CountDownLatch(config.numSetupTasks);
|
||||||
startBackgroundProcesses(executor, countdownLatch);
|
startBackgroundProcesses(executor, countdownLatch);
|
||||||
@ -147,6 +160,142 @@ public class Scaffold {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void installDaoSetupDirectories() {
|
||||||
|
cleanDaoSetupDirectories();
|
||||||
|
|
||||||
|
String srcResourcesDir = Paths.get("apitest", "src", "main", "resources", "dao-setup").toFile().getAbsolutePath();
|
||||||
|
String buildDataDir = config.rootAppDataDir.getAbsolutePath();
|
||||||
|
try {
|
||||||
|
if (!new File(srcResourcesDir).exists())
|
||||||
|
throw new FileNotFoundException(
|
||||||
|
format("Dao setup dir '%s' not found. Run gradle :apitest:installDaoSetup"
|
||||||
|
+ " to download dao-setup.zip and extract contents to resources folder",
|
||||||
|
srcResourcesDir));
|
||||||
|
|
||||||
|
BashCommand copyBitcoinRegtestDir = new BashCommand(
|
||||||
|
"cp -rf " + srcResourcesDir + "/Bitcoin-regtest/regtest"
|
||||||
|
+ " " + config.bitcoinDatadir);
|
||||||
|
if (copyBitcoinRegtestDir.run().getExitStatus() != 0)
|
||||||
|
throw new IllegalStateException("Could not install bitcoin regtest dir");
|
||||||
|
|
||||||
|
BashCommand copyAliceDataDir = new BashCommand(
|
||||||
|
"cp -rf " + srcResourcesDir + "/" + alicedaemon.appName
|
||||||
|
+ " " + config.rootAppDataDir);
|
||||||
|
if (copyAliceDataDir.run().getExitStatus() != 0)
|
||||||
|
throw new IllegalStateException("Could not install alice data dir");
|
||||||
|
|
||||||
|
BashCommand copyBobDataDir = new BashCommand(
|
||||||
|
"cp -rf " + srcResourcesDir + "/" + bobdaemon.appName
|
||||||
|
+ " " + config.rootAppDataDir);
|
||||||
|
if (copyBobDataDir.run().getExitStatus() != 0)
|
||||||
|
throw new IllegalStateException("Could not install bob data dir");
|
||||||
|
|
||||||
|
log.info("Installed dao-setup files into {}", buildDataDir);
|
||||||
|
|
||||||
|
// Write a bitcoin.conf file with the correct path to the blocknotify script,
|
||||||
|
// and save it to the build resource dir.
|
||||||
|
installBitcoinConf();
|
||||||
|
|
||||||
|
// Copy the blocknotify script from the src resources dir to the
|
||||||
|
// build resources dir. Users may want to edit it sometimes,
|
||||||
|
// when all default block notifcation ports are being used.
|
||||||
|
installBitcoinBlocknotify();
|
||||||
|
|
||||||
|
} catch (IOException | InterruptedException ex) {
|
||||||
|
throw new IllegalStateException("Could not install dao-setup files from " + srcResourcesDir, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void cleanDaoSetupDirectories() {
|
||||||
|
String buildDataDir = config.rootAppDataDir.getAbsolutePath();
|
||||||
|
log.info("Cleaning dao-setup data in {}", buildDataDir);
|
||||||
|
|
||||||
|
try {
|
||||||
|
BashCommand rmBobDataDir = new BashCommand("rm -rf " + config.rootAppDataDir + "/" + bobdaemon.appName);
|
||||||
|
if (rmBobDataDir.run().getExitStatus() != 0)
|
||||||
|
throw new IllegalStateException("Could not delete bob data dir");
|
||||||
|
|
||||||
|
BashCommand rmAliceDataDir = new BashCommand("rm -rf " + config.rootAppDataDir + "/" + alicedaemon.appName);
|
||||||
|
if (rmAliceDataDir.run().getExitStatus() != 0)
|
||||||
|
throw new IllegalStateException("Could not delete alice data dir");
|
||||||
|
|
||||||
|
BashCommand rmArbNodeDataDir = new BashCommand("rm -rf " + config.rootAppDataDir + "/" + arbdaemon.appName);
|
||||||
|
if (rmArbNodeDataDir.run().getExitStatus() != 0)
|
||||||
|
throw new IllegalStateException("Could not delete arbitrator data dir");
|
||||||
|
|
||||||
|
BashCommand rmSeedNodeDataDir = new BashCommand("rm -rf " + config.rootAppDataDir + "/" + seednode.appName);
|
||||||
|
if (rmSeedNodeDataDir.run().getExitStatus() != 0)
|
||||||
|
throw new IllegalStateException("Could not delete seednode data dir");
|
||||||
|
|
||||||
|
BashCommand rmBitcoinRegtestDir = new BashCommand("rm -rf " + config.bitcoinDatadir + "/regtest");
|
||||||
|
if (rmBitcoinRegtestDir.run().getExitStatus() != 0)
|
||||||
|
throw new IllegalStateException("Could not clean bitcoind regtest dir");
|
||||||
|
|
||||||
|
} catch (IOException | InterruptedException ex) {
|
||||||
|
throw new IllegalStateException("Could not clean dao-setup files from " + buildDataDir, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void installBitcoinConf() {
|
||||||
|
// We write out and install a bitcoin.conf file for regtest/dao mode because
|
||||||
|
// the path to the blocknotify script is not known until runtime.
|
||||||
|
String bitcoinConf = "\n"
|
||||||
|
+ "regtest=1\n"
|
||||||
|
+ "[regtest]\n"
|
||||||
|
+ "peerbloomfilters=1\n"
|
||||||
|
+ "rpcport=18443\n"
|
||||||
|
+ "server=1\n"
|
||||||
|
+ "txindex=1\n"
|
||||||
|
+ "debug=net\n"
|
||||||
|
+ "deprecatedrpc=generate\n"
|
||||||
|
+ "rpcuser=apitest\n"
|
||||||
|
+ "rpcpassword=apitest\n"
|
||||||
|
+ "blocknotify=" + config.bashPath + " " + config.bitcoinDatadir + "/blocknotify %\n";
|
||||||
|
String chmod644Perms = "rw-r--r--";
|
||||||
|
saveToFile(bitcoinConf, config.bitcoinDatadir, "bitcoin.conf", chmod644Perms);
|
||||||
|
log.info("Installed {} with perms {}.", config.bitcoinDatadir + "/bitcoin.conf", chmod644Perms);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void installBitcoinBlocknotify() {
|
||||||
|
// gradle is not working for this
|
||||||
|
try {
|
||||||
|
Path srcPath = Paths.get("apitest", "src", "main", "resources", "blocknotify");
|
||||||
|
Path destPath = Paths.get(config.bitcoinDatadir, "blocknotify");
|
||||||
|
Files.copy(srcPath, destPath, REPLACE_EXISTING);
|
||||||
|
String chmod700Perms = "rwx------";
|
||||||
|
Files.setPosixFilePermissions(destPath, PosixFilePermissions.fromString(chmod700Perms));
|
||||||
|
log.info("Installed {} with perms {}.", destPath.toString(), chmod700Perms);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveToFile(String content,
|
||||||
|
String parentDir,
|
||||||
|
@SuppressWarnings("SameParameterValue") String relativeFilePath,
|
||||||
|
String posixFilePermissions) {
|
||||||
|
File tempFile = null;
|
||||||
|
File file;
|
||||||
|
try {
|
||||||
|
file = Paths.get(parentDir, relativeFilePath).toFile();
|
||||||
|
tempFile = File.createTempFile("temp", relativeFilePath, file.getParentFile());
|
||||||
|
tempFile.deleteOnExit();
|
||||||
|
try (PrintWriter out = new PrintWriter(tempFile)) {
|
||||||
|
out.println(content);
|
||||||
|
}
|
||||||
|
FileUtil.renameFile(tempFile, file);
|
||||||
|
Files.setPosixFilePermissions(Paths.get(file.toURI()), PosixFilePermissions.fromString(posixFilePermissions));
|
||||||
|
} catch (IOException ex) {
|
||||||
|
throw new IllegalStateException(format("Error saving %s/%s to disk", parentDir, relativeFilePath), ex);
|
||||||
|
} finally {
|
||||||
|
if (tempFile != null && tempFile.exists()) {
|
||||||
|
log.warn("Temp file still exists after failed save; deleting {} now.", tempFile.getAbsolutePath());
|
||||||
|
if (!tempFile.delete())
|
||||||
|
log.error("Cannot delete temp file.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void installShutdownHook() {
|
private void installShutdownHook() {
|
||||||
// Background apps can be left running until the jvm is manually shutdown,
|
// Background apps can be left running until the jvm is manually shutdown,
|
||||||
// so we add a shutdown hook for that use case.
|
// so we add a shutdown hook for that use case.
|
||||||
|
Loading…
Reference in New Issue
Block a user