| // Copyright 2023 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package main | |
| import ( | |
| "strings" | |
| "testing" | |
| ) | |
| func TestJSONFilterRewritePackage(t *testing.T) { | |
| const in = `{"Package":"abc"} | |
| {"Field1":"1","Package":"abc","Field3":"3"} | |
| {"Package":123} | |
| {} | |
| {"Package":"abc","Unexpected":[null,true,false,99999999999999999999]} | |
| ` | |
| want := strings.ReplaceAll(in, `"Package":"abc"`, `"Package":"abc:variant"`) | |
| checkJSONFilter(t, in, want) | |
| } | |
| func TestJSONFilterMalformed(t *testing.T) { | |
| const in = `unexpected text | |
| {"Package":"abc"} | |
| more text | |
| {"Package":"abc"}trailing text | |
| {not json} | |
| no newline` | |
| const want = `unexpected text | |
| {"Package":"abc:variant"} | |
| more text | |
| {"Package":"abc:variant"}trailing text | |
| {not json} | |
| no newline` | |
| checkJSONFilter(t, in, want) | |
| } | |
| func TestJSONFilterBoundaries(t *testing.T) { | |
| const in = `{"Package":"abc"} | |
| {"Package":"def"} | |
| {"Package":"ghi"} | |
| ` | |
| want := strings.ReplaceAll(in, `"}`, `:variant"}`) | |
| // Write one bytes at a time. | |
| t.Run("bytes", func(t *testing.T) { | |
| checkJSONFilterWith(t, want, func(f *testJSONFilter) { | |
| for i := 0; i < len(in); i++ { | |
| f.Write([]byte{in[i]}) | |
| } | |
| }) | |
| }) | |
| // Write a block containing a whole line bordered by two partial lines. | |
| t.Run("bytes", func(t *testing.T) { | |
| checkJSONFilterWith(t, want, func(f *testJSONFilter) { | |
| const b1 = 5 | |
| const b2 = len(in) - 5 | |
| f.Write([]byte(in[:b1])) | |
| f.Write([]byte(in[b1:b2])) | |
| f.Write([]byte(in[b2:])) | |
| }) | |
| }) | |
| } | |
| func checkJSONFilter(t *testing.T, in, want string) { | |
| t.Helper() | |
| checkJSONFilterWith(t, want, func(f *testJSONFilter) { | |
| f.Write([]byte(in)) | |
| }) | |
| } | |
| func checkJSONFilterWith(t *testing.T, want string, write func(*testJSONFilter)) { | |
| t.Helper() | |
| out := new(strings.Builder) | |
| f := &testJSONFilter{w: out, variant: "variant"} | |
| write(f) | |
| f.Flush() | |
| got := out.String() | |
| if want != got { | |
| t.Errorf("want:\n%s\ngot:\n%s", want, got) | |
| } | |
| } |