summaryrefslogtreecommitdiff
path: root/config/reader_test.go
blob: cb187ef49d8760397bb392cc03b52a33fec6db0b (plain)
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)
		}
	}
}