testutil

package
v0.70.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 4, 2026 License: Apache-2.0 Imports: 29 Imported by: 0

Documentation

Overview

Package testutil provides common test helper utilities for the Dingo project. It replaces ad-hoc time.Sleep patterns with deterministic synchronization helpers that make tests faster and more reliable.

Index

Constants

View Source
const BindAttempts = 8

BindAttempts bounds how many ports a test tries before giving up when racing another process for a loopback port (see FreePort). Shared by every built-in API provider's TLS/auth test suite (Blockfrost, Mesh, UTxO RPC).

Variables

This section is empty.

Functions

func BuildDecodableConwayBlockBytes added in v0.70.0

func BuildDecodableConwayBlockBytes(
	t *testing.T,
	slot, blockNumber uint64,
) []byte

BuildDecodableConwayBlockBytes constructs a minimal, valid (10-field header), individually decodable Conway block with a correct block body hash and empty transaction components, for the given slot and block number. It is shared by tests across packages (database/models, ledger) that need a cheap, uniquely-identifiable, real Conway block rather than a hand-rolled mock.

func FreePort added in v0.70.0

func FreePort(t *testing.T) string

FreePort reserves a loopback port and releases it, returning the bound address ("host:port"). The port is not guaranteed to still be free when the caller binds it -- retry up to BindAttempts times instead of treating one bind failure as a test failure.

func GenerateTestTLSCertKey added in v0.70.0

func GenerateTestTLSCertKey(t *testing.T) (certPath, keyPath string)

GenerateTestTLSCertKey generates a throwaway self-signed certificate/key pair valid for 127.0.0.1 and writes them as PEM files under a fresh t.TempDir(), returning their paths. Used to exercise a listener's TLS startup path (Blockfrost, Mesh, UTxORPC, Bark) without depending on any fixed certificate checked into the repo.

func InsecureHTTPClient added in v0.70.0

func InsecureHTTPClient() *http.Client

InsecureHTTPClient returns an *http.Client that skips TLS certificate verification, for exercising a listener's throwaway self-signed test certificate (see GenerateTestTLSCertKey).

func MakeDirectoryUnwritable added in v0.70.1

func MakeDirectoryUnwritable(t testing.TB, path string)

MakeDirectoryUnwritable removes write permission from a test directory and restores it before the test's temporary-directory cleanup runs.

Both modes are derived from what the directory already has rather than written literally: t.TempDir() creates 0o700, so restoring a fixed 0o755 would hand the caller a more permissive directory than it passed in, and clearing to a fixed 0o555 would do the same for anything created stricter.

func RequireNoReceive

func RequireNoReceive[T any](
	t *testing.T,
	ch <-chan T,
	duration time.Duration,
	msg string,
)

RequireNoReceive verifies that no value is received on the given channel within the specified duration. This replaces the pattern of time.Sleep followed by a non-blocking channel read to confirm that nothing was sent.

func RequireReceive

func RequireReceive[T any](
	t *testing.T,
	ch <-chan T,
	timeout time.Duration,
	msg string,
) T

RequireReceive waits for a value on the given channel or fails the test if the timeout expires. This replaces the common pattern of time.Sleep followed by reading a channel.

func RestrictFileToCurrentUser added in v0.70.0

func RestrictFileToCurrentUser(t testing.TB, path string)

RestrictFileToCurrentUser makes a test fixture acceptable to secret-key permission checks on Unix.

func WaitForCondition

func WaitForCondition(
	t *testing.T,
	condition func() bool,
	timeout time.Duration,
	msg string,
)

WaitForCondition polls the given condition function until it returns true or the timeout expires. This replaces the common pattern of time.Sleep followed by an assertion check.

func WaitForConditionWithInterval

func WaitForConditionWithInterval(
	t *testing.T,
	condition func() bool,
	timeout time.Duration,
	interval time.Duration,
	msg string,
)

WaitForConditionWithInterval is like WaitForCondition but allows specifying a custom polling interval.

Types

type MockInput added in v0.37.0

type MockInput struct {
	TxId       []byte
	IndexValue uint32
}

MockInput is a reusable transaction input for database tests.

func NewMockInput added in v0.37.0

func NewMockInput(txId []byte, index uint32) *MockInput

func (*MockInput) Id added in v0.37.0

func (m *MockInput) Id() lcommon.Blake2b256

func (*MockInput) Index added in v0.37.0

func (m *MockInput) Index() uint32

func (*MockInput) String added in v0.37.0

func (m *MockInput) String() string

func (*MockInput) ToPlutusData added in v0.37.0

func (m *MockInput) ToPlutusData() pdata.PlutusData

func (*MockInput) Utxorpc added in v0.37.0

func (m *MockInput) Utxorpc() (*cardano.TxInput, error)

type ValidatedConwayBlock added in v0.70.1

type ValidatedConwayBlock struct {
	Cbor              []byte
	Hash              []byte
	Slot              uint64
	BlockNumber       uint64
	EpochNonceHex     string
	SlotsPerKesPeriod uint64
}

ValidatedConwayBlock holds a genuinely VRF/KES-valid Conway block's raw CBOR alongside the parameters a caller needs to independently re-verify it (e.g. via gouroboros' ledger.VerifyBlock or pipeline.ValidateStage).

func BuildValidatedConwayBlockBytes added in v0.70.1

func BuildValidatedConwayBlockBytes(
	t *testing.T,
	seed [32]byte,
	nonceSeed byte,
	slotRangeStart uint64,
	blockNumber uint64,
) ValidatedConwayBlock

BuildValidatedConwayBlockBytes generates real VRF, KES, and cold keys, searches slots in [slotRangeStart, slotRangeStart+199] for one where the generated VRF key wins leadership (99% active slot coefficient, pool stake == total stake), and returns a genuinely decodable, VRF/KES-valid Conway block at that slot with an empty transaction body.

Unlike BuildDecodableConwayBlockBytes (which zeroes out the VRF/KES/OpCert fields for tests that only need a decodable block), this is for tests that need actual cryptographic validation -- gouroboros' pipeline.ValidateStage / ledger.VerifyBlock -- to genuinely pass, not merely decode. seed must be 32 bytes and should differ between blocks needing distinct producer keys; nonceSeed derives the epoch nonce the block is proven against (use the same nonceSeed for blocks meant to share an epoch).

func BuildValidatedConwayBlockBytesWithInvalidOpCert added in v0.70.1

func BuildValidatedConwayBlockBytesWithInvalidOpCert(
	t *testing.T,
	seed [32]byte,
	nonceSeed byte,
	slotRangeStart uint64,
	blockNumber uint64,
) ValidatedConwayBlock

BuildValidatedConwayBlockBytesWithInvalidOpCert generates a block whose VRF proof and KES signature are genuine but whose operational certificate was signed by an unrelated cold key. The KES signature is computed after substituting the unrelated signature, so rejecting this block specifically exercises the cold-key OpCert check rather than failing KES verification.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL