diff --git a/lntest/bitcoind_common.go b/lntest/bitcoind_common.go index 019ac268e..f673400ab 100644 --- a/lntest/bitcoind_common.go +++ b/lntest/bitcoind_common.go @@ -15,8 +15,8 @@ import ( "github.com/btcsuite/btcd/rpcclient" ) -// logDir is the name of the temporary log directory. -const logDir = "./.backendlogs" +// logDirPattern is the pattern of the name of the temporary log directory. +const logDirPattern = "%s/.backendlogs" // BitcoindBackendConfig is an implementation of the BackendConfig interface // backed by a Bitcoind node. @@ -73,15 +73,16 @@ func (b BitcoindBackendConfig) Name() string { func newBackend(miner string, netParams *chaincfg.Params, extraArgs []string) ( *BitcoindBackendConfig, func() error, error) { + baseLogDir := fmt.Sprintf(logDirPattern, GetLogDir()) if netParams != &chaincfg.RegressionNetParams { return nil, nil, fmt.Errorf("only regtest supported") } - if err := os.MkdirAll(logDir, 0700); err != nil { + if err := os.MkdirAll(baseLogDir, 0700); err != nil { return nil, nil, err } - logFile, err := filepath.Abs(logDir + "/bitcoind.log") + logFile, err := filepath.Abs(baseLogDir + "/bitcoind.log") if err != nil { return nil, nil, err } @@ -128,13 +129,16 @@ func newBackend(miner string, netParams *chaincfg.Params, extraArgs []string) ( var errStr string // After shutting down the chain backend, we'll make a copy of // the log file before deleting the temporary log dir. - err := CopyFile("./output_bitcoind_chainbackend.log", logFile) + logDestination := fmt.Sprintf( + "%s/output_bitcoind_chainbackend.log", GetLogDir(), + ) + err := CopyFile(logDestination, logFile) if err != nil { errStr += fmt.Sprintf("unable to copy file: %v\n", err) } - if err = os.RemoveAll(logDir); err != nil { + if err = os.RemoveAll(baseLogDir); err != nil { errStr += fmt.Sprintf( - "cannot remove dir %s: %v\n", logDir, err, + "cannot remove dir %s: %v\n", baseLogDir, err, ) } if err := os.RemoveAll(tempBitcoindDir); err != nil { diff --git a/lntest/btcd.go b/lntest/btcd.go index 11e19d3fd..e8b8cac43 100644 --- a/lntest/btcd.go +++ b/lntest/btcd.go @@ -14,8 +14,8 @@ import ( "github.com/btcsuite/btcd/rpcclient" ) -// logDir is the name of the temporary log directory. -const logDir = "./.backendlogs" +// logDirPattern is the pattern of the name of the temporary log directory. +const logDirPattern = "%s/.backendlogs" // temp is used to signal we want to establish a temporary connection using the // btcd Node API. @@ -75,12 +75,13 @@ func (b BtcdBackendConfig) Name() string { func NewBackend(miner string, netParams *chaincfg.Params) ( *BtcdBackendConfig, func() error, error) { + baseLogDir := fmt.Sprintf(logDirPattern, GetLogDir()) args := []string{ "--rejectnonstd", "--txindex", "--trickleinterval=100ms", "--debuglevel=debug", - "--logdir=" + logDir, + "--logdir=" + baseLogDir, "--nowinservice", // The miner will get banned and disconnected from the node if // its requested data are not found. We add a nobanning flag to @@ -110,14 +111,17 @@ func NewBackend(miner string, netParams *chaincfg.Params) ( // After shutting down the chain backend, we'll make a copy of // the log file before deleting the temporary log dir. - logFile := logDir + "/" + netParams.Name + "/btcd.log" - err := CopyFile("./output_btcd_chainbackend.log", logFile) + logFile := baseLogDir + "/" + netParams.Name + "/btcd.log" + logDestination := fmt.Sprintf( + "%s/output_btcd_chainbackend.log", GetLogDir(), + ) + err := CopyFile(logDestination, logFile) if err != nil { errStr += fmt.Sprintf("unable to copy file: %v\n", err) } - if err = os.RemoveAll(logDir); err != nil { + if err = os.RemoveAll(baseLogDir); err != nil { errStr += fmt.Sprintf( - "cannot remove dir %s: %v\n", logDir, err, + "cannot remove dir %s: %v\n", baseLogDir, err, ) } if errStr != "" { diff --git a/lntest/itest/lnd_test.go b/lntest/itest/lnd_test.go index 1b1533fbe..c2ceac58c 100644 --- a/lntest/itest/lnd_test.go +++ b/lntest/itest/lnd_test.go @@ -2435,7 +2435,7 @@ func testOpenChannelAfterReorg(net *lntest.NetworkHarness, t *harnessTest) { ) // Set up a new miner that we can use to cause a reorg. - tempLogDir := "./.tempminerlogs" + tempLogDir := fmt.Sprintf("%s/.tempminerlogs", lntest.GetLogDir()) logFilename := "output-open_channel_reorg-temp_miner.log" tempMiner, tempMinerCleanUp, err := lntest.NewMiner( tempLogDir, logFilename, @@ -14158,6 +14158,8 @@ func TestLightningNetworkDaemon(t *testing.T) { } // Parse testing flags that influence our test execution. + logDir := lntest.GetLogDir() + require.NoError(t, os.MkdirAll(logDir, 0700)) testCases, trancheIndex, trancheOffset := getTestCaseSplitTranche() lntest.ApplyPortOffset(uint32(trancheIndex) * 1000) @@ -14176,7 +14178,7 @@ func TestLightningNetworkDaemon(t *testing.T) { // guarantees of getting included in to blocks. // // We will also connect it to our chain backend. - minerLogDir := "./.minerlogs" + minerLogDir := fmt.Sprintf("%s/.minerlogs", logDir) miner, minerCleanUp, err := lntest.NewMiner( minerLogDir, "output_btcd_miner.log", harnessNetParams, &rpcclient.NotificationHandlers{}, diff --git a/lntest/node.go b/lntest/node.go index 8c72a1edb..cb368e750 100644 --- a/lntest/node.go +++ b/lntest/node.go @@ -70,6 +70,10 @@ var ( logOutput = flag.Bool("logoutput", false, "log output from node n to file output-n.log") + // logSubDir is the default directory where the logs are written to if + // logOutput is true. + logSubDir = flag.String("logdir", ".", "default dir to write logs to") + // goroutineDump is a flag that can be set to dump the active // goroutines of test nodes on failure. goroutineDump = flag.Bool("goroutinedump", false, @@ -110,6 +114,15 @@ func ApplyPortOffset(offset uint32) { _ = atomic.AddUint32(&lastPort, offset) } +// GetLogDir returns the passed --logdir flag or the default value if it wasn't +// set. +func GetLogDir() string { + if logSubDir != nil && *logSubDir != "" { + return *logSubDir + } + return "." +} + // generateListeningPorts returns four ints representing ports to listen on // designated for the current lightning network test. This returns the next // available ports for the p2p, rpc, rest and profiling services. @@ -392,11 +405,9 @@ func NewMiner(logDir, logFilename string, netParams *chaincfg.Params, // After shutting down the miner, we'll make a copy of the log // file before deleting the temporary log dir. - logFile := fmt.Sprintf( - "%s/%s/btcd.log", logDir, netParams.Name, - ) - copyPath := fmt.Sprintf("./%s", logFilename) - err := CopyFile(copyPath, logFile) + logFile := fmt.Sprintf("%s/%s/btcd.log", logDir, netParams.Name) + copyPath := fmt.Sprintf("%s/../%s", logDir, logFilename) + err := CopyFile(filepath.Clean(copyPath), logFile) if err != nil { return fmt.Errorf("unable to copy file: %v", err) } @@ -481,24 +492,28 @@ func (hn *HarnessNode) start(lndBinary string, lndError chan<- error) error { // If the logoutput flag is passed, redirect output from the nodes to // log files. if *logOutput { - fileName := fmt.Sprintf("output-%d-%s-%s.log", hn.NodeID, + dir := GetLogDir() + fileName := fmt.Sprintf("%s/output-%d-%s-%s.log", dir, hn.NodeID, hn.Cfg.Name, hex.EncodeToString(hn.PubKey[:logPubKeyBytes])) // If the node's PubKey is not yet initialized, create a temporary // file name. Later, after the PubKey has been initialized, the // file can be moved to its final name with the PubKey included. if bytes.Equal(hn.PubKey[:4], []byte{0, 0, 0, 0}) { - fileName = fmt.Sprintf("output-%d-%s-tmp__.log", hn.NodeID, - hn.Cfg.Name) + fileName = fmt.Sprintf("%s/output-%d-%s-tmp__.log", + dir, hn.NodeID, hn.Cfg.Name) // Once the node has done its work, the log file can be renamed. finalizeLogfile = func() { if hn.logFile != nil { hn.logFile.Close() - newFileName := fmt.Sprintf("output-%d-%s-%s.log", - hn.NodeID, hn.Cfg.Name, - hex.EncodeToString(hn.PubKey[:logPubKeyBytes])) + pubKeyHex := hex.EncodeToString( + hn.PubKey[:logPubKeyBytes], + ) + newFileName := fmt.Sprintf("%s/output"+ + "-%d-%s-%s.log", dir, hn.NodeID, + hn.Cfg.Name, pubKeyHex) err := os.Rename(fileName, newFileName) if err != nil { fmt.Printf("could not rename "+