func TestConfigFieldReader_ComputedSet(t *testing.T) { schema := map[string]*Schema{ "strSet": &Schema{ Type: TypeSet, Elem: &Schema{Type: TypeString}, Set: func(v interface{}) int { return hashcode.String(v.(string)) }, }, } cases := map[string]struct { Addr []string Result FieldReadResult Config *terraform.ResourceConfig Err bool }{ "set, normal": { []string{"strSet"}, FieldReadResult{ Value: map[int]interface{}{ 2356372769: "foo", }, Exists: true, Computed: false, }, testConfig(t, map[string]interface{}{ "strSet": []interface{}{"foo"}, }), false, }, "set, computed element": { []string{"strSet"}, FieldReadResult{ Value: nil, Exists: true, Computed: true, }, testConfigInterpolate(t, map[string]interface{}{ "strSet": []interface{}{"${var.foo}"}, }, map[string]ast.Variable{ "var.foo": ast.Variable{ Value: config.UnknownVariableValue, Type: ast.TypeString, }, }), false, }, "set, computed element substring": { []string{"strSet"}, FieldReadResult{ Value: nil, Exists: true, Computed: true, }, testConfigInterpolate(t, map[string]interface{}{ "strSet": []interface{}{"${var.foo}/32"}, }, map[string]ast.Variable{ "var.foo": ast.Variable{ Value: config.UnknownVariableValue, Type: ast.TypeString, }, }), false, }, } for name, tc := range cases { r := &ConfigFieldReader{ Schema: schema, Config: tc.Config, } out, err := r.ReadField(tc.Addr) if (err != nil) != tc.Err { t.Fatalf("%s: err: %s", name, err) } if s, ok := out.Value.(*Set); ok { // If it is a set, convert to the raw map out.Value = s.m if len(s.m) == 0 { out.Value = nil } } if !reflect.DeepEqual(tc.Result, out) { t.Fatalf("%s: bad: %#v", name, out) } } }
// HashString hashes strings. If you want a Set of strings, this is the // SchemaSetFunc you want. func HashString(v interface{}) int { return hashcode.String(v.(string)) }