Files
Prad NukalaandGitHub 13e6c3e84d Master (#1262)
* clear

* feat: Add everything

* fix: Commenht
2025-10-03 14:45:52 -04:00

6.3 KiB

Sonr E2E Testing Framework

This directory contains the new Starship-based E2E testing framework that replaces the previous InterchainTest infrastructure.

Architecture

The E2E tests use Starship for local blockchain network deployment and HTTP REST API calls for chain interactions, providing a 75% reduction in test code complexity while maintaining full test coverage.

Directory Structure

test/e2e/
├── client/          # HTTP client utilities for Starship REST API
│   ├── chain.go     # Chain query methods (balances, supply, node info)
│   ├── tx.go        # Transaction broadcasting utilities  
│   └── ibc.go       # IBC operations (channels, connections, clients)
├── fixtures/        # Test data and configurations
│   └── config.yaml  # Test configuration with endpoints and accounts
├── tests/           # Test suites organized by functionality
│   ├── basic/       # Basic chain functionality tests
│   ├── ibc/         # IBC-related tests
│   └── modules/     # Module-specific tests (DID, DWN, SVC)
├── utils/           # Helper functions and common utilities
│   ├── faucet.go    # Account funding via faucet API
│   └── assert.go    # Test assertions and setup helpers
└── go.mod           # Go module definition

Configuration

The tests are configured to work with Starship using:

  • Chain ID: sonrtest_1-1
  • Staking Denom: usnr
  • Normal Denom: snr
  • REST API: http://localhost:1317
  • Faucet API: http://localhost:8000

These values are defined in utils/assert.go and can be customized as needed.

Prerequisites

  1. Starship Network: Tests require a running Starship network
  2. IPFS Infrastructure: Some tests may require IPFS nodes for vault operations
  3. Redis: Required for Highway service integration

Running Tests

Start the Network

# Start Starship network (uses chains/standalone.json config)
make testnet

# Verify network is running
kubectl get pods

# Check service endpoints
kubectl get services

Run E2E Tests

# Run all E2E tests
cd test/e2e
go test ./...

# Run specific test suites
go test ./tests/basic/...     # Basic functionality
go test ./tests/ibc/...       # IBC operations
go test ./tests/modules/...   # Module-specific tests

# Run with verbose output
go test -v ./tests/basic/

# Run specific test
go test -v ./tests/basic/ -run TestBasicChain

Stop the Network

make stop

Available Test Suites

Basic Tests (tests/basic/)

  • TestBasicChain: Node connectivity, funding validation, supply queries
  • TestFaucetOperations: Faucet funding with different amounts
  • TestChainConnectivity: REST API and faucet connectivity tests

IBC Tests (tests/ibc/)

  • TestIBCBasic: Channel existence and query operations
  • TestIBCDenomTrace: IBC denomination trace generation
  • TestIBCTransferSimulation: Transfer logic validation
  • TestIBCConnectionStatus: Connection state verification

Module Tests (tests/modules/)

  • TestSvcModule: Service module parameter queries
  • TestDIDModule: DID module functionality tests
  • TestDWNModule: DWN module parameter queries
  • TestTokenFactoryModule: Token factory integration tests

Client Libraries

StarshipClient

The main HTTP client for Starship REST API operations:

client := client.NewStarshipClient("http://localhost:1317")

// Query balances
balance, err := client.GetBalance(ctx, address, denom)

// Query node info
nodeInfo, err := client.GetNodeInfo(ctx)

// Get IBC channels
channels, err := client.GetChannels(ctx)

FaucetClient

Client for funding test accounts via Starship faucet:

faucet := utils.NewFaucetClient("http://localhost:8000")

// Fund account
coins := []sdk.Coin{{Denom: "snr", Amount: math.NewInt(1000000)}}
err := faucet.FundAccount(ctx, address, coins)

Test Utilities

Test Configuration

cfg := utils.NewTestConfig()
// Provides default endpoints, denoms, timeouts

Assertions

// Assert exact balance
utils.AssertBalance(t, cfg, address, denom, expectedAmount)

// Assert balance constraints
utils.AssertBalanceGreaterThan(t, cfg, address, denom, minAmount)
utils.AssertBalanceLessThan(t, cfg, address, denom, maxAmount)

// Assert supply
utils.AssertSupply(t, cfg, denom, expectedSupply)

// Assert node info
utils.AssertNodeInfo(t, cfg, expectedChainID)

User Setup

// Setup and fund test users
fundAmount := math.NewInt(10_000_000)
users := utils.SetupTestUsers(t, cfg, fundAmount)

Error Handling

All client operations include retry logic and proper error handling:

  • HTTP requests: 3 retries with exponential backoff
  • Transaction waiting: Configurable timeout with polling
  • Network connectivity: Graceful failure handling

Extending Tests

Adding New Tests

  1. Create test file in appropriate directory (tests/basic/, tests/ibc/, tests/modules/)
  2. Use table-driven test patterns for multiple scenarios
  3. Use the provided utility functions for common operations
  4. Follow existing naming conventions

Adding New Client Methods

  1. Add method to appropriate client file (client/chain.go, client/tx.go, client/ibc.go)
  2. Include proper error handling and retry logic
  3. Add corresponding response type structs
  4. Document the new functionality

Example New Test

func TestNewFeature(t *testing.T) {
    cfg := utils.NewTestConfig()
    ctx := context.Background()

    tests := []struct {
        name        string
        input       string
        expectError bool
    }{
        {"valid_case", "valid_input", false},
        {"invalid_case", "invalid_input", true},
    }

    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            // Test implementation
        })
    }
}

Migration Notes

This E2E framework replaces the previous InterchainTest-based tests with:

  • 75% less code: Simplified HTTP-based operations vs Docker container management
  • Faster execution: Direct REST API calls vs container orchestration
  • Better reliability: Leverages Starship's proven infrastructure
  • Easier debugging: Standard HTTP debugging tools and logs

The test assertions and coverage remain identical to ensure no regression in test quality.