func (s *S) TestMarshalTypeCache(c *C) { var data []byte var err error func() { type T struct{ A int } data, err = goyaml.Marshal(&T{}) c.Assert(err, IsNil) }() func() { type T struct{ B int } data, err = goyaml.Marshal(&T{}) c.Assert(err, IsNil) }() c.Assert(string(data), Equals, "b: 0\n") }
func (s *S) TestMarshal(c *C) { for _, item := range marshalTests { data, err := goyaml.Marshal(item.value) c.Assert(err, IsNil) c.Assert(string(data), Equals, item.data) } }
func (s *S) TestUnmarshalWholeDocumentWithGetter(c *C) { obj := &typeWithGetter{} obj.tag = "" obj.value = map[string]string{"hello": "world!"} data, err := goyaml.Marshal(obj) c.Assert(err, IsNil) c.Assert(string(data), Equals, "hello: world!\n") }
func (s *S) TestMashalWithGetter(c *C) { for _, item := range getterTests { obj := &typeWithGetterField{} obj.Field.tag = item.tag obj.Field.value = item.value data, err := goyaml.Marshal(obj) c.Assert(err, IsNil) c.Assert(string(data), Equals, string(item.data)) } }
func (cc CloudConfig) String() string { bytes, err := goyaml.Marshal(cc) if err != nil { return "" } stringified := string(bytes) stringified = fmt.Sprintf("#cloud-config\n%s", stringified) return stringified }
func (s *S) TestSortedOutput(c *C) { order := []interface{}{ false, true, 1, uint(1), 1.0, 1.1, 1.2, 2, uint(2), 2.0, 2.1, "", ".1", ".2", ".a", "1", "2", "a!10", "a/2", "a/10", "a~10", "ab/1", "b/1", "b/01", "b/2", "b/02", "b/3", "b/03", "b1", "b01", "b3", "c2.10", "c10.2", "d1", "d12", "d12a", } m := make(map[interface{}]int) for _, k := range order { m[k] = 1 } data, err := goyaml.Marshal(m) c.Assert(err, IsNil) out := "\n" + string(data) last := 0 for i, k := range order { repr := fmt.Sprint(k) if s, ok := k.(string); ok { if _, err = strconv.ParseFloat(repr, 32); s == "" || err == nil { repr = `"` + repr + `"` } } index := strings.Index(out, "\n"+repr+":") if index == -1 { c.Fatalf("%#v is not in the output: %#v", k, out) } if index < last { c.Fatalf("%#v was generated before %#v: %q", k, order[i-1], out) } last = index } }
func (s *S) TestMarshalErrors(c *C) { for _, item := range marshalErrorTests { _, err := goyaml.Marshal(item.value) c.Assert(err, ErrorMatches, item.error) } }
// 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) } } } } } } }