kaspad/stability-tests/common/run-kaspad.go
stasatdaglabs 487fab0e2b
Implement a stability test to stress test the DAA algorithm (#1767)
* Copy over boilerplate and begin implementing TestDAA.

* Implement a fairly reliable method of hashing at a certain hashrate.

* Convert the DAA test to an application.

* Start kaspad and make sure that hashrate throttling works with that as well.

* Finish implementing testConstantHashRate.

* Tidied up a bit.

* Convert TestDAA back into a go test.

* Reorganize TestDAA to be more like a traditional test.

* Add sudden hashrate drop/jump tests.

* Simplify targetHashNanosecondsFunction.

* Improve progress logs.

* Add more tests.

* Remove the no-longer relevant `hashes` part of targetHashNanosecondsFunction.

* Implement a constant hashrate increase test.

* Implement a constant hashrate decrease test.

* Give the correct run duration to the constant hashrate decrease test.

* Add cooldowns to exponential functions.

* Add run.sh to the DAA test.

* Add a README.

* Add `daa` to run-slow.sh.

* Make go lint happy.

* Fix the README's title.

* Keep running tests even if one of them failed on high block rate deviation.

* Fix hashrate peak/valley tests.

* Preallocate arrays for hash and mining durations.

* Add more statistics to the "mined block" log.

* Make sure runDAATest stops when it's suppposed to.

* Add a newline after "5 minute cooldown."

* Fix variable names.

* Rename totalElapsedTime to tatalElapsedDuration.

* In measureMachineHashNanoseconds, generate a random nonce only once.

* In runDAATest, add "DAA" to the start/finish log.

* Remove --logdir from kaspadRunCommand.

* In runDAATest, enlarge the nonce range to the entirety of uint64.

* Explain what targetHashNanosecondsFunction is.

* Move RunKaspadForTesting into common.

* Rename runForDuration to loopForDuration.

* Make go lint happy.

* Extract fetchBlockForMining to a separate function.

* Extract waitUntilTargetHashDurationHadElapsed to a separate function.

* Extract pushHashDuration and pushMiningDuration to separate functions.

* Extract logMinedBlockStatsAndUpdateStatFields to a separate function.

* Extract submitMinedBlock to a separate function.

* Extract tryNonceForMiningAndIncrementNonce to a separate function.

* Add comments.

* Use a rolling average instead of appending to an array for performance/accuracy.

* Change a word in a comment.

* Explain why we wait for five minutes at the end of the exponential increase/decrease tests.

Co-authored-by: Svarog <feanorr@gmail.com>
2021-07-07 16:14:22 +03:00

54 lines
1.1 KiB
Go

package common
import (
"fmt"
"github.com/kaspanet/kaspad/domain/dagconfig"
"os"
"sync/atomic"
"syscall"
"testing"
)
// RunKaspadForTesting runs kaspad for testing purposes
func RunKaspadForTesting(t *testing.T, testName string, rpcAddress string) func() {
appDir, err := TempDir(testName)
if err != nil {
t.Fatalf("TempDir: %s", err)
}
kaspadRunCommand, err := StartCmd("KASPAD",
"kaspad",
NetworkCliArgumentFromNetParams(&dagconfig.DevnetParams),
"--appdir", appDir,
"--rpclisten", rpcAddress,
"--loglevel", "debug",
)
if err != nil {
t.Fatalf("StartCmd: %s", err)
}
t.Logf("Kaspad started with --appdir=%s", appDir)
isShutdown := uint64(0)
go func() {
err := kaspadRunCommand.Wait()
if err != nil {
if atomic.LoadUint64(&isShutdown) == 0 {
panic(fmt.Sprintf("Kaspad closed unexpectedly: %s. See logs at: %s", err, appDir))
}
}
}()
return func() {
err := kaspadRunCommand.Process.Signal(syscall.SIGTERM)
if err != nil {
t.Fatalf("Signal: %s", err)
}
err = os.RemoveAll(appDir)
if err != nil {
t.Fatalf("RemoveAll: %s", err)
}
atomic.StoreUint64(&isShutdown, 1)
t.Logf("Kaspad stopped")
}
}