frostfs-node/cmd/neofs-node/config/cast_test.go
Evgenii Stratonikov aba09bb853 [#903] config: support floating-point sizes
Rounding is done using the suffix boundary (i.e. floating point value
with `gb` suffix will return size which is an integer number of
megabytes).

Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
2021-11-16 12:43:55 +03:00

139 lines
3.7 KiB
Go

package config_test
import (
"testing"
"time"
"github.com/nspcc-dev/neofs-node/cmd/neofs-node/config"
configtest "github.com/nspcc-dev/neofs-node/cmd/neofs-node/config/test"
"github.com/stretchr/testify/require"
)
func TestStringSlice(t *testing.T) {
configtest.ForEachFileType("test/config", func(c *config.Config) {
cStringSlice := c.Sub("string_slice")
val := config.StringSlice(cStringSlice, "empty")
require.Empty(t, val)
val = config.StringSlice(cStringSlice, "filled")
require.Equal(t, []string{
"string1",
"string2",
}, val)
require.Panics(t, func() {
config.StringSlice(cStringSlice, "incorrect")
})
val = config.StringSliceSafe(cStringSlice, "incorrect")
require.Nil(t, val)
})
}
func TestString(t *testing.T) {
configtest.ForEachFileType("test/config", func(c *config.Config) {
c = c.Sub("string")
val := config.String(c, "correct")
require.Equal(t, "some string", val)
require.Panics(t, func() {
config.String(c, "incorrect")
})
val = config.StringSafe(c, "incorrect")
require.Empty(t, val)
})
}
func TestDuration(t *testing.T) {
configtest.ForEachFileType("test/config", func(c *config.Config) {
c = c.Sub("duration")
val := config.Duration(c, "correct")
require.Equal(t, 15*time.Minute, val)
require.Panics(t, func() {
config.Duration(c, "incorrect")
})
val = config.DurationSafe(c, "incorrect")
require.Equal(t, time.Duration(0), val)
})
}
func TestBool(t *testing.T) {
configtest.ForEachFileType("test/config", func(c *config.Config) {
c = c.Sub("bool")
val := config.Bool(c, "correct")
require.Equal(t, true, val)
val = config.Bool(c, "correct_string")
require.Equal(t, true, val)
require.Panics(t, func() {
config.Bool(c, "incorrect")
})
val = config.BoolSafe(c, "incorrect")
require.Equal(t, false, val)
})
}
func TestNumbers(t *testing.T) {
configtest.ForEachFileType("test/config", func(c *config.Config) {
c = c.Sub("number")
const (
intPos = "int_pos"
intNeg = "int_neg"
fractPos = "fract_pos"
fractNeg = "fract_neg"
incorrect = "incorrect"
)
require.EqualValues(t, 1, config.Int(c, intPos))
require.EqualValues(t, 1, config.Uint(c, intPos))
require.EqualValues(t, -1, config.Int(c, intNeg))
require.Panics(t, func() { config.Uint(c, intNeg) })
require.EqualValues(t, 2, config.Int(c, fractPos))
require.EqualValues(t, 2, config.Uint(c, fractPos))
require.EqualValues(t, -2, config.Int(c, fractNeg))
require.Panics(t, func() { config.Uint(c, fractNeg) })
require.Panics(t, func() { config.Int(c, incorrect) })
require.Panics(t, func() { config.Uint(c, incorrect) })
require.Zero(t, config.IntSafe(c, incorrect))
require.Zero(t, config.UintSafe(c, incorrect))
})
}
func TestSizeInBytes(t *testing.T) {
const (
kb = 1024
mb = 1024 * kb
gb = 1024 * mb
tb = 1024 * gb
)
configtest.ForEachFileType("test/config", func(c *config.Config) {
c = c.Sub("sizes")
require.EqualValues(t, kb, config.SizeInBytesSafe(c, "size_kb"))
require.EqualValues(t, 2*kb, config.SizeInBytesSafe(c, "size_kb_no_space"))
require.EqualValues(t, 12*mb, config.SizeInBytesSafe(c, "size_mb"))
require.EqualValues(t, 4*gb, config.SizeInBytesSafe(c, "size_gb"))
require.EqualValues(t, 5*tb, config.SizeInBytesSafe(c, "size_tb"))
require.EqualValues(t, 12, config.SizeInBytesSafe(c, "size_i_am_not_very_clever"))
require.EqualValues(t, tb/2, config.SizeInBytesSafe(c, "size_float"))
require.EqualValues(t, uint64(14*gb+(gb*123/1000/mb*mb)), config.SizeInBytesSafe(c, "size_float_big"))
require.EqualValues(t, 2048, config.SizeInBytesSafe(c, "size_bytes"))
require.EqualValues(t, 123456, config.SizeInBytesSafe(c, "size_bytes_no_suffix"))
})
}