github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/cmd/util/ledger/reporters/reporter_output_test.go (about)

     1  package reporters_test
     2  
     3  import (
     4  	"os"
     5  	"path"
     6  	"sync"
     7  	"testing"
     8  
     9  	"github.com/rs/zerolog"
    10  	"github.com/stretchr/testify/require"
    11  
    12  	"github.com/onflow/flow-go/cmd/util/ledger/reporters"
    13  )
    14  
    15  func TestReportFileWriter(t *testing.T) {
    16  	dir := t.TempDir()
    17  
    18  	filename := path.Join(dir, "test.json")
    19  	log := zerolog.Logger{}
    20  
    21  	requireFileContains := func(t *testing.T, expected string) {
    22  		dat, err := os.ReadFile(filename)
    23  		require.NoError(t, err)
    24  
    25  		require.Equal(t, []byte(expected), dat)
    26  	}
    27  
    28  	type testData struct {
    29  		TestField string
    30  	}
    31  
    32  	t.Run("Open & Close - empty json array", func(t *testing.T) {
    33  		rw := reporters.NewReportFileWriter(filename, log)
    34  		rw.Close()
    35  
    36  		requireFileContains(t, "[]")
    37  	})
    38  	t.Run("Open & Write One & Close - json array with one element", func(t *testing.T) {
    39  		rw := reporters.NewReportFileWriter(filename, log)
    40  		rw.Write(testData{TestField: "something"})
    41  		rw.Close()
    42  
    43  		requireFileContains(t, "[{\"TestField\":\"something\"}]")
    44  	})
    45  	t.Run("Open & Write Many & Close - json array with many elements", func(t *testing.T) {
    46  		rw := reporters.NewReportFileWriter(filename, log)
    47  		rw.Write(testData{TestField: "something0"})
    48  		rw.Write(testData{TestField: "something1"})
    49  		rw.Write(testData{TestField: "something2"})
    50  
    51  		rw.Close()
    52  
    53  		requireFileContains(t,
    54  			"[{\"TestField\":\"something0\"},{\"TestField\":\"something1\"},{\"TestField\":\"something2\"}]")
    55  	})
    56  
    57  	t.Run("Open & Write Many in threads & Close", func(t *testing.T) {
    58  		rw := reporters.NewReportFileWriter(filename, log)
    59  
    60  		wg := &sync.WaitGroup{}
    61  		for i := 0; i < 3; i++ {
    62  			wg.Add(1)
    63  			go func() {
    64  				rw.Write(testData{TestField: "something"})
    65  				wg.Done()
    66  			}()
    67  		}
    68  
    69  		wg.Wait()
    70  
    71  		rw.Close()
    72  
    73  		requireFileContains(t,
    74  			"[{\"TestField\":\"something\"},{\"TestField\":\"something\"},{\"TestField\":\"something\"}]")
    75  	})
    76  }