github.com/hashicorp/packer@v1.14.3/hcl2template/shim/values_test.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package hcl2shim 5 6 import ( 7 "fmt" 8 "reflect" 9 "testing" 10 11 "github.com/hashicorp/packer-plugin-sdk/hcl2helper" 12 "github.com/zclconf/go-cty/cty" 13 ) 14 15 func TestConfigValueFromHCL2(t *testing.T) { 16 tests := []struct { 17 Input cty.Value 18 Want interface{} 19 }{ 20 { 21 cty.True, 22 true, 23 }, 24 { 25 cty.False, 26 false, 27 }, 28 { 29 cty.NumberIntVal(12), 30 int(12), 31 }, 32 { 33 cty.NumberFloatVal(12.5), 34 float64(12.5), 35 }, 36 { 37 cty.StringVal("hello world"), 38 "hello world", 39 }, 40 { 41 cty.ObjectVal(map[string]cty.Value{ 42 "name": cty.StringVal("Ermintrude"), 43 "age": cty.NumberIntVal(19), 44 "address": cty.ObjectVal(map[string]cty.Value{ 45 "street": cty.ListVal([]cty.Value{cty.StringVal("421 Shoreham Loop")}), 46 "city": cty.StringVal("Fridgewater"), 47 "state": cty.StringVal("MA"), 48 "zip": cty.StringVal("91037"), 49 }), 50 }), 51 map[string]interface{}{ 52 "name": "Ermintrude", 53 "age": int(19), 54 "address": map[string]interface{}{ 55 "street": []interface{}{"421 Shoreham Loop"}, 56 "city": "Fridgewater", 57 "state": "MA", 58 "zip": "91037", 59 }, 60 }, 61 }, 62 { 63 cty.MapVal(map[string]cty.Value{ 64 "foo": cty.StringVal("bar"), 65 "bar": cty.StringVal("baz"), 66 }), 67 map[string]interface{}{ 68 "foo": "bar", 69 "bar": "baz", 70 }, 71 }, 72 { 73 cty.TupleVal([]cty.Value{ 74 cty.StringVal("foo"), 75 cty.True, 76 }), 77 []interface{}{ 78 "foo", 79 true, 80 }, 81 }, 82 { 83 cty.NullVal(cty.String), 84 nil, 85 }, 86 { 87 cty.UnknownVal(cty.String), 88 hcl2helper.UnknownVariableValue, 89 }, 90 } 91 92 for _, test := range tests { 93 t.Run(fmt.Sprintf("%#v", test.Input), func(t *testing.T) { 94 got := ConfigValueFromHCL2(test.Input) 95 if !reflect.DeepEqual(got, test.Want) { 96 t.Errorf("wrong result\ninput: %#v\ngot: %#v\nwant: %#v", test.Input, got, test.Want) 97 } 98 }) 99 } 100 } 101 102 func TestWriteUnknownPlaceholderValues(t *testing.T) { 103 tests := []struct { 104 Name string 105 Input cty.Value 106 Want cty.Value 107 }{ 108 { 109 Name: "Unknown bool", 110 Input: cty.UnknownVal(cty.Bool), 111 Want: cty.False, 112 }, 113 { 114 Name: "Unknown number", 115 Input: cty.UnknownVal(cty.Number), 116 Want: cty.NumberIntVal(0), 117 }, 118 { 119 Name: "Unknown string", 120 Input: cty.UnknownVal(cty.String), 121 Want: cty.StringVal("<unknown>"), 122 }, 123 { 124 Name: "Unknown object", 125 Input: cty.UnknownVal(cty.EmptyObject), 126 Want: cty.EmptyObjectVal, 127 }, 128 { 129 Name: "Object with unknown values", 130 Input: cty.ObjectVal(map[string]cty.Value{ 131 "name": cty.UnknownVal(cty.String), 132 "address": cty.UnknownVal(cty.EmptyObject), 133 }), 134 Want: cty.ObjectVal(map[string]cty.Value{ 135 "name": cty.StringVal("<unknown>"), 136 "address": cty.EmptyObjectVal, 137 }), 138 }, 139 { 140 Name: "Empty object", 141 Input: cty.ObjectVal(map[string]cty.Value{}), 142 Want: cty.EmptyObjectVal, 143 }, 144 { 145 Name: "Unknown tuple", 146 Input: cty.UnknownVal(cty.EmptyTuple), 147 Want: cty.EmptyTupleVal, 148 }, 149 { 150 Name: "Tuple with unknown values", 151 Input: cty.TupleVal([]cty.Value{ 152 cty.UnknownVal(cty.String), 153 cty.UnknownVal(cty.Bool), 154 }), 155 Want: cty.TupleVal([]cty.Value{ 156 cty.StringVal("<unknown>"), 157 cty.False, 158 }), 159 }, 160 { 161 Name: "Empty tuple", 162 Input: cty.TupleVal([]cty.Value{}), 163 Want: cty.EmptyTupleVal, 164 }, 165 { 166 Name: "Unknown list", 167 Input: cty.UnknownVal(cty.List(cty.String)), 168 Want: cty.ListValEmpty(cty.String), 169 }, 170 { 171 Name: "List with unknown values", 172 Input: cty.ListVal([]cty.Value{ 173 cty.UnknownVal(cty.String), 174 }), 175 Want: cty.ListVal([]cty.Value{ 176 cty.StringVal("<unknown>"), 177 }), 178 }, 179 { 180 Name: "Empty list", 181 Input: cty.ListValEmpty(cty.String), 182 Want: cty.ListValEmpty(cty.String), 183 }, 184 { 185 Name: "Unknown set", 186 Input: cty.UnknownVal(cty.Set(cty.String)), 187 Want: cty.SetValEmpty(cty.String), 188 }, 189 { 190 Name: "Set with unknown values", 191 Input: cty.SetVal([]cty.Value{ 192 cty.UnknownVal(cty.String), 193 }), 194 Want: cty.SetVal([]cty.Value{ 195 cty.StringVal("<unknown>"), 196 }), 197 }, 198 { 199 Name: "Empty Set", 200 Input: cty.SetValEmpty(cty.String), 201 Want: cty.SetValEmpty(cty.String), 202 }, 203 { 204 Name: "Unknown map", 205 Input: cty.UnknownVal(cty.Map(cty.String)), 206 Want: cty.MapValEmpty(cty.String), 207 }, 208 { 209 Name: "Map with unknown values", 210 Input: cty.MapVal(map[string]cty.Value{ 211 "name": cty.UnknownVal(cty.String), 212 }), 213 Want: cty.MapVal(map[string]cty.Value{ 214 "name": cty.StringVal("<unknown>"), 215 }), 216 }, 217 { 218 Name: "Empty Map", 219 Input: cty.MapValEmpty(cty.String), 220 Want: cty.MapValEmpty(cty.String), 221 }, 222 { 223 Name: "Null val", 224 Input: cty.NullVal(cty.String), 225 Want: cty.NullVal(cty.String), 226 }, 227 } 228 229 for _, test := range tests { 230 t.Run(t.Name(), func(t *testing.T) { 231 got := WriteUnknownPlaceholderValues(test.Input) 232 if got.Equals(test.Want).False() { 233 t.Errorf("wrong result\ninput: %#v\ngot: %#v\nwant: %#v", test.Input, got, test.Want) 234 } 235 }) 236 } 237 }