1// Copyright 2023 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package main
6
7import (
8	"strings"
9	"testing"
10)
11
12func TestJSONFilterRewritePackage(t *testing.T) {
13	const in = `{"Package":"abc"}
14{"Field1":"1","Package":"abc","Field3":"3"}
15{"Package":123}
16{}
17{"Package":"abc","Unexpected":[null,true,false,99999999999999999999]}
18`
19	want := strings.ReplaceAll(in, `"Package":"abc"`, `"Package":"abc:variant"`)
20
21	checkJSONFilter(t, in, want)
22}
23
24func TestJSONFilterMalformed(t *testing.T) {
25	const in = `unexpected text
26{"Package":"abc"}
27more text
28{"Package":"abc"}trailing text
29{not json}
30no newline`
31	const want = `unexpected text
32{"Package":"abc:variant"}
33more text
34{"Package":"abc:variant"}trailing text
35{not json}
36no newline`
37	checkJSONFilter(t, in, want)
38}
39
40func TestJSONFilterBoundaries(t *testing.T) {
41	const in = `{"Package":"abc"}
42{"Package":"def"}
43{"Package":"ghi"}
44`
45	want := strings.ReplaceAll(in, `"}`, `:variant"}`)
46
47	// Write one bytes at a time.
48	t.Run("bytes", func(t *testing.T) {
49		checkJSONFilterWith(t, want, func(f *testJSONFilter) {
50			for i := 0; i < len(in); i++ {
51				f.Write([]byte{in[i]})
52			}
53		})
54	})
55	// Write a block containing a whole line bordered by two partial lines.
56	t.Run("bytes", func(t *testing.T) {
57		checkJSONFilterWith(t, want, func(f *testJSONFilter) {
58			const b1 = 5
59			const b2 = len(in) - 5
60			f.Write([]byte(in[:b1]))
61			f.Write([]byte(in[b1:b2]))
62			f.Write([]byte(in[b2:]))
63		})
64	})
65}
66
67func checkJSONFilter(t *testing.T, in, want string) {
68	t.Helper()
69	checkJSONFilterWith(t, want, func(f *testJSONFilter) {
70		f.Write([]byte(in))
71	})
72}
73
74func checkJSONFilterWith(t *testing.T, want string, write func(*testJSONFilter)) {
75	t.Helper()
76
77	out := new(strings.Builder)
78	f := &testJSONFilter{w: out, variant: "variant"}
79	write(f)
80	f.Flush()
81	got := out.String()
82	if want != got {
83		t.Errorf("want:\n%s\ngot:\n%s", want, got)
84	}
85}
86