| // Copyright (c) HashiCorp, Inc. |
| // SPDX-License-Identifier: MPL-2.0 |
| |
| package configutil |
| |
| import ( |
| "testing" |
| |
| "github.com/stretchr/testify/require" |
| ) |
| |
| type mapValue[T any] struct { |
| Value T |
| IsFound bool |
| } |
| |
| type expectedLogFields struct { |
| File mapValue[string] |
| Format mapValue[string] |
| Level mapValue[string] |
| RotateBytes mapValue[int] |
| RotateDuration mapValue[string] |
| RotateMaxFiles mapValue[int] |
| } |
| |
| // TestSharedConfig_Sanitized_LogFields ensures that 'log related' shared config |
| // is sanitized as expected. |
| func TestSharedConfig_Sanitized_LogFields(t *testing.T) { |
| tests := map[string]struct { |
| Value *SharedConfig |
| IsNil bool |
| Expected expectedLogFields |
| }{ |
| "nil": { |
| Value: nil, |
| IsNil: true, |
| }, |
| "empty": { |
| Value: &SharedConfig{}, |
| IsNil: false, |
| Expected: expectedLogFields{ |
| Format: mapValue[string]{IsFound: true, Value: ""}, |
| Level: mapValue[string]{IsFound: true, Value: ""}, |
| }, |
| }, |
| "only-log-level-and-format": { |
| Value: &SharedConfig{ |
| LogFormat: "json", |
| LogLevel: "warn", |
| }, |
| IsNil: false, |
| Expected: expectedLogFields{ |
| Format: mapValue[string]{IsFound: true, Value: "json"}, |
| Level: mapValue[string]{IsFound: true, Value: "warn"}, |
| }, |
| }, |
| "valid-log-fields": { |
| Value: &SharedConfig{ |
| LogFile: "vault.log", |
| LogFormat: "json", |
| LogLevel: "warn", |
| LogRotateBytes: 1024, |
| LogRotateDuration: "30m", |
| LogRotateMaxFiles: -1, |
| }, |
| IsNil: false, |
| Expected: expectedLogFields{ |
| File: mapValue[string]{IsFound: true, Value: "vault.log"}, |
| Format: mapValue[string]{IsFound: true, Value: "json"}, |
| Level: mapValue[string]{IsFound: true, Value: "warn"}, |
| RotateBytes: mapValue[int]{IsFound: true, Value: 1024}, |
| RotateDuration: mapValue[string]{IsFound: true, Value: "30m"}, |
| RotateMaxFiles: mapValue[int]{IsFound: true, Value: -1}, |
| }, |
| }, |
| } |
| |
| for name, tc := range tests { |
| name := name |
| tc := tc |
| t.Run(name, func(t *testing.T) { |
| cfg := tc.Value.Sanitized() |
| switch { |
| case tc.IsNil: |
| require.Nil(t, cfg) |
| default: |
| require.NotNil(t, cfg) |
| |
| // Log file |
| val, found := cfg["log_file"] |
| switch { |
| case tc.Expected.File.IsFound: |
| require.True(t, found) |
| require.NotNil(t, val) |
| require.Equal(t, tc.Expected.File.Value, val) |
| default: |
| require.Nil(t, val) |
| } |
| |
| // Log format |
| val, found = cfg["log_format"] |
| switch { |
| case tc.Expected.Format.IsFound: |
| require.True(t, found) |
| require.NotNil(t, val) |
| require.Equal(t, tc.Expected.Format.Value, val) |
| default: |
| require.Nil(t, val) |
| } |
| |
| // Log level |
| val, found = cfg["log_level"] |
| switch { |
| case tc.Expected.Level.IsFound: |
| require.True(t, found) |
| require.NotNil(t, val) |
| require.Equal(t, tc.Expected.Level.Value, val) |
| default: |
| require.Nil(t, val) |
| } |
| |
| // Log rotate bytes |
| val, found = cfg["log_rotate_bytes"] |
| switch { |
| case tc.Expected.RotateBytes.IsFound: |
| require.True(t, found) |
| require.NotNil(t, val) |
| require.Equal(t, tc.Expected.RotateBytes.Value, val) |
| default: |
| require.Nil(t, val) |
| } |
| |
| // Log rotate duration |
| val, found = cfg["log_rotate_duration"] |
| switch { |
| case tc.Expected.RotateDuration.IsFound: |
| require.True(t, found) |
| require.NotNil(t, val) |
| require.Equal(t, tc.Expected.RotateDuration.Value, val) |
| default: |
| require.Nil(t, val) |
| } |
| |
| // Log rotate max files |
| val, found = cfg["log_rotate_max_files"] |
| switch { |
| case tc.Expected.RotateMaxFiles.IsFound: |
| require.True(t, found) |
| require.NotNil(t, val) |
| require.Equal(t, tc.Expected.RotateMaxFiles.Value, val) |
| default: |
| require.Nil(t, val) |
| } |
| } |
| }) |
| } |
| } |