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,
 48		Type: statedb.TypeSynchronizer, NLevels: 32})
 49	require.Nil(t, err)
 50	err = sdb.MakeCheckpoint() // Make a checkpoint to increment the batchNum
 51	require.Nil(t, err)
 52
 53	addr := "localhost:12345"
 54	// We won't test the sync/stats endpoint, so we can se the synchronizer to nil
 55	debugAPI := NewDebugAPI(addr, sdb, nil)
 56
 57	ctx, cancel := context.WithCancel(context.Background())
 58	go func() {
 59		err := debugAPI.Run(ctx)
 60		require.Nil(t, err)
 61	}()
 62
 63	var accounts []common.Account
 64	for i := 0; i < 16; i++ {
 65		account := newAccount(t, i)
 66		accounts = append(accounts, *account)
 67		_, err = sdb.CreateAccount(account.Idx, account)
 68		require.Nil(t, err)
 69	}
 70	// Make a checkpoint (batchNum 2) to make the accounts available in Last
 71	err = sdb.MakeCheckpoint()
 72	require.Nil(t, err)
 73
 74	url := fmt.Sprintf("http://%v/debug/", addr)
 75
 76	var batchNum common.BatchNum
 77	req, err := sling.New().Get(url).Path("sdb/batchnum").ReceiveSuccess(&batchNum)
 78	require.Equal(t, http.StatusOK, req.StatusCode)
 79	require.Nil(t, err)
 80	assert.Equal(t, common.BatchNum(2), batchNum)
 81
 82	var mtroot *big.Int
 83	req, err = sling.New().Get(url).Path("sdb/mtroot").ReceiveSuccess(&mtroot)
 84	require.Equal(t, http.StatusOK, req.StatusCode)
 85	require.Nil(t, err)
 86	// Testing against a hardcoded value obtained by running the test and
 87	// printing the value previously.
 88	assert.Equal(t, "21765339739823365993496282904432398015268846626944509989242908567129545640185",
 89		mtroot.String())
 90
 91	var accountAPI common.Account
 92	req, err = sling.New().Get(url).
 93		Path(fmt.Sprintf("sdb/accounts/%v", accounts[0].Idx)).
 94		ReceiveSuccess(&accountAPI)
 95	require.Equal(t, http.StatusOK, req.StatusCode)
 96	require.Nil(t, err)
 97	assert.Equal(t, accounts[0], accountAPI)
 98
 99	var accountsAPI []common.Account
100	req, err = sling.New().Get(url).Path("sdb/accounts").ReceiveSuccess(&accountsAPI)
101	require.Equal(t, http.StatusOK, req.StatusCode)
102	require.Nil(t, err)
103	assert.Equal(t, accounts, accountsAPI)
104
105	cancel()
106}