mirror of
https://github.com/redis/redis.git
synced 2026-02-03 20:39:54 -05:00
PR #10285 introduced support for modules to register four types of configurations — Bool, Numeric, String, and Enum. Accessible through the Redis config file and the CONFIG command. With this PR, it will be possible to register configuration parameters without automatically prefixing the parameter names. This provides greater flexibility in configuration naming, enabling, for instance, both `bf-initial-size` or `initial-size` to be defined in the module without automatically prefixing with `<MODULE-NAME>.`. In addition it will also be possible to create a single additional alias via the same API. This brings us another step closer to integrate modules into redis core. **Example:** Register a configuration parameter `bf-initial-size` with an alias `initial-size` without the automatic module name prefix, set with new `REDISMODULE_CONFIG_UNPREFIXED` flag: ``` RedisModule_RegisterBoolConfig(ctx, "bf-initial-size|initial-size", default_val, optflags | REDISMODULE_CONFIG_UNPREFIXED, getfn, setfn, applyfn, privdata); ``` # API changes Related functions that now support unprefixed configuration flag (`REDISMODULE_CONFIG_UNPREFIXED`) along with optional alias: ``` RedisModule_RegisterBoolConfig RedisModule_RegisterEnumConfig RedisModule_RegisterNumericConfig RedisModule_RegisterStringConfig ``` # Implementation Details: `config.c`: On load server configuration, at function `loadServerConfigFromString()`, it collects all unknown configurations into `module_configs_queue` dictionary. These may include valid module configurations or invalid ones. They will be validated later by `loadModuleConfigs()` against the configurations declared by the loaded module(s). `Module.c:` The `ModuleConfig` structure has been modified to store now: (1) Full configuration name (2) Alias (3) Unprefixed flag status - ensuring that configurations retain their original registration format when triggered in notifications. Added error printout: This change introduces an error printout for unresolved configurations, detailing each unresolved parameter detected during startup. The last line in the output existed prior to this change and has been retained to systems relies on it: ``` 595011:M 18 Nov 2024 08:26:23.616 # Unresolved Configuration(s) Detected: 595011:M 18 Nov 2024 08:26:23.616 # >>> 'bf-initiel-size 8' 595011:M 18 Nov 2024 08:26:23.616 # >>> 'search-sizex 32' 595011:M 18 Nov 2024 08:26:23.616 # Module Configuration detected without loadmodule directive or no ApplyConfig call: aborting ``` # Backward Compatibility: Existing modules will function without modification, as the new functionality only applies if REDISMODULE_CONFIG_UNPREFIXED is explicitly set. # Module vs. Core API Conflict Behavior The new API allows to modules loading duplication of same configuration name or same configuration alias, just like redis core configuration allows (i.e. the users sets two configs with a different value, but these two configs are actually the same one). Unlike redis core, given a name and its alias, it doesn't allow have both configuration on load. To implement it, it is required to modify DS `module_configs_queue` to reflect the order of their loading and later on, during `loadModuleConfigs()`, resolve pairs of names and aliases and which one is the last one to apply. "Relaxing" this limitation can be deferred to a future update if necessary, but for now, we error in this case.
346 lines
20 KiB
Tcl
346 lines
20 KiB
Tcl
set testmodule [file normalize tests/modules/moduleconfigs.so]
|
|
set testmoduletwo [file normalize tests/modules/moduleconfigstwo.so]
|
|
|
|
start_server {tags {"modules"}} {
|
|
r module load $testmodule
|
|
test {Config get commands work} {
|
|
# Make sure config get module config works
|
|
assert_not_equal [lsearch [lmap x [r module list] {dict get $x name}] moduleconfigs] -1
|
|
assert_equal [r config get moduleconfigs.mutable_bool] "moduleconfigs.mutable_bool yes"
|
|
assert_equal [r config get moduleconfigs.immutable_bool] "moduleconfigs.immutable_bool no"
|
|
assert_equal [r config get moduleconfigs.memory_numeric] "moduleconfigs.memory_numeric 1024"
|
|
assert_equal [r config get moduleconfigs.string] "moduleconfigs.string {secret password}"
|
|
assert_equal [r config get moduleconfigs.enum] "moduleconfigs.enum one"
|
|
assert_equal [r config get moduleconfigs.flags] "moduleconfigs.flags {one two}"
|
|
assert_equal [r config get moduleconfigs.numeric] "moduleconfigs.numeric -1"
|
|
|
|
# Check un-prefixed and aliased configuration
|
|
assert_equal [r config get unprefix-bool] "unprefix-bool yes"
|
|
assert_equal [r config get unprefix-noalias-bool] "unprefix-noalias-bool yes"
|
|
assert_equal [r config get unprefix-bool-alias] "unprefix-bool-alias yes"
|
|
assert_equal [r config get unprefix.numeric] "unprefix.numeric -1"
|
|
assert_equal [r config get unprefix.numeric-alias] "unprefix.numeric-alias -1"
|
|
assert_equal [r config get unprefix-string] "unprefix-string {secret unprefix}"
|
|
assert_equal [r config get unprefix.string-alias] "unprefix.string-alias {secret unprefix}"
|
|
assert_equal [r config get unprefix-enum] "unprefix-enum one"
|
|
assert_equal [r config get unprefix-enum-alias] "unprefix-enum-alias one"
|
|
}
|
|
|
|
test {Config set commands work} {
|
|
# Make sure that config sets work during runtime
|
|
r config set moduleconfigs.mutable_bool no
|
|
assert_equal [r config get moduleconfigs.mutable_bool] "moduleconfigs.mutable_bool no"
|
|
r config set moduleconfigs.memory_numeric 1mb
|
|
assert_equal [r config get moduleconfigs.memory_numeric] "moduleconfigs.memory_numeric 1048576"
|
|
r config set moduleconfigs.string wafflewednesdays
|
|
assert_equal [r config get moduleconfigs.string] "moduleconfigs.string wafflewednesdays"
|
|
set not_embstr [string repeat A 50]
|
|
r config set moduleconfigs.string $not_embstr
|
|
assert_equal [r config get moduleconfigs.string] "moduleconfigs.string $not_embstr"
|
|
r config set moduleconfigs.string \x73\x75\x70\x65\x72\x20\x00\x73\x65\x63\x72\x65\x74\x20\x70\x61\x73\x73\x77\x6f\x72\x64
|
|
assert_equal [r config get moduleconfigs.string] "moduleconfigs.string {super \0secret password}"
|
|
r config set moduleconfigs.enum two
|
|
assert_equal [r config get moduleconfigs.enum] "moduleconfigs.enum two"
|
|
r config set moduleconfigs.flags two
|
|
assert_equal [r config get moduleconfigs.flags] "moduleconfigs.flags two"
|
|
r config set moduleconfigs.numeric -2
|
|
assert_equal [r config get moduleconfigs.numeric] "moduleconfigs.numeric -2"
|
|
|
|
# Check un-prefixed and aliased configuration
|
|
r config set unprefix-bool no
|
|
assert_equal [r config get unprefix-bool] "unprefix-bool no"
|
|
assert_equal [r config get unprefix-bool-alias] "unprefix-bool-alias no"
|
|
r config set unprefix-bool-alias yes
|
|
assert_equal [r config get unprefix-bool] "unprefix-bool yes"
|
|
assert_equal [r config get unprefix-bool-alias] "unprefix-bool-alias yes"
|
|
r config set unprefix.numeric 5
|
|
assert_equal [r config get unprefix.numeric] "unprefix.numeric 5"
|
|
assert_equal [r config get unprefix.numeric-alias] "unprefix.numeric-alias 5"
|
|
r config set unprefix.numeric-alias 6
|
|
assert_equal [r config get unprefix.numeric] "unprefix.numeric 6"
|
|
r config set unprefix.string-alias "blabla"
|
|
assert_equal [r config get unprefix-string] "unprefix-string blabla"
|
|
assert_equal [r config get unprefix.string-alias] "unprefix.string-alias blabla"
|
|
r config set unprefix-enum two
|
|
assert_equal [r config get unprefix-enum] "unprefix-enum two"
|
|
assert_equal [r config get unprefix-enum-alias] "unprefix-enum-alias two"
|
|
}
|
|
|
|
test {Config set commands enum flags} {
|
|
r config set moduleconfigs.flags "none"
|
|
assert_equal [r config get moduleconfigs.flags] "moduleconfigs.flags none"
|
|
|
|
r config set moduleconfigs.flags "two four"
|
|
assert_equal [r config get moduleconfigs.flags] "moduleconfigs.flags {two four}"
|
|
|
|
r config set moduleconfigs.flags "five"
|
|
assert_equal [r config get moduleconfigs.flags] "moduleconfigs.flags five"
|
|
|
|
r config set moduleconfigs.flags "one four"
|
|
assert_equal [r config get moduleconfigs.flags] "moduleconfigs.flags five"
|
|
|
|
r config set moduleconfigs.flags "one two four"
|
|
assert_equal [r config get moduleconfigs.flags] "moduleconfigs.flags {five two}"
|
|
}
|
|
|
|
test {Immutable flag works properly and rejected strings dont leak} {
|
|
# Configs flagged immutable should not allow sets
|
|
catch {[r config set moduleconfigs.immutable_bool yes]} e
|
|
assert_match {*can't set immutable config*} $e
|
|
catch {[r config set moduleconfigs.string rejectisfreed]} e
|
|
assert_match {*Cannot set string to 'rejectisfreed'*} $e
|
|
}
|
|
|
|
test {Numeric limits work properly} {
|
|
# Configs over/under the limit shouldn't be allowed, and memory configs should only take memory values
|
|
catch {[r config set moduleconfigs.memory_numeric 200gb]} e
|
|
assert_match {*argument must be between*} $e
|
|
catch {[r config set moduleconfigs.memory_numeric -5]} e
|
|
assert_match {*argument must be a memory value*} $e
|
|
catch {[r config set moduleconfigs.numeric -10]} e
|
|
assert_match {*argument must be between*} $e
|
|
}
|
|
|
|
test {Enums only able to be set to passed in values} {
|
|
# Module authors specify what values are valid for enums, check that only those values are ok on a set
|
|
catch {[r config set moduleconfigs.enum asdf]} e
|
|
assert_match {*must be one of the following*} $e
|
|
}
|
|
|
|
test {test blocking of config registration and load outside of OnLoad} {
|
|
assert_equal [r block.register.configs.outside.onload] OK
|
|
}
|
|
|
|
test {Unload removes module configs} {
|
|
r module unload moduleconfigs
|
|
assert_equal [r config get moduleconfigs.*] ""
|
|
r module load $testmodule
|
|
# these should have reverted back to their module specified values
|
|
assert_equal [r config get moduleconfigs.mutable_bool] "moduleconfigs.mutable_bool yes"
|
|
assert_equal [r config get moduleconfigs.immutable_bool] "moduleconfigs.immutable_bool no"
|
|
assert_equal [r config get moduleconfigs.memory_numeric] "moduleconfigs.memory_numeric 1024"
|
|
assert_equal [r config get moduleconfigs.string] "moduleconfigs.string {secret password}"
|
|
assert_equal [r config get moduleconfigs.enum] "moduleconfigs.enum one"
|
|
assert_equal [r config get moduleconfigs.flags] "moduleconfigs.flags {one two}"
|
|
assert_equal [r config get moduleconfigs.numeric] "moduleconfigs.numeric -1"
|
|
|
|
# Check un-prefixed and aliased configuration
|
|
assert_equal [r config get unprefix-bool] "unprefix-bool yes"
|
|
assert_equal [r config get unprefix-bool-alias] "unprefix-bool-alias yes"
|
|
assert_equal [r config get unprefix.numeric] "unprefix.numeric -1"
|
|
assert_equal [r config get unprefix.numeric-alias] "unprefix.numeric-alias -1"
|
|
assert_equal [r config get unprefix-string] "unprefix-string {secret unprefix}"
|
|
assert_equal [r config get unprefix.string-alias] "unprefix.string-alias {secret unprefix}"
|
|
assert_equal [r config get unprefix-enum] "unprefix-enum one"
|
|
assert_equal [r config get unprefix-enum-alias] "unprefix-enum-alias one"
|
|
|
|
|
|
r module unload moduleconfigs
|
|
}
|
|
|
|
test {test loadex functionality} {
|
|
r module loadex $testmodule CONFIG moduleconfigs.mutable_bool no \
|
|
CONFIG moduleconfigs.immutable_bool yes \
|
|
CONFIG moduleconfigs.memory_numeric 2mb \
|
|
CONFIG moduleconfigs.string tclortickle \
|
|
CONFIG unprefix-bool no \
|
|
CONFIG unprefix.numeric-alias 123 \
|
|
CONFIG unprefix-string abc_def \
|
|
|
|
assert_not_equal [lsearch [lmap x [r module list] {dict get $x name}] moduleconfigs] -1
|
|
assert_equal [r config get moduleconfigs.mutable_bool] "moduleconfigs.mutable_bool no"
|
|
assert_equal [r config get moduleconfigs.immutable_bool] "moduleconfigs.immutable_bool yes"
|
|
assert_equal [r config get moduleconfigs.memory_numeric] "moduleconfigs.memory_numeric 2097152"
|
|
assert_equal [r config get moduleconfigs.string] "moduleconfigs.string tclortickle"
|
|
# Configs that were not changed should still be their module specified value
|
|
assert_equal [r config get moduleconfigs.enum] "moduleconfigs.enum one"
|
|
assert_equal [r config get moduleconfigs.flags] "moduleconfigs.flags {one two}"
|
|
assert_equal [r config get moduleconfigs.numeric] "moduleconfigs.numeric -1"
|
|
|
|
# Check un-prefixed and aliased configuration
|
|
assert_equal [r config get unprefix-bool] "unprefix-bool no"
|
|
assert_equal [r config get unprefix-bool-alias] "unprefix-bool-alias no"
|
|
assert_equal [r config get unprefix.numeric] "unprefix.numeric 123"
|
|
assert_equal [r config get unprefix.numeric-alias] "unprefix.numeric-alias 123"
|
|
assert_equal [r config get unprefix-string] "unprefix-string abc_def"
|
|
assert_equal [r config get unprefix.string-alias] "unprefix.string-alias abc_def"
|
|
assert_equal [r config get unprefix-enum] "unprefix-enum one"
|
|
assert_equal [r config get unprefix-enum-alias] "unprefix-enum-alias one"
|
|
|
|
|
|
}
|
|
|
|
test {apply function works} {
|
|
catch {[r config set moduleconfigs.mutable_bool yes]} e
|
|
assert_match {*Bool configs*} $e
|
|
assert_equal [r config get moduleconfigs.mutable_bool] "moduleconfigs.mutable_bool no"
|
|
catch {[r config set moduleconfigs.memory_numeric 1000 moduleconfigs.numeric 1000]} e
|
|
assert_match {*cannot equal*} $e
|
|
assert_equal [r config get moduleconfigs.memory_numeric] "moduleconfigs.memory_numeric 2097152"
|
|
assert_equal [r config get moduleconfigs.numeric] "moduleconfigs.numeric -1"
|
|
r module unload moduleconfigs
|
|
}
|
|
|
|
test {test double config argument to loadex} {
|
|
r module loadex $testmodule CONFIG moduleconfigs.mutable_bool yes \
|
|
CONFIG moduleconfigs.mutable_bool no \
|
|
CONFIG unprefix.numeric-alias 1 \
|
|
CONFIG unprefix.numeric-alias 2 \
|
|
CONFIG unprefix-string blabla
|
|
|
|
assert_equal [r config get moduleconfigs.mutable_bool] "moduleconfigs.mutable_bool no"
|
|
# Check un-prefixed and aliased configuration
|
|
assert_equal [r config get unprefix.numeric-alias] "unprefix.numeric-alias 2"
|
|
assert_equal [r config get unprefix.numeric] "unprefix.numeric 2"
|
|
assert_equal [r config get unprefix-string] "unprefix-string blabla"
|
|
assert_equal [r config get unprefix.string-alias] "unprefix.string-alias blabla"
|
|
r module unload moduleconfigs
|
|
}
|
|
|
|
test {missing loadconfigs call} {
|
|
catch {[r module loadex $testmodule CONFIG moduleconfigs.string "cool" ARGS noload]} e
|
|
assert_match {*ERR*} $e
|
|
}
|
|
|
|
test {test loadex rejects bad configs} {
|
|
# Bad config 200gb is over the limit
|
|
catch {[r module loadex $testmodule CONFIG moduleconfigs.memory_numeric 200gb ARGS]} e
|
|
assert_match {*ERR*} $e
|
|
# We should completely remove all configs on a failed load
|
|
assert_equal [r config get moduleconfigs.*] ""
|
|
# No value for config, should error out
|
|
catch {[r module loadex $testmodule CONFIG moduleconfigs.mutable_bool CONFIG moduleconfigs.enum two ARGS]} e
|
|
assert_match {*ERR*} $e
|
|
assert_equal [r config get moduleconfigs.*] ""
|
|
# Asan will catch this if this string is not freed
|
|
catch {[r module loadex $testmodule CONFIG moduleconfigs.string rejectisfreed]}
|
|
assert_match {*ERR*} $e
|
|
assert_equal [r config get moduleconfigs.*] ""
|
|
# test we can't set random configs
|
|
catch {[r module loadex $testmodule CONFIG maxclients 333]}
|
|
assert_match {*ERR*} $e
|
|
assert_equal [r config get moduleconfigs.*] ""
|
|
assert_not_equal [r config get maxclients] "maxclients 333"
|
|
# test we can't set other module's configs
|
|
r module load $testmoduletwo
|
|
catch {[r module loadex $testmodule CONFIG configs.test no]}
|
|
assert_match {*ERR*} $e
|
|
assert_equal [r config get configs.test] "configs.test yes"
|
|
r module unload configs
|
|
# Verify config name and its alias being used together gets failed
|
|
catch {[r module loadex $testmodule CONFIG unprefix.numeric 1 CONFIG unprefix.numeric-alias 1]}
|
|
assert_match {*ERR*} $e
|
|
}
|
|
|
|
test {test config rewrite with dynamic load} {
|
|
#translates to: super \0secret password
|
|
r module loadex $testmodule CONFIG moduleconfigs.string \x73\x75\x70\x65\x72\x20\x00\x73\x65\x63\x72\x65\x74\x20\x70\x61\x73\x73\x77\x6f\x72\x64 ARGS
|
|
assert_not_equal [lsearch [lmap x [r module list] {dict get $x name}] moduleconfigs] -1
|
|
assert_equal [r config get moduleconfigs.string] "moduleconfigs.string {super \0secret password}"
|
|
r config set moduleconfigs.mutable_bool yes
|
|
r config set moduleconfigs.memory_numeric 750
|
|
r config set moduleconfigs.enum two
|
|
r config set moduleconfigs.flags "four two"
|
|
r config set unprefix-bool-alias no
|
|
r config set unprefix.numeric 456
|
|
r config set unprefix.string-alias "unprefix"
|
|
r config set unprefix-enum two
|
|
r config rewrite
|
|
restart_server 0 true false
|
|
# Ensure configs we rewrote are present and that the conf file is readable
|
|
assert_equal [r config get moduleconfigs.mutable_bool] "moduleconfigs.mutable_bool yes"
|
|
assert_equal [r config get moduleconfigs.memory_numeric] "moduleconfigs.memory_numeric 750"
|
|
assert_equal [r config get moduleconfigs.string] "moduleconfigs.string {super \0secret password}"
|
|
assert_equal [r config get moduleconfigs.enum] "moduleconfigs.enum two"
|
|
assert_equal [r config get moduleconfigs.flags] "moduleconfigs.flags {two four}"
|
|
assert_equal [r config get moduleconfigs.numeric] "moduleconfigs.numeric -1"
|
|
|
|
# Check unprefixed configuration and alias
|
|
assert_equal [r config get unprefix-bool] "unprefix-bool no"
|
|
assert_equal [r config get unprefix-bool-alias] "unprefix-bool-alias no"
|
|
assert_equal [r config get unprefix.numeric] "unprefix.numeric 456"
|
|
assert_equal [r config get unprefix.numeric-alias] "unprefix.numeric-alias 456"
|
|
assert_equal [r config get unprefix-string] "unprefix-string unprefix"
|
|
assert_equal [r config get unprefix.string-alias] "unprefix.string-alias unprefix"
|
|
assert_equal [r config get unprefix-enum] "unprefix-enum two"
|
|
assert_equal [r config get unprefix-enum-alias] "unprefix-enum-alias two"
|
|
|
|
r module unload moduleconfigs
|
|
}
|
|
|
|
test {test multiple modules with configs} {
|
|
r module load $testmodule
|
|
r module loadex $testmoduletwo CONFIG configs.test yes
|
|
assert_equal [r config get moduleconfigs.mutable_bool] "moduleconfigs.mutable_bool yes"
|
|
assert_equal [r config get moduleconfigs.immutable_bool] "moduleconfigs.immutable_bool no"
|
|
assert_equal [r config get moduleconfigs.memory_numeric] "moduleconfigs.memory_numeric 1024"
|
|
assert_equal [r config get moduleconfigs.string] "moduleconfigs.string {secret password}"
|
|
assert_equal [r config get moduleconfigs.enum] "moduleconfigs.enum one"
|
|
assert_equal [r config get moduleconfigs.numeric] "moduleconfigs.numeric -1"
|
|
assert_equal [r config get configs.test] "configs.test yes"
|
|
r config set moduleconfigs.mutable_bool no
|
|
r config set moduleconfigs.string nice
|
|
r config set moduleconfigs.enum two
|
|
r config set configs.test no
|
|
assert_equal [r config get moduleconfigs.mutable_bool] "moduleconfigs.mutable_bool no"
|
|
assert_equal [r config get moduleconfigs.string] "moduleconfigs.string nice"
|
|
assert_equal [r config get moduleconfigs.enum] "moduleconfigs.enum two"
|
|
assert_equal [r config get configs.test] "configs.test no"
|
|
r config rewrite
|
|
# test we can load from conf file with multiple different modules.
|
|
restart_server 0 true false
|
|
assert_equal [r config get moduleconfigs.mutable_bool] "moduleconfigs.mutable_bool no"
|
|
assert_equal [r config get moduleconfigs.string] "moduleconfigs.string nice"
|
|
assert_equal [r config get moduleconfigs.enum] "moduleconfigs.enum two"
|
|
assert_equal [r config get configs.test] "configs.test no"
|
|
r module unload moduleconfigs
|
|
r module unload configs
|
|
}
|
|
|
|
test {test 1.module load 2.config rewrite 3.module unload 4.config rewrite works} {
|
|
# Configs need to be removed from the old config file in this case.
|
|
r module loadex $testmodule CONFIG moduleconfigs.memory_numeric 500 ARGS
|
|
assert_not_equal [lsearch [lmap x [r module list] {dict get $x name}] moduleconfigs] -1
|
|
r config rewrite
|
|
r module unload moduleconfigs
|
|
r config rewrite
|
|
restart_server 0 true false
|
|
# Ensure configs we rewrote are no longer present
|
|
assert_equal [r config get moduleconfigs.*] ""
|
|
}
|
|
test {startup moduleconfigs} {
|
|
# No loadmodule directive
|
|
catch {exec src/redis-server --moduleconfigs.string "hello"} err
|
|
assert_match {*Module Configuration detected without loadmodule directive or no ApplyConfig call: aborting*} $err
|
|
|
|
# Bad config value
|
|
catch {exec src/redis-server --loadmodule "$testmodule" --moduleconfigs.string "rejectisfreed"} err
|
|
assert_match {*Issue during loading of configuration moduleconfigs.string : Cannot set string to 'rejectisfreed'*} $err
|
|
|
|
# missing LoadConfigs call
|
|
catch {exec src/redis-server --loadmodule "$testmodule" noload --moduleconfigs.string "hello"} err
|
|
assert_match {*Module Configurations were not set, likely a missing LoadConfigs call. Unloading the module.*} $err
|
|
|
|
# successful
|
|
start_server [list overrides [list loadmodule "$testmodule" moduleconfigs.string "bootedup" moduleconfigs.enum two moduleconfigs.flags "two four"]] {
|
|
assert_equal [r config get moduleconfigs.string] "moduleconfigs.string bootedup"
|
|
assert_equal [r config get moduleconfigs.mutable_bool] "moduleconfigs.mutable_bool yes"
|
|
assert_equal [r config get moduleconfigs.immutable_bool] "moduleconfigs.immutable_bool no"
|
|
assert_equal [r config get moduleconfigs.enum] "moduleconfigs.enum two"
|
|
assert_equal [r config get moduleconfigs.flags] "moduleconfigs.flags {two four}"
|
|
assert_equal [r config get moduleconfigs.numeric] "moduleconfigs.numeric -1"
|
|
assert_equal [r config get moduleconfigs.memory_numeric] "moduleconfigs.memory_numeric 1024"
|
|
|
|
# Check un-prefixed and aliased configuration
|
|
assert_equal [r config get unprefix-bool] "unprefix-bool yes"
|
|
assert_equal [r config get unprefix-bool-alias] "unprefix-bool-alias yes"
|
|
assert_equal [r config get unprefix.numeric] "unprefix.numeric -1"
|
|
assert_equal [r config get unprefix.numeric-alias] "unprefix.numeric-alias -1"
|
|
assert_equal [r config get unprefix-string] "unprefix-string {secret unprefix}"
|
|
assert_equal [r config get unprefix.string-alias] "unprefix.string-alias {secret unprefix}"
|
|
assert_equal [r config get unprefix-enum] "unprefix-enum one"
|
|
assert_equal [r config get unprefix-enum-alias] "unprefix-enum-alias one"
|
|
}
|
|
}
|
|
}
|
|
|