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.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(dir, 128, 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	// 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
 70	url := fmt.Sprintf("http://%v/debug/", addr)
 71
 72	var batchNum common.BatchNum
 73	req, err := sling.New().Get(url).Path("sdb/batchnum").ReceiveSuccess(&batchNum)
 74	require.Equal(t, http.StatusOK, req.StatusCode)
 75	require.Nil(t, err)
 76	assert.Equal(t, common.BatchNum(1), batchNum)
 77
 78	var mtroot *big.Int
 79	req, err = sling.New().Get(url).Path("sdb/mtroot").ReceiveSuccess(&mtroot)
 80	require.Equal(t, http.StatusOK, req.StatusCode)
 81	require.Nil(t, err)
 82	// Testing against a hardcoded value obtained by running the test and
 83	// printing the value previously.
 84	assert.Equal(t, "21765339739823365993496282904432398015268846626944509989242908567129545640185",
 85		mtroot.String())
 86
 87	var accountAPI common.Account
 88	req, err = sling.New().Get(url).
 89		Path(fmt.Sprintf("sdb/accounts/%v", accounts[0].Idx)).
 90		ReceiveSuccess(&accountAPI)
 91	require.Equal(t, http.StatusOK, req.StatusCode)
 92	require.Nil(t, err)
 93	assert.Equal(t, accounts[0], accountAPI)
 94
 95	var accountsAPI []common.Account
 96	req, err = sling.New().Get(url).Path("sdb/accounts").ReceiveSuccess(&accountsAPI)
 97	require.Equal(t, http.StatusOK, req.StatusCode)
 98	require.Nil(t, err)
 99	assert.Equal(t, accounts, accountsAPI)
100
101	cancel()
102}