github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/dump/dump_test.go (about) 1 package dump 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "io" 7 "io/ioutil" 8 "log" 9 "net/http" 10 _ "net/http/pprof" 11 "os" 12 "sort" 13 "strings" 14 "testing" 15 16 "github.com/hyperledger/burrow/bcm" 17 "github.com/hyperledger/burrow/execution/state" 18 "github.com/stretchr/testify/require" 19 "github.com/syndtr/goleveldb/leveldb/opt" 20 dbm "github.com/tendermint/tm-db" 21 ) 22 23 // The tests in this package are quite a good starting point for investigating the inadequacies of IAVL... 24 func TestMain(m *testing.M) { 25 // For pprof 26 go func() { 27 log.Println(http.ListenAndServe("localhost:6060", nil)) 28 }() 29 code := m.Run() 30 os.Exit(code) 31 } 32 33 func BenchmarkDump(b *testing.B) { 34 b.StopTimer() 35 st := testLoad(b, NewMockSource(1000, 1000, 100, 10000)) 36 dumper := NewDumper(st, &bcm.Blockchain{}) 37 b.StartTimer() 38 for n := 0; n < b.N; n++ { 39 err := dumper.Transmit(NullSink{}, 0, 0, All) 40 require.NoError(b, err) 41 } 42 } 43 44 func TestDump(t *testing.T) { 45 mockSource := NewMockSource(50, 50, 100, 100) 46 st := testLoad(t, mockSource) 47 dumper := NewDumper(st, mockSource) 48 sink := CollectSink{ 49 Rows: make([]string, 0), 50 } 51 err := dumper.Transmit(&sink, 0, 0, All) 52 require.NoError(t, err) 53 54 sort.Strings(sink.Rows) 55 56 m := NewMockSource(50, 50, 100, 100) 57 data := make([]string, 0) 58 59 for { 60 row, err := m.Recv() 61 if err == io.EOF { 62 break 63 } 64 bs, _ := json.Marshal(row) 65 data = append(data, string(bs)) 66 } 67 68 sort.Strings(data) 69 70 require.Equal(t, sink.Rows, data) 71 } 72 73 // Test util 74 75 func normaliseDump(dump string) string { 76 rows := strings.Split(dump, "\n") 77 sort.Stable(sort.StringSlice(rows)) 78 return strings.Join(rows, "\n") 79 } 80 81 func dumpToJSONString(t *testing.T, st *state.State, blockchain Blockchain) string { 82 buf := new(bytes.Buffer) 83 receiver := NewDumper(st, blockchain).Source(0, 0, All) 84 err := Write(buf, receiver, false, All) 85 require.NoError(t, err) 86 return string(buf.Bytes()) 87 } 88 89 func loadDumpFromJSONString(t *testing.T, st *state.State, jsonDump string) { 90 reader, err := NewJSONReader(bytes.NewBufferString(jsonDump)) 91 require.NoError(t, err) 92 err = Load(reader, st) 93 require.NoError(t, err) 94 } 95 96 func testDB(t testing.TB) dbm.DB { 97 testDir, err := ioutil.TempDir("", "TestDump") 98 require.NoError(t, err) 99 var options *opt.Options 100 db, err := dbm.NewGoLevelDBWithOpts("TestDumpDB", testDir, options) 101 require.NoError(t, err) 102 return db 103 }