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  }