Commit d09dba06 authored by Joshua Gutow's avatar Joshua Gutow

op-service: Add unit tests for ValidateEnvVars

parent 8bfe089a
...@@ -25,14 +25,25 @@ func PrefixEnvVar(prefix, suffix string) string { ...@@ -25,14 +25,25 @@ func PrefixEnvVar(prefix, suffix string) string {
// actual env var with that name. // actual env var with that name.
// It helps validate that the supplied env vars are in fact valid. // It helps validate that the supplied env vars are in fact valid.
func ValidateEnvVars(prefix string, flags []cli.Flag, log log.Logger) { func ValidateEnvVars(prefix string, flags []cli.Flag, log log.Logger) {
envVars := make(map[string]struct{}) for _, envVar := range validateEnvVars(prefix, os.Environ(), cliFlagsToEnvVars(flags)) {
log.Warn("Unknown env var", "prefix", prefix, "env_var", envVar)
}
}
func cliFlagsToEnvVars(flags []cli.Flag) map[string]struct{} {
definedEnvVars := make(map[string]struct{})
for _, flag := range flags { for _, flag := range flags {
envVarField := reflect.ValueOf(flag).FieldByName("EnvVar") envVarField := reflect.ValueOf(flag).FieldByName("EnvVar")
if envVarField.IsValid() { if envVarField.IsValid() {
envVars[envVarField.String()] = struct{}{} definedEnvVars[envVarField.String()] = struct{}{}
} }
} }
providedEnvVars := os.Environ() return definedEnvVars
}
// validateEnvVars returns a list of the unknown environment variables that match the prefix.
func validateEnvVars(prefix string, providedEnvVars []string, definedEnvVars map[string]struct{}) []string {
var out []string
for _, envVar := range providedEnvVars { for _, envVar := range providedEnvVars {
parts := strings.Split(envVar, "=") parts := strings.Split(envVar, "=")
if len(parts) == 0 { if len(parts) == 0 {
...@@ -40,11 +51,12 @@ func ValidateEnvVars(prefix string, flags []cli.Flag, log log.Logger) { ...@@ -40,11 +51,12 @@ func ValidateEnvVars(prefix string, flags []cli.Flag, log log.Logger) {
} }
key := parts[0] key := parts[0]
if strings.HasPrefix(key, prefix) { if strings.HasPrefix(key, prefix) {
if _, ok := envVars[key]; !ok { if _, ok := definedEnvVars[key]; !ok {
log.Warn("Unknown env var", "prefix", prefix, "env_var", envVar) out = append(out, envVar)
} }
} }
} }
return out
} }
// ParseAddress parses an ETH address from a hex string. This method will fail if // ParseAddress parses an ETH address from a hex string. This method will fail if
......
package op_service
import (
"testing"
"github.com/stretchr/testify/require"
"github.com/urfave/cli"
)
func TestCLIFlagsToEnvVars(t *testing.T) {
flags := []cli.Flag{
cli.StringFlag{
Name: "test",
EnvVar: "OP_NODE_TEST_VAR",
},
cli.IntFlag{
Name: "no env var",
},
}
res := cliFlagsToEnvVars(flags)
require.Contains(t, res, "OP_NODE_TEST_VAR")
}
func TestValidateEnvVars(t *testing.T) {
provided := []string{"OP_BATCHER_CONFIG=true", "OP_BATCHER_FAKE=false", "LD_PRELOAD=/lib/fake.so"}
defined := map[string]struct{}{
"OP_BATCHER_CONFIG": {},
"OP_BATCHER_OTHER": {},
}
invalids := validateEnvVars("OP_BATCHER", provided, defined)
require.ElementsMatch(t, invalids, []string{"OP_BATCHER_FAKE=false"})
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment