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		PublicKey: pk,
 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(dir, statedb.TypeSynchronizer, 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	debugAPI := NewDebugAPI(addr, sdb)
 54
 55	ctx, cancel := context.WithCancel(context.Background())
 56	go func() {
 57		err := debugAPI.Run(ctx)
 58		require.Nil(t, err)
 59	}()
 60
 61	var accounts []common.Account
 62	for i := 0; i < 16; i++ {
 63		account := newAccount(t, i)
 64		accounts = append(accounts, *account)
 65		_, err = sdb.CreateAccount(account.Idx, account)
 66		require.Nil(t, err)
 67	}
 68
 69	url := fmt.Sprintf("http://%v/debug/", addr)
 70
 71	var batchNum common.BatchNum
 72	req, err := sling.New().Get(url).Path("sdb/batchnum").ReceiveSuccess(&batchNum)
 73	require.Equal(t, http.StatusOK, req.StatusCode)
 74	require.Nil(t, err)
 75	assert.Equal(t, common.BatchNum(1), batchNum)
 76
 77	var mtroot *big.Int
 78	req, err = sling.New().Get(url).Path("sdb/mtroot").ReceiveSuccess(&mtroot)
 79	require.Equal(t, http.StatusOK, req.StatusCode)
 80	require.Nil(t, err)
 81	// Testing against a hardcoded value obtained by running the test and
 82	// printing the value previously.
 83	assert.Equal(t, "21765339739823365993496282904432398015268846626944509989242908567129545640185",
 84		mtroot.String())
 85
 86	var accountAPI common.Account
 87	req, err = sling.New().Get(url).
 88		Path(fmt.Sprintf("sdb/accounts/%v", accounts[0].Idx)).
 89		ReceiveSuccess(&accountAPI)
 90	require.Equal(t, http.StatusOK, req.StatusCode)
 91	require.Nil(t, err)
 92	assert.Equal(t, accounts[0], accountAPI)
 93
 94	var accountsAPI []common.Account
 95	req, err = sling.New().Get(url).Path("sdb/accounts").ReceiveSuccess(&accountsAPI)
 96	require.Equal(t, http.StatusOK, req.StatusCode)
 97	require.Nil(t, err)
 98	assert.Equal(t, accounts, accountsAPI)
 99
100	cancel()
101}