Skip to content

Commit

Permalink
Cleans khedra a bit, adds tests
Browse files Browse the repository at this point in the history
  • Loading branch information
tjayrush committed Feb 5, 2025
1 parent 13c771e commit cd9a0b6
Show file tree
Hide file tree
Showing 6 changed files with 370 additions and 374 deletions.
26 changes: 23 additions & 3 deletions app/action_daemon.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,11 +155,9 @@ func (k *KhedraApp) createChifraConfig() error {
chainStr := k.config.EnabledChains()
chains := strings.Split(chainStr, ",")
for _, chain := range chains {
chainConfig := filepath.Join(k.config.General.DataFolder, "config", chain)
if err := file.EstablishFolder(chainConfig); err != nil {
if err := k.createChainConfig(chain); err != nil {
return err
}
k.logger.Progress("Creating chain config", "chainConfig", chainConfig)
}

tmpl, err := template.New("tmpl").Parse(configTmpl)
Expand Down Expand Up @@ -195,6 +193,28 @@ func (k *KhedraApp) createChifraConfig() error {
// 14170,apps,Accounts,monitors,acctExport,n4,,,,,note,,,,,,Addresses provided on the command line are ignored in `--watch` mode.
// 14180,apps,Accounts,monitors,acctExport,n5,,,,,note,,,,,,Providing the value `existing` to the `--watchlist` monitors all existing monitor files (see --list).

func (k *KhedraApp) createChainConfig(chain string) error {
chainConfig := filepath.Join(k.config.General.DataFolder, "config", chain)
if err := file.EstablishFolder(chainConfig); err != nil {
return fmt.Errorf("failed to create folder %s: %w", chainConfig, err)
}

k.logger.Progress("Creating chain config", "chainConfig", chainConfig)

// baseURL := "https://raw.githubusercontent.com/TrueBlocks/trueblocks-core/refs/heads/master/src/other/install/per-chain/"
// url, err := url.JoinPath(baseURL, chain, "allocs.csv")
// if err != nil {
// return err
// }
// allocFn := filepath.Join(chainConfig, "allocs.csv")
// dur := 100 * 365 * 24 * time.Hour // 100 years
// if _, err := utils.DownloadAndStore(url, allocFn, dur); err != nil {
// return fmt.Errorf("failed to download and store allocs.csv for chain %s: %w", chain, err)
// }

return nil
}

var configTmpl string = `[version]
current = "{{.Version}}"
Expand Down
48 changes: 35 additions & 13 deletions app/app.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package app

import (
"fmt"
"log"
"log/slog"
"os"

Expand All @@ -19,19 +19,9 @@ type KhedraApp struct {

func NewKhedraApp() *KhedraApp {
k := KhedraApp{}

// If khedra is already running, one of these ports is serving the
// control API. We need to make sure it's not running and fail if
// it is.
cntlSvcPorts := []string{"8338", "8337", "8336", "8335"}
for _, port := range cntlSvcPorts {
if utils.PingServer("http://localhost:" + port) {
msg := fmt.Sprintf("Error: Khedra is already running (control service port :%s is in use). Quitting...", port)
fmt.Println(colors.Red+msg, colors.Off)
os.Exit(1)
}
if k.isRunning() {
log.Fatal(colors.BrightBlue + "khedra is already running - cannot run..." + colors.Off)
}

k.cli = initCli(&k)
return &k
}
Expand All @@ -40,6 +30,38 @@ func (k *KhedraApp) Run() {
_ = k.cli.Run(os.Args)
}

func (k *KhedraApp) isRunning() bool {
okArgs := map[string]bool{
"help": true,
"-h": true,
"--help": true,
"version": true,
"-v": true,
"--version": true,
}

if len(os.Args) < 2 || len(os.Args) == 2 && os.Args[1] == "config" {
return false
}

for i, arg := range os.Args {
if okArgs[arg] {
return false
} else if arg == "config" && i < len(os.Args)-1 && os.Args[i+1] == "show" {
return false
}
}

ports := []string{"8338", "8337", "8336", "8335"}
for _, port := range ports {
if utils.PingServer("http://localhost:" + port) {
return true
}
}

return false
}

func (k *KhedraApp) ConfigMaker() (types.Config, error) {
cfg, err := LoadConfig()
if err != nil {
Expand Down
150 changes: 75 additions & 75 deletions app/config_helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ func TestLoadFileConfig(t *testing.T) {

cfg := types.NewConfig()
chain := cfg.Chains["mainnet"]
chain.RPCs = []string{"http://localhost:8545", "http://localhost:8546"}
chain.RPCs = []string{"http://localhost:8545"}
cfg.Chains["mainnet"] = chain
bytes, _ := yamlv2.Marshal(cfg)
_ = coreFile.StringToAsciiFile(types.GetConfigFn(), string(bytes))
Expand Down Expand Up @@ -116,77 +116,77 @@ func TestValidateConfig(t *testing.T) {
}

// ---------------------------------------------------------
// func TestInitializeFolders(t *testing.T) {
// cleanup := func(cfg types.Config) {
// os.RemoveAll(cfg.Logging.Folder)
// os.RemoveAll(cfg.General.DataFolder)
// }

// allFoldersExist := func() {
// cfg := types.Config{
// Logging: types.Logging{
// Folder: "/tmp/test-logging-folder",
// },
// General: types.General{
// DataFolder: "/tmp/test-data-folder",
// Strategy: "download",
// Detail: "index",
// },
// }

// _ = os.MkdirAll(cfg.Logging.Folder, os.ModePerm)
// _ = os.MkdirAll(cfg.General.DataFolder, os.ModePerm)

// err := initializeFolders(cfg)
// assert.NoError(t, err)

// cleanup(cfg)
// }
// t.Run("All Folders Exist", func(t *testing.T) { allFoldersExist() })

// createMissingFolders := func() {
// cfg := types.Config{
// Logging: types.Logging{
// Folder: "/tmp/test-missing-logging-folder",
// },
// General: types.General{
// DataFolder: "/tmp/test-missing-data-folder",
// Strategy: "download",
// Detail: "index",
// },
// }

// cleanup(cfg)

// err := initializeFolders(cfg)
// assert.NoError(t, err)

// _, err = os.Stat(cfg.Logging.Folder)
// assert.NoError(t, err)
// _, err = os.Stat(cfg.General.DataFolder)
// assert.NoError(t, err)

// cleanup(cfg)
// }
// t.Run("Create Missing Folders", func(t *testing.T) { createMissingFolders() })

// errorOnInvalidPath := func() {
// cfg := types.Config{
// Logging: types.Logging{
// Folder: "/invalid-folder-path/\\0",
// },
// General: types.General{
// DataFolder: "/tmp/test-data-folder",
// Strategy: "download",
// Detail: "index",
// },
// }

// err := initializeFolders(cfg)
// assert.Error(t, err)
// assert.Contains(t, err.Error(), "failed to create folder")

// cleanup(cfg)
// }
// t.Run("Error On Invalid Path", func(t *testing.T) { errorOnInvalidPath() })
// }
func TestInitializeFolders(t *testing.T) {
cleanup := func(cfg types.Config) {
os.RemoveAll(cfg.Logging.Folder)
os.RemoveAll(cfg.General.DataFolder)
}

allFoldersExist := func() {
cfg := types.Config{
Logging: types.Logging{
Folder: "/tmp/test-logging-folder",
},
General: types.General{
DataFolder: "/tmp/test-data-folder",
Strategy: "download",
Detail: "index",
},
}

_ = os.MkdirAll(cfg.Logging.Folder, os.ModePerm)
_ = os.MkdirAll(cfg.General.DataFolder, os.ModePerm)

err := initializeFolders(cfg)
assert.NoError(t, err)

cleanup(cfg)
}
t.Run("All Folders Exist", func(t *testing.T) { allFoldersExist() })

createMissingFolders := func() {
cfg := types.Config{
Logging: types.Logging{
Folder: "/tmp/test-missing-logging-folder",
},
General: types.General{
DataFolder: "/tmp/test-missing-data-folder",
Strategy: "download",
Detail: "index",
},
}

cleanup(cfg)

err := initializeFolders(cfg)
assert.NoError(t, err)

_, err = os.Stat(cfg.Logging.Folder)
assert.NoError(t, err)
_, err = os.Stat(cfg.General.DataFolder)
assert.NoError(t, err)

cleanup(cfg)
}
t.Run("Create Missing Folders", func(t *testing.T) { createMissingFolders() })

// errorOnInvalidPath := func() {
// cfg := types.Config{
// Logging: types.Logging{
// Folder: "/invalid-folder-path/\\0",
// },
// General: types.General{
// DataFolder: "/tmp/test-data-folder",
// Strategy: "download",
// Detail: "index",
// },
// }

// err := initializeFolders(cfg)
// assert.Error(t, err)
// assert.Contains(t, err.Error(), "failed to create folder")

// cleanup(cfg)
// }
// t.Run("Error On Invalid Path", func(t *testing.T) { errorOnInvalidPath() })
}
Loading

0 comments on commit cd9a0b6

Please sign in to comment.