func (s *S) TestUnmarshalErrors(c *C) { for _, item := range unmarshalErrorTests { var value interface{} err := goyaml.Unmarshal([]byte(item.data), &value) c.Assert(err, ErrorMatches, item.error, Commentf("Partial unmarshal: %#v", value)) } }
func (s *S) TestUnmarshal(c *C) { for i, item := range unmarshalTests { t := reflect.ValueOf(item.value).Type() var value interface{} switch t.Kind() { case reflect.Map: value = reflect.MakeMap(t).Interface() case reflect.String: t := reflect.ValueOf(item.value).Type() v := reflect.New(t) value = v.Interface() default: pt := reflect.ValueOf(item.value).Type() pv := reflect.New(pt.Elem()) value = pv.Interface() } err := goyaml.Unmarshal([]byte(item.data), value) c.Assert(err, IsNil, Commentf("Item #%d", i)) if t.Kind() == reflect.String { c.Assert(*value.(*string), Equals, item.value, Commentf("Item #%d", i)) } else { c.Assert(value, DeepEquals, item.value, Commentf("Item #%d", i)) } } }
func (s *S) TestUnmarshalWholeDocumentWithSetter(c *C) { obj := &typeWithSetter{} err := goyaml.Unmarshal([]byte(setterTests[0].data), obj) c.Assert(err, IsNil) c.Assert(obj.tag, Equals, setterTests[0].tag) value, ok := obj.value.(map[interface{}]interface{}) c.Assert(ok, Equals, true) c.Assert(value["_"], DeepEquals, setterTests[0].value) }
// NewCloudConfig instantiates a new CloudConfig from the given contents (a // string of YAML), returning any error encountered. It will ignore unknown // fields but log encountering them. func NewCloudConfig(contents string) (*CloudConfig, error) { var cfg CloudConfig err := goyaml.Unmarshal([]byte(contents), &cfg) if err != nil { return &cfg, err } warnOnUnrecognizedKeys(contents, log.Printf) return &cfg, nil }
func (s *S) TestUnmarshalWithSetter(c *C) { for _, item := range setterTests { obj := &typeWithSetterField{} err := goyaml.Unmarshal([]byte(item.data), obj) c.Assert(err, IsNil) c.Assert(obj.Field, NotNil, Commentf("Pointer not initialized (%#v)", item.value)) c.Assert(obj.Field.tag, Equals, item.tag) c.Assert(obj.Field.value, DeepEquals, item.value) } }
func (s *S) TestUnmarshalWithFalseSetterIgnoresValue(c *C) { setterResult[2] = false setterResult[4] = false defer func() { delete(setterResult, 2) delete(setterResult, 4) }() m := map[string]*typeWithSetter{} data := "{abc: 1, def: 2, ghi: 3, jkl: 4}" err := goyaml.Unmarshal([]byte(data), m) c.Assert(err, IsNil) c.Assert(m["abc"], NotNil) c.Assert(m["def"], IsNil) c.Assert(m["ghi"], NotNil) c.Assert(m["jkl"], IsNil) c.Assert(m["abc"].value, Equals, 1) c.Assert(m["ghi"].value, Equals, 3) }
func (s *S) TestUnmarshalNaN(c *C) { value := map[string]interface{}{} err := goyaml.Unmarshal([]byte("notanum: .NaN"), &value) c.Assert(err, IsNil) c.Assert(math.IsNaN(value["notanum"].(float64)), Equals, true) }
// warnOnUnrecognizedKeys parses the contents of a cloud-config file and calls // warn(msg, key) for every unrecognized key (i.e. those not present in CloudConfig) func warnOnUnrecognizedKeys(contents string, warn warner) { // Generate a map of all understood cloud config options var cc map[string]interface{} b, _ := goyaml.Marshal(&CloudConfig{}) goyaml.Unmarshal(b, &cc) // Now unmarshal the entire provided contents var c map[string]interface{} goyaml.Unmarshal([]byte(contents), &c) // Check that every key in the contents exists in the cloud config for k, _ := range c { if _, ok := cc[k]; !ok { warn("Warning: unrecognized key %q in provided cloud config - ignoring section", k) } } // Check for unrecognized coreos options, if any are set if coreos, ok := c["coreos"]; ok { if set, ok := coreos.(map[interface{}]interface{}); ok { known := cc["coreos"].(map[interface{}]interface{}) for k, _ := range set { if key, ok := k.(string); ok { if _, ok := known[key]; !ok { warn("Warning: unrecognized key %q in coreos section of provided cloud config - ignoring", key) } } else { warn("Warning: unrecognized key %q in coreos section of provided cloud config - ignoring", k) } } } } // Check for any badly-specified users, if any are set if users, ok := c["users"]; ok { var known map[string]interface{} b, _ := goyaml.Marshal(&system.User{}) goyaml.Unmarshal(b, &known) if set, ok := users.([]interface{}); ok { for _, u := range set { if user, ok := u.(map[interface{}]interface{}); ok { for k, _ := range user { if key, ok := k.(string); ok { if _, ok := known[key]; !ok { warn("Warning: unrecognized key %q in user section of cloud config - ignoring", key) } } else { warn("Warning: unrecognized key %q in user section of cloud config - ignoring", k) } } } } } } // Check for any badly-specified files, if any are set if files, ok := c["write_files"]; ok { var known map[string]interface{} b, _ := goyaml.Marshal(&system.File{}) goyaml.Unmarshal(b, &known) if set, ok := files.([]interface{}); ok { for _, f := range set { if file, ok := f.(map[interface{}]interface{}); ok { for k, _ := range file { if key, ok := k.(string); ok { if _, ok := known[key]; !ok { warn("Warning: unrecognized key %q in file section of cloud config - ignoring", key) } } else { warn("Warning: unrecognized key %q in file section of cloud config - ignoring", k) } } } } } } }