12 kr "github.com/kr/logfmt"
15 // Fuzz checks reserialized data matches
16 func Fuzz(data []byte) int {
17 parsed, err := parse(data)
22 if err = write(parsed, &w1); err != nil {
25 parsed, err = parse(w1.Bytes())
30 if err = write(parsed, &w2); err != nil {
33 if !bytes.Equal(w1.Bytes(), w2.Bytes()) {
34 panic(fmt.Sprintf("reserialized data does not match:\n%q\n%q\n", w1.Bytes(), w2.Bytes()))
39 // FuzzVsKR checks go-logfmt/logfmt against kr/logfmt
40 func FuzzVsKR(data []byte) int {
41 parsed, err := parse(data)
42 parsedKR, errKR := parseKR(data)
44 // github.com/go-logfmt/logfmt is a stricter parser. It returns errors for
45 // more inputs than github.com/kr/logfmt. Ignore any inputs that have a
51 // Fail if the more forgiving parser finds an error not found by the
54 panic(fmt.Sprintf("unmatched error: %v", errKR))
57 if !reflect.DeepEqual(parsed, parsedKR) {
58 panic(fmt.Sprintf("parsers disagree:\n%+v\n%+v\n", parsed, parsedKR))
67 func parse(data []byte) ([][]kv, error) {
69 dec := NewDecoder(bytes.NewReader(data))
70 for dec.ScanRecord() {
72 for dec.ScanKeyval() {
73 kvs = append(kvs, kv{dec.Key(), dec.Value()})
75 got = append(got, kvs)
80 func parseKR(data []byte) ([][]kv, error) {
82 s = bufio.NewScanner(bytes.NewReader(data))
87 for err == nil && s.Scan() {
89 err = kr.Unmarshal(s.Bytes(), &h)
90 got = append(got, h.kvs)
98 type saveHandler struct {
102 func (h *saveHandler) HandleLogfmt(key, val []byte) error {
109 h.kvs = append(h.kvs, kv{key, val})
113 func write(recs [][]kv, w io.Writer) error {
115 for _, rec := range recs {
116 for _, f := range rec {
117 if err := enc.EncodeKeyval(f.k, f.v); err != nil {
121 if err := enc.EndRecord(); err != nil {