From 7fd4e39a3d3223281f31f542c7e24309996888a9 Mon Sep 17 00:00:00 2001 From: Arnaud Date: Fri, 31 Jul 2026 21:45:27 +0400 Subject: [PATCH] fix: crash when config is invalid (#1494) Co-authored-by: Giuliano Mega --- .../requests/node_lifecycle_request.nim | 4 +- tests/integration/storageconfig.nim | 3 -- tests/libstorage/config.nim | 52 +++++++++++++++++++ tests/testLibstorage.nim | 1 + 4 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 tests/libstorage/config.nim diff --git a/library/storage_thread_requests/requests/node_lifecycle_request.nim b/library/storage_thread_requests/requests/node_lifecycle_request.nim index 12644909..c3f024e0 100644 --- a/library/storage_thread_requests/requests/node_lifecycle_request.nim +++ b/library/storage_thread_requests/requests/node_lifecycle_request.nim @@ -104,6 +104,7 @@ proc createStorage( version = storageFullVersion, envVarsPrefix = "storage", cmdLine = @[], + quitOnFailure = false, secondarySources = proc( config: StorageConf, sources: auto ) {.gcsafe, raises: [ConfigurationError].} = @@ -112,7 +113,8 @@ proc createStorage( , ) except ConfigurationError as e: - return err("Failed to create Storage: unable to load configuration: " & e.msg) + # We cannot use e.msg because it is not populated by config-utils + return err("Failed to create Storage: unable to load configuration.") let logFile = conf.setupLogging() diff --git a/tests/integration/storageconfig.nim b/tests/integration/storageconfig.nim index 8c50fa0d..447fb0dd 100644 --- a/tests/integration/storageconfig.nim +++ b/tests/integration/storageconfig.nim @@ -61,9 +61,6 @@ proc buildConfig( return StorageConf.load(cmdLine = config.cliArgs, quitOnFailure = false) except ConfigurationError as e: raiseStorageConfigError msg & e.msg.postFix - except Exception as e: - ## TODO: remove once proper exception handling added to nim-confutils - raiseStorageConfigError msg & e.msg.postFix proc addCliOption*( config: var StorageConfig, group = StartUpCmd.noCmd, cliOption: CliOption diff --git a/tests/libstorage/config.nim b/tests/libstorage/config.nim new file mode 100644 index 00000000..945aea9f --- /dev/null +++ b/tests/libstorage/config.nim @@ -0,0 +1,52 @@ +import std/json +import std/monotimes +import std/os +import std/strutils + +import pkg/chronos +import pkg/results + +import ../asynctest +import ../checktest +import ../../library/storage_thread_requests/requests/node_lifecycle_request + +from ../../storage/storage import StorageServer + +asyncchecksuite "Libstorage - config": + var server: StorageServer + + test "rejects malformed JSON": + let request = + NodeLifecycleRequest.createShared(CREATE_NODE, """{"log-level": "debug"""") + let res = await request.process(addr server) + + check res.isErr + + if res.isErr: + check "unable to load configuration" in res.error + + test "rejects an unknown option": + let request = + NodeLifecycleRequest.createShared(CREATE_NODE, """{"unknown": "debug"}""") + let res = await request.process(addr server) + + check res.isErr + + if res.isErr: + check "unable to load configuration" in res.error + + test "accepts a valid config": + let dataDir = getTempDir() / "libstorage-config" / $getMonoTime() + + defer: + removeDir(dataDir) + + # %* escapes the path so that it can be used in JSON. + let config = $ %*{"data-dir": dataDir} + let request = NodeLifecycleRequest.createShared(CREATE_NODE, config.cstring) + let res = await request.process(addr server) + + check res.isOk + + let closeRequest = NodeLifecycleRequest.createShared(CLOSE_NODE) + check (await closeRequest.process(addr server)).isOk diff --git a/tests/testLibstorage.nim b/tests/testLibstorage.nim index a703f263..8b249e20 100644 --- a/tests/testLibstorage.nim +++ b/tests/testLibstorage.nim @@ -1,4 +1,5 @@ # Tests the Nim side of libstorage. +import ./libstorage/config import ./libstorage/logosmetrics {.warning[UnusedImport]: off.}