blob: 5732296e109df62b142a1015822c5524f6da0505 [file] [log] [blame]
// +build dump
// To dump a directory containing all the plist package test data, run
// $ go test -tags dump
//
// To customize where the dumps are stored, set the env variable PLIST_DUMP_DIR.
package plist
import (
"encoding/gob"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"
"testing"
)
var filenameReplacer = strings.NewReplacer(`<`, `_`, `>`, `_`, `:`, `_`, `"`, `_`, `/`, `_`, `\`, `_`, `|`, `_`, `?`, `_`, `*`, `_`)
var extensions = map[int]string{
BinaryFormat: ".binary.plist",
XMLFormat: ".xml.plist",
GNUStepFormat: ".gnustep.plist",
OpenStepFormat: ".openstep.plist",
}
func sanitizeFilename(f string) string {
return filenameReplacer.Replace(f)
}
func oneshotGob(v interface{}, path string) {
f, _ := os.Create(path)
defer f.Close()
enc := gob.NewEncoder(f)
enc.Encode(v)
}
func makeDirs(dirs ...string) error {
for _, v := range dirs {
err := os.MkdirAll(v, 0777)
if err != nil {
return err
}
}
return nil
}
func touch(path string) {
f, _ := os.Create(path)
f.Close()
}
func TestDump(t *testing.T) {
dir := os.Getenv("PLIST_DUMP_DIR")
if dir == "" {
dir = "dump"
}
dir, err := filepath.Abs(dir)
if err != nil {
t.Fatal(err)
}
documentDir := filepath.Join(dir, "golden")
encodeDir := filepath.Join(dir, "encode_from")
decodeDir := filepath.Join(dir, "decode_as")
invalidDir := filepath.Join(dir, "invalid")
err = makeDirs(dir, documentDir, encodeDir, decodeDir, invalidDir)
if err != nil {
t.Fatal(err)
}
// Dump golden plists for known-valid tests and gobs for their encode/decode values
for _, td := range tests {
t.Log("Dumping", td.Name)
saneName := sanitizeFilename(td.Name)
encv := td.Value
if encv != nil && len(td.SkipEncode) < len(extensions) {
// If we have an "encode from" and we are intending to encode
oneshotGob(encv, filepath.Join(encodeDir, saneName+".gob"))
}
decv := td.DecodeValue
if decv != nil && len(td.SkipDecode) < len(extensions) {
// If we have an "expected to decode as" and we are intending to decode
oneshotGob(decv, filepath.Join(decodeDir, saneName+".gob"))
}
for k, v := range td.Documents {
extName := saneName + extensions[k]
path := filepath.Join(documentDir, extName)
_ = ioutil.WriteFile(path, v, 0666)
if td.SkipEncode[k] {
touch(path + ".decode_only")
}
if td.SkipDecode[k] {
touch(path + ".encode_only")
}
}
}
// Dump invalid text plists
for _, td := range InvalidTextPlists {
saneName := sanitizeFilename(td.Name)
ext := extensions[OpenStepFormat]
if strings.Contains(td.Name, "GNUStep") {
ext = extensions[GNUStepFormat]
}
ioutil.WriteFile(filepath.Join(invalidDir, saneName+ext), []byte(td.Data), 0666)
}
// Dump invalid XML plists (We don't have any right now.)
for i, v := range InvalidXMLPlists {
ioutil.WriteFile(filepath.Join(invalidDir, fmt.Sprintf("invalid-x-%2.02d", i)+extensions[XMLFormat]), []byte(v), 0666)
}
// Dump invalid binary plists
for i, v := range InvalidBplists {
ioutil.WriteFile(filepath.Join(invalidDir, fmt.Sprintf("invalid-b-%2.02d", i)+extensions[BinaryFormat]), v, 0666)
}
}