package config_test import ( "testing" "github.com/stretchr/testify/assert" "gerrit.wikimedia.org/r/blubber/build" "gerrit.wikimedia.org/r/blubber/config" ) func TestRunsConfigYAML(t *testing.T) { cfg, err := config.ReadYAMLConfig([]byte(`--- version: v4 base: foo runs: as: someuser insecurely: true uid: 666 gid: 777 environment: { FOO: bar } variants: development: {}`)) assert.Nil(t, err) variant, err := config.ExpandVariant(cfg, "development") assert.Nil(t, err) assert.Equal(t, "someuser", variant.Runs.As) assert.Equal(t, true, variant.Runs.Insecurely.True) assert.Equal(t, uint(666), variant.Runs.UID) assert.Equal(t, uint(777), variant.Runs.GID) assert.Equal(t, map[string]string{"FOO": "bar"}, variant.Runs.Environment) } func TestRunsConfigInstructions(t *testing.T) { cfg := config.RunsConfig{ UserConfig: config.UserConfig{ As: "someuser", UID: 666, GID: 777, }, Environment: map[string]string{ "fooname": "foovalue", "barname": "barvalue", }, } t.Run("PhasePrivileged", func(t *testing.T) { assert.Equal(t, []build.Instruction{build.RunAll{[]build.Run{ {"groupadd -o -g %s -r", []string{"777", "someuser"}}, {"useradd -o -m -d %s -r -g %s -u %s", []string{"/home/someuser", "someuser", "666", "someuser"}}, }}}, cfg.InstructionsForPhase(build.PhasePrivileged), ) }) t.Run("PhasePrivilegeDropped", func(t *testing.T) { assert.Equal(t, []build.Instruction{ build.Env{map[string]string{"barname": "barvalue", "fooname": "foovalue"}}, }, cfg.InstructionsForPhase(build.PhasePrivilegeDropped), ) t.Run("with empty Environment", func(t *testing.T) { cfg.Environment = map[string]string{} assert.Empty(t, cfg.InstructionsForPhase(build.PhasePrivilegeDropped)) }) }) t.Run("PhasePreInstall", func(t *testing.T) { assert.Empty(t, cfg.InstructionsForPhase(build.PhasePreInstall)) }) t.Run("PhasePostInstall", func(t *testing.T) { assert.Empty(t, cfg.InstructionsForPhase(build.PhasePostInstall)) }) } func TestRunsConfigValidation(t *testing.T) { t.Run("environment", func(t *testing.T) { t.Run("ok", func(t *testing.T) { err := config.Validate(config.RunsConfig{ Environment: map[string]string{ "foo": "bar", "f1oo": "bar", "FOO": "bar", "foo_fighter": "bar", "FOO_FIGHTER": "bar", "_FOO_FIGHTER": "bar", }, }) assert.False(t, config.IsValidationError(err)) }) t.Run("optional", func(t *testing.T) { err := config.Validate(config.RunsConfig{}) assert.False(t, config.IsValidationError(err)) }) t.Run("bad", func(t *testing.T) { t.Run("spaces", func(t *testing.T) { err := config.Validate(config.RunsConfig{ Environment: map[string]string{ "foo fighter": "bar", }, }) if assert.True(t, config.IsValidationError(err)) { msg := config.HumanizeValidationError(err) assert.Equal(t, `environment: contains invalid environment variable names`, msg) } }) t.Run("dashes", func(t *testing.T) { err := config.Validate(config.RunsConfig{ Environment: map[string]string{ "foo-fighter": "bar", }, }) if assert.True(t, config.IsValidationError(err)) { msg := config.HumanizeValidationError(err) assert.Equal(t, `environment: contains invalid environment variable names`, msg) } }) t.Run("dots", func(t *testing.T) { err := config.Validate(config.RunsConfig{ Environment: map[string]string{ "foo.fighter": "bar", }, }) if assert.True(t, config.IsValidationError(err)) { msg := config.HumanizeValidationError(err) assert.Equal(t, `environment: contains invalid environment variable names`, msg) } }) t.Run("starts with number", func(t *testing.T) { err := config.Validate(config.RunsConfig{ Environment: map[string]string{ "1foo": "bar", }, }) if assert.True(t, config.IsValidationError(err)) { msg := config.HumanizeValidationError(err) assert.Equal(t, `environment: contains invalid environment variable names`, msg) } }) }) }) }