115 lines
2.7 KiB
Go
115 lines
2.7 KiB
Go
// Copyright The OpenTelemetry Authors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package memorylimiter
|
|
|
|
import (
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"go.opentelemetry.io/collector/confmap/confmaptest"
|
|
)
|
|
|
|
func TestUnmarshalConfig(t *testing.T) {
|
|
cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml"))
|
|
require.NoError(t, err)
|
|
cfg := &Config{}
|
|
assert.NoError(t, cm.Unmarshal(&cfg))
|
|
assert.Equal(t,
|
|
&Config{
|
|
CheckInterval: 5 * time.Second,
|
|
MemoryLimitMiB: 4000,
|
|
MemorySpikeLimitMiB: 500,
|
|
}, cfg)
|
|
}
|
|
|
|
func TestConfigValidate(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
cfg *Config
|
|
err error
|
|
}{
|
|
{
|
|
name: "valid",
|
|
cfg: &Config{
|
|
MemoryLimitMiB: 5722,
|
|
MemorySpikeLimitMiB: 1907,
|
|
CheckInterval: 100 * time.Millisecond,
|
|
},
|
|
err: nil,
|
|
},
|
|
{
|
|
name: "zero check interval",
|
|
cfg: &Config{
|
|
CheckInterval: 0,
|
|
},
|
|
err: errCheckIntervalOutOfRange,
|
|
},
|
|
{
|
|
name: "unset memory limit",
|
|
cfg: &Config{
|
|
CheckInterval: 1 * time.Second,
|
|
MemoryLimitMiB: 0,
|
|
MemoryLimitPercentage: 0,
|
|
},
|
|
err: errLimitOutOfRange,
|
|
},
|
|
{
|
|
name: "invalid memory spike limit",
|
|
cfg: &Config{
|
|
CheckInterval: 1 * time.Second,
|
|
MemoryLimitMiB: 10,
|
|
MemorySpikeLimitMiB: 10,
|
|
},
|
|
err: errSpikeLimitOutOfRange,
|
|
},
|
|
{
|
|
name: "invalid memory percentage limit",
|
|
cfg: &Config{
|
|
CheckInterval: 1 * time.Second,
|
|
MemoryLimitPercentage: 101,
|
|
},
|
|
err: errLimitPercentageOutOfRange,
|
|
},
|
|
{
|
|
name: "invalid memory spike percentage limit",
|
|
cfg: &Config{
|
|
CheckInterval: 1 * time.Second,
|
|
MemoryLimitPercentage: 50,
|
|
MemorySpikePercentage: 60,
|
|
},
|
|
err: errSpikeLimitPercentageOutOfRange,
|
|
},
|
|
{
|
|
name: "invalid gc intervals",
|
|
cfg: &Config{
|
|
CheckInterval: 100 * time.Millisecond,
|
|
MinGCIntervalWhenSoftLimited: 50 * time.Millisecond,
|
|
MinGCIntervalWhenHardLimited: 100 * time.Millisecond,
|
|
MemoryLimitMiB: 5722,
|
|
MemorySpikeLimitMiB: 1907,
|
|
},
|
|
err: errInconsistentGCMinInterval,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
err := tt.cfg.Validate()
|
|
assert.Equal(t, tt.err, err)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestUnmarshalInvalidConfig(t *testing.T) {
|
|
cm, err := confmaptest.LoadConf(filepath.Join("testdata", "negative_unsigned_limits_config.yaml"))
|
|
require.NoError(t, err)
|
|
cfg := &Config{}
|
|
err = cm.Unmarshal(&cfg)
|
|
require.ErrorContains(t, err, "'limit_mib' cannot parse value as 'uint32': -2000 overflows uint")
|
|
require.ErrorContains(t, err, "'spike_limit_mib' cannot parse value as 'uint32': -2300 overflows uint")
|
|
}
|