arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/test/debugapi/debugapi_test.go
test/debugapi/debugapi_test.goRaw
  1package debugapi
  2
  3import (
  4	"crypto/ecdsa"
  5	"fmt"
  6	"io/ioutil"
  7	"math/big"
  8	"net/http"
  9	"strconv"
 10	"testing"
 11
 12	"github.com/dghubble/sling"
 13	ethCrypto "github.com/ethereum/go-ethereum/crypto"
 14	"github.com/hermeznetwork/hermez-node/common"
 15	"github.com/hermeznetwork/hermez-node/db/statedb"
 16	"github.com/iden3/go-iden3-crypto/babyjub"
 17	"github.com/stretchr/testify/assert"
 18	"github.com/stretchr/testify/require"
 19	"golang.org/x/net/context"
 20)
 21
 22func newAccount(t *testing.T, i int) *common.Account {
 23	var sk babyjub.PrivateKey
 24	copy(sk[:], []byte(strconv.Itoa(i))) // only for testing
 25	pk := sk.Public()
 26
 27	var key ecdsa.PrivateKey
 28	key.D = big.NewInt(int64(i + 1)) // only for testing
 29	key.PublicKey.X, key.PublicKey.Y = ethCrypto.S256().ScalarBaseMult(key.D.Bytes())
 30	key.Curve = ethCrypto.S256()
 31	address := ethCrypto.PubkeyToAddress(key.PublicKey)
 32
 33	return &common.Account{
 34		Idx:     common.Idx(256 + i),
 35		TokenID: common.TokenID(i),
 36		Nonce:   common.Nonce(i),
 37		Balance: big.NewInt(1000),
 38		BJJ:     pk.Compress(),
 39		EthAddr: address,
 40	}
 41}
 42
 43func TestDebugAPI(t *testing.T) {
 44	dir, err := ioutil.TempDir("", "tmpdb")
 45	require.Nil(t, err)
 46
 47	sdb, err := statedb.NewStateDB(statedb.Config{Path: dir, Keep: 128, Type: statedb.TypeSynchronizer, NLevels: 32})
 48	require.Nil(t, err)
 49	err = sdb.MakeCheckpoint() // Make a checkpoint to increment the batchNum
 50	require.Nil(t, err)
 51
 52	addr := "localhost:12345"
 53	// We won't test the sync/stats endpoint, so we can se the Syncrhonizer to nil
 54	debugAPI := NewDebugAPI(addr, sdb, nil)
 55
 56	ctx, cancel := context.WithCancel(context.Background())
 57	go func() {
 58		err := debugAPI.Run(ctx)
 59		require.Nil(t, err)
 60	}()
 61
 62	var accounts []common.Account
 63	for i := 0; i < 16; i++ {
 64		account := newAccount(t, i)
 65		accounts = append(accounts, *account)
 66		_, err = sdb.CreateAccount(account.Idx, account)
 67		require.Nil(t, err)
 68	}
 69	// Make a checkpoint (batchNum 2) to make the accounts available in Last
 70	err = sdb.MakeCheckpoint()
 71	require.Nil(t, err)
 72
 73	url := fmt.Sprintf("http://%v/debug/", addr)
 74
 75	var batchNum common.BatchNum
 76	req, err := sling.New().Get(url).Path("sdb/batchnum").ReceiveSuccess(&batchNum)
 77	require.Equal(t, http.StatusOK, req.StatusCode)
 78	require.Nil(t, err)
 79	assert.Equal(t, common.BatchNum(2), batchNum)
 80
 81	var mtroot *big.Int
 82	req, err = sling.New().Get(url).Path("sdb/mtroot").ReceiveSuccess(&mtroot)
 83	require.Equal(t, http.StatusOK, req.StatusCode)
 84	require.Nil(t, err)
 85	// Testing against a hardcoded value obtained by running the test and
 86	// printing the value previously.
 87	assert.Equal(t, "21765339739823365993496282904432398015268846626944509989242908567129545640185",
 88		mtroot.String())
 89
 90	var accountAPI common.Account
 91	req, err = sling.New().Get(url).
 92		Path(fmt.Sprintf("sdb/accounts/%v", accounts[0].Idx)).
 93		ReceiveSuccess(&accountAPI)
 94	require.Equal(t, http.StatusOK, req.StatusCode)
 95	require.Nil(t, err)
 96	assert.Equal(t, accounts[0], accountAPI)
 97
 98	var accountsAPI []common.Account
 99	req, err = sling.New().Get(url).Path("sdb/accounts").ReceiveSuccess(&accountsAPI)
100	require.Equal(t, http.StatusOK, req.StatusCode)
101	require.Nil(t, err)
102	assert.Equal(t, accounts, accountsAPI)
103
104	cancel()
105}