1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
package config_test
import (
"fmt"
"testing"
"github.com/stretchr/testify/assert"
"phabricator.wikimedia.org/source/blubber/config"
)
func ExampleResolveIncludes() {
cfg, _ := config.ReadConfig([]byte(`---
version: v2
variants:
varA: { includes: [varB, varC] }
varB: { includes: [varD, varE] }
varC: {}
varD: { includes: [varF] }
varE: {}
varF: {}`))
includes, _ := config.ResolveIncludes(cfg, "varA")
fmt.Printf("%v\n", includes)
// Output: [varF varD varE varB varC varA]
}
func TestReadConfigErrorsOnUnknownYAML(t *testing.T) {
_, err := config.ReadConfig([]byte(`---
version: v2
newphone: whodis
variants:
foo: {}`))
assert.EqualError(t,
err,
"yaml: unmarshal errors:\n"+
" line 2: field newphone not found in struct config.Config",
)
}
func TestReadConfigValidateVersionBeforeStrictUnmarshal(t *testing.T) {
_, err := config.ReadConfig([]byte(`---
version: foo
newphone: whodis
variants:
foo: {}`))
if assert.True(t, config.IsValidationError(err)) {
msg := config.HumanizeValidationError(err)
assert.Equal(t, `version: config version "foo" is unsupported`, msg)
}
}
func TestResolveIncludesPreventsInfiniteRecursion(t *testing.T) {
cfg, err := config.ReadConfig([]byte(`---
version: v2
variants:
varA: { includes: [varB] }
varB: { includes: [varA] }`))
assert.NoError(t, err)
_, err2 := config.ResolveIncludes(cfg, "varA")
assert.EqualError(t, err2, "variant expansion detected loop")
}
func TestMultiLevelIncludes(t *testing.T) {
cfg, err := config.ReadConfig([]byte(`---
version: v2
base: foo-slim
variants:
build:
base: foo-devel
runs: { as: foo }
development:
includes: [build]
runs: { uid: 123 }
test:
includes: [development]
runs: { insecurely: true }`))
if assert.NoError(t, err) {
dev, _ := config.ExpandVariant(cfg, "development")
assert.Equal(t, "foo-devel", dev.Base)
assert.Equal(t, "foo", dev.Runs.As)
assert.Equal(t, uint(123), dev.Runs.UID)
test, _ := config.ExpandVariant(cfg, "test")
assert.Equal(t, "foo-devel", test.Base)
assert.Equal(t, "foo", test.Runs.As)
assert.Equal(t, uint(123), test.Runs.UID)
assert.True(t, test.Runs.Insecurely.True)
}
}
func TestMultiIncludes(t *testing.T) {
cfg, err := config.ReadConfig([]byte(`---
version: v2
variants:
mammal:
base: neutral
human:
base: moral
includes: [mammal]
lizard:
base: immoral
lizardman:
includes: [human, lizard]`))
if assert.NoError(t, err) {
variant, err := config.ExpandVariant(cfg, "lizardman")
if assert.NoError(t, err) {
assert.Equal(t, "immoral", variant.Base)
}
}
}
|