You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

270 lines
6.9 KiB

package config_test
import (
"testing"
"github.com/stretchr/testify/assert"
"gerrit.wikimedia.org/r/blubber/build"
"gerrit.wikimedia.org/r/blubber/config"
)
func TestArtifactsConfigYAML(t *testing.T) {
cfg, err := config.ReadYAMLConfig([]byte(`---
version: v4
base: foo
variants:
build: {}
production:
copies:
- from: build
source: /foo/src
destination: /foo/dst
- from: build
source: /bar/src
destination: /bar/dst`))
if assert.NoError(t, err) {
variant, err := config.ExpandVariant(cfg, "production")
if assert.NoError(t, err) {
assert.Len(t, variant.Copies, 2)
assert.Contains(t,
variant.Copies,
config.ArtifactsConfig{From: "build", Source: "/foo/src", Destination: "/foo/dst"},
)
assert.Contains(t,
variant.Copies,
config.ArtifactsConfig{From: "build", Source: "/bar/src", Destination: "/bar/dst"},
)
}
}
}
func TestArtifactsConfigInstructions(t *testing.T) {
cfg := config.ArtifactsConfig{
From: "foo",
Source: "/source/path",
Destination: "/destination/path",
}
t.Run("PhasePrivileged", func(t *testing.T) {
assert.Empty(t, cfg.InstructionsForPhase(build.PhasePrivileged))
})
t.Run("PhasePrivilegeDropped", func(t *testing.T) {
assert.Empty(t, cfg.InstructionsForPhase(build.PhasePrivilegeDropped))
})
t.Run("PhasePreInstall", func(t *testing.T) {
assert.Empty(t, cfg.InstructionsForPhase(build.PhasePreInstall))
})
t.Run("PhaseInstall", func(t *testing.T) {
assert.Equal(t,
[]build.Instruction{build.CopyFrom{
"foo",
build.Copy{[]string{"/source/path"}, "/destination/path"},
}},
cfg.InstructionsForPhase(build.PhaseInstall),
)
})
t.Run("PhasePostInstall", func(t *testing.T) {
assert.Empty(t, cfg.InstructionsForPhase(build.PhasePostInstall))
})
}
func TestArtifactsConfigValidation(t *testing.T) {
t.Run("from", func(t *testing.T) {
t.Run("ok", func(t *testing.T) {
_, err := config.ReadYAMLConfig([]byte(`---
version: v4
variants:
build: {}
foo:
copies:
- from: build
source: /foo
destination: /bar`))
assert.False(t, config.IsValidationError(err))
})
t.Run("missing", func(t *testing.T) {
_, err := config.ReadYAMLConfig([]byte(`---
version: v4
variants:
build: {}
foo:
copies:
- from: ~
source: /foo
destination: /bar`))
if assert.True(t, config.IsValidationError(err)) {
msg := config.HumanizeValidationError(err)
assert.Equal(t, `from: is required`, msg)
}
})
t.Run("bad", func(t *testing.T) {
_, err := config.ReadYAMLConfig([]byte(`---
version: v4
variants:
build: {}
foo:
copies:
- from: foo bar
source: /foo
destination: /bar`))
if assert.True(t, config.IsValidationError(err)) {
msg := config.HumanizeValidationError(err)
assert.Equal(t, `from: references an unknown variant "foo bar"`, msg)
}
})
})
t.Run("from: variant", func(t *testing.T) {
t.Run("source", func(t *testing.T) {
t.Run("with no destination given can be empty", func(t *testing.T) {
_, err := config.ReadYAMLConfig([]byte(`---
version: v4
variants:
build: {}
foo:
copies:
- from: build`))
assert.False(t, config.IsValidationError(err))
})
t.Run("with destination given must not be empty", func(t *testing.T) {
_, err := config.ReadYAMLConfig([]byte(`---
version: v4
variants:
build: {}
foo:
copies:
- from: build
destination: /bar`))
if assert.True(t, config.IsValidationError(err)) {
msg := config.HumanizeValidationError(err)
assert.Equal(t, `source: is required if "destination" is also set`, msg)
}
})
})
t.Run("destination", func(t *testing.T) {
t.Run("with no source given can be empty", func(t *testing.T) {
_, err := config.ReadYAMLConfig([]byte(`---
version: v4
variants:
build: {}
foo:
copies:
- from: build`))
assert.False(t, config.IsValidationError(err))
})
t.Run("with source given must not be empty", func(t *testing.T) {
_, err := config.ReadYAMLConfig([]byte(`---
version: v4
variants:
build: {}
foo:
copies:
- from: build
source: /bar`))
if assert.True(t, config.IsValidationError(err)) {
msg := config.HumanizeValidationError(err)
assert.Equal(t, `destination: is required if "source" is also set`, msg)
}
})
})
})
t.Run("from: local", func(t *testing.T) {
t.Run("source", func(t *testing.T) {
t.Run("must be a relative path", func(t *testing.T) {
_, err := config.ReadYAMLConfig([]byte(`---
version: v4
variants:
foo:
copies:
- from: local
source: /bad/path
destination: ./foo`))
if assert.True(t, config.IsValidationError(err)) {
msg := config.HumanizeValidationError(err)
assert.Equal(t, `source: path must be relative when "from" is "local"`, msg)
}
})
t.Run("must not use ../", func(t *testing.T) {
_, err := config.ReadYAMLConfig([]byte(`---
version: v4
variants:
foo:
copies:
- from: local
source: ./funny/../../business
destination: ./foo`))
if assert.True(t, config.IsValidationError(err)) {
msg := config.HumanizeValidationError(err)
assert.Equal(t, `source: path must be relative when "from" is "local"`, msg)
}
})
})
t.Run("destination", func(t *testing.T) {
t.Run("must be a relative path", func(t *testing.T) {
_, err := config.ReadYAMLConfig([]byte(`---
version: v4
variants:
foo:
copies:
- from: local
source: ./foo
destination: /bad/path`))
if assert.True(t, config.IsValidationError(err)) {
msg := config.HumanizeValidationError(err)
assert.Equal(t, `destination: path must be relative when "from" is "local"`, msg)
}
})
t.Run("must not use ../", func(t *testing.T) {
_, err := config.ReadYAMLConfig([]byte(`---
version: v4
variants:
foo:
copies:
- from: local
source: ./foo
destination: ./funny/../../business`))
if assert.True(t, config.IsValidationError(err)) {
msg := config.HumanizeValidationError(err)
assert.Equal(t, `destination: path must be relative when "from" is "local"`, msg)
}
})
})
})
}