package config_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"gerrit.wikimedia.org/r/blubber/build"
|
|
"gerrit.wikimedia.org/r/blubber/config"
|
|
)
|
|
|
|
func TestLivesConfigYAML(t *testing.T) {
|
|
cfg, err := config.ReadYAMLConfig([]byte(`---
|
|
version: v4
|
|
base: foo
|
|
lives:
|
|
in: /some/directory
|
|
as: foouser
|
|
uid: 123
|
|
gid: 223
|
|
variants:
|
|
development: {}`))
|
|
|
|
if assert.NoError(t, err) {
|
|
assert.Equal(t, "/some/directory", cfg.Lives.In)
|
|
assert.Equal(t, "foouser", cfg.Lives.As)
|
|
assert.Equal(t, uint(123), cfg.Lives.UID)
|
|
assert.Equal(t, uint(223), cfg.Lives.GID)
|
|
|
|
variant, err := config.ExpandVariant(cfg, "development")
|
|
|
|
if assert.NoError(t, err) {
|
|
assert.Equal(t, "/some/directory", variant.Lives.In)
|
|
assert.Equal(t, "foouser", variant.Lives.As)
|
|
assert.Equal(t, uint(123), variant.Lives.UID)
|
|
assert.Equal(t, uint(223), variant.Lives.GID)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestLivesConfigDefaults(t *testing.T) {
|
|
cfg, err := config.ReadYAMLConfig([]byte(`---
|
|
version: v4
|
|
base: foo`))
|
|
|
|
if assert.NoError(t, err) {
|
|
assert.Equal(t, "somebody", cfg.Lives.As)
|
|
assert.Equal(t, uint(65533), cfg.Lives.UID)
|
|
assert.Equal(t, uint(65533), cfg.Lives.GID)
|
|
}
|
|
}
|
|
|
|
func TestLivesConfigInstructions(t *testing.T) {
|
|
cfg := config.LivesConfig{
|
|
In: "/some/directory",
|
|
UserConfig: config.UserConfig{
|
|
As: "foouser",
|
|
UID: 123,
|
|
GID: 223,
|
|
},
|
|
}
|
|
|
|
t.Run("PhasePrivileged", func(t *testing.T) {
|
|
assert.Equal(t,
|
|
[]build.Instruction{build.RunAll{[]build.Run{
|
|
{"groupadd -o -g %s -r", []string{"223", "foouser"}},
|
|
{"useradd -o -m -d %s -r -g %s -u %s", []string{"/home/foouser", "foouser", "123", "foouser"}},
|
|
{"mkdir -p", []string{"/some/directory"}},
|
|
{"chown %s:%s", []string{"123", "223", "/some/directory"}},
|
|
{"mkdir -p", []string{"/opt/lib"}},
|
|
{"chown %s:%s", []string{"123", "223", "/opt/lib"}},
|
|
}}},
|
|
cfg.InstructionsForPhase(build.PhasePrivileged),
|
|
)
|
|
})
|
|
|
|
t.Run("PhasePrivilegeDropped", func(t *testing.T) {
|
|
assert.Equal(t,
|
|
[]build.Instruction{
|
|
build.WorkingDirectory{"/some/directory"},
|
|
},
|
|
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 TestLivesConfigValidation(t *testing.T) {
|
|
t.Run("in", func(t *testing.T) {
|
|
t.Run("ok", func(t *testing.T) {
|
|
err := config.Validate(config.LivesConfig{
|
|
In: "/foo",
|
|
})
|
|
|
|
assert.False(t, config.IsValidationError(err))
|
|
})
|
|
|
|
t.Run("optional", func(t *testing.T) {
|
|
err := config.Validate(config.LivesConfig{})
|
|
|
|
assert.False(t, config.IsValidationError(err))
|
|
})
|
|
|
|
t.Run("non-root", func(t *testing.T) {
|
|
err := config.Validate(config.LivesConfig{
|
|
In: "/",
|
|
})
|
|
|
|
if assert.True(t, config.IsValidationError(err)) {
|
|
msg := config.HumanizeValidationError(err)
|
|
|
|
assert.Equal(t, `in: "/" is not a valid absolute non-root path`, msg)
|
|
}
|
|
})
|
|
|
|
t.Run("non-root tricky", func(t *testing.T) {
|
|
err := config.Validate(config.LivesConfig{
|
|
In: "/foo/..",
|
|
})
|
|
|
|
if assert.True(t, config.IsValidationError(err)) {
|
|
msg := config.HumanizeValidationError(err)
|
|
|
|
assert.Equal(t, `in: "/foo/.." is not a valid absolute non-root path`, msg)
|
|
}
|
|
})
|
|
|
|
t.Run("absolute", func(t *testing.T) {
|
|
err := config.Validate(config.LivesConfig{
|
|
In: "foo/bar",
|
|
})
|
|
|
|
if assert.True(t, config.IsValidationError(err)) {
|
|
msg := config.HumanizeValidationError(err)
|
|
|
|
assert.Equal(t, `in: "foo/bar" is not a valid absolute non-root path`, msg)
|
|
}
|
|
})
|
|
})
|
|
}
|