99 lines
2.7 KiB
Go
99 lines
2.7 KiB
Go
|
|
//go:build integration
|
||
|
|
|
||
|
|
// Copyright (c) 2017-2026 Lethean (https://lt.hn)
|
||
|
|
//
|
||
|
|
// Licensed under the European Union Public Licence (EUPL) version 1.2.
|
||
|
|
// SPDX-License-Identifier: EUPL-1.2
|
||
|
|
|
||
|
|
package rpc
|
||
|
|
|
||
|
|
import (
|
||
|
|
"net/http"
|
||
|
|
"testing"
|
||
|
|
"time"
|
||
|
|
)
|
||
|
|
|
||
|
|
const testnetRPCAddr = "http://localhost:46941"
|
||
|
|
|
||
|
|
// TestIntegration_RPC connects to the C++ testnet daemon and queries
|
||
|
|
// all Tier 1 endpoints.
|
||
|
|
func TestIntegration_RPC(t *testing.T) {
|
||
|
|
c := NewClientWithHTTP(testnetRPCAddr, &http.Client{Timeout: 10 * time.Second})
|
||
|
|
|
||
|
|
// --- GetHeight ---
|
||
|
|
height, err := c.GetHeight()
|
||
|
|
if err != nil {
|
||
|
|
t.Skipf("testnet daemon not reachable at %s: %v", testnetRPCAddr, err)
|
||
|
|
}
|
||
|
|
if height == 0 {
|
||
|
|
t.Error("height is 0 — daemon may not be synced")
|
||
|
|
}
|
||
|
|
t.Logf("testnet height: %d", height)
|
||
|
|
|
||
|
|
// --- GetBlockCount ---
|
||
|
|
count, err := c.GetBlockCount()
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("GetBlockCount: %v", err)
|
||
|
|
}
|
||
|
|
// count should be height or height+1
|
||
|
|
if count < height {
|
||
|
|
t.Errorf("count %d < height %d", count, height)
|
||
|
|
}
|
||
|
|
t.Logf("testnet block count: %d", count)
|
||
|
|
|
||
|
|
// --- GetInfo ---
|
||
|
|
info, err := c.GetInfo()
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("GetInfo: %v", err)
|
||
|
|
}
|
||
|
|
if info.Height == 0 {
|
||
|
|
t.Error("info.height is 0")
|
||
|
|
}
|
||
|
|
t.Logf("testnet info: height=%d, tx_count=%d, connections=%d+%d",
|
||
|
|
info.Height, info.TxCount,
|
||
|
|
info.OutgoingConnectionsCount, info.IncomingConnectionsCount)
|
||
|
|
|
||
|
|
// --- GetLastBlockHeader ---
|
||
|
|
lastHdr, err := c.GetLastBlockHeader()
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("GetLastBlockHeader: %v", err)
|
||
|
|
}
|
||
|
|
if lastHdr.Hash == "" {
|
||
|
|
t.Error("last block hash is empty")
|
||
|
|
}
|
||
|
|
t.Logf("testnet last block: height=%d, hash=%s", lastHdr.Height, lastHdr.Hash)
|
||
|
|
|
||
|
|
// --- GetBlockHeaderByHeight (genesis) ---
|
||
|
|
genesis, err := c.GetBlockHeaderByHeight(0)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("GetBlockHeaderByHeight(0): %v", err)
|
||
|
|
}
|
||
|
|
const expectedGenesisHash = "cb9d5455ccb79451931003672c405f5e2ac51bff54021aa30bc4499b1ffc4963"
|
||
|
|
if genesis.Hash != expectedGenesisHash {
|
||
|
|
t.Errorf("genesis hash: got %q, want %q", genesis.Hash, expectedGenesisHash)
|
||
|
|
}
|
||
|
|
t.Logf("genesis block hash verified: %s", genesis.Hash)
|
||
|
|
|
||
|
|
// --- GetBlockHeaderByHash (using genesis hash) ---
|
||
|
|
byHash, err := c.GetBlockHeaderByHash(expectedGenesisHash)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("GetBlockHeaderByHash: %v", err)
|
||
|
|
}
|
||
|
|
if byHash.Height != 0 {
|
||
|
|
t.Errorf("genesis by hash: height got %d, want 0", byHash.Height)
|
||
|
|
}
|
||
|
|
|
||
|
|
// --- GetBlocksDetails (genesis block) ---
|
||
|
|
blocks, err := c.GetBlocksDetails(0, 1)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("GetBlocksDetails: %v", err)
|
||
|
|
}
|
||
|
|
if len(blocks) == 0 {
|
||
|
|
t.Fatal("GetBlocksDetails returned 0 blocks")
|
||
|
|
}
|
||
|
|
if blocks[0].ID != expectedGenesisHash {
|
||
|
|
t.Errorf("block[0].id: got %q, want %q", blocks[0].ID, expectedGenesisHash)
|
||
|
|
}
|
||
|
|
t.Logf("genesis block details: reward=%d, type=%d", blocks[0].BaseReward, blocks[0].Type)
|
||
|
|
}
|