agenttest

package
v0.36.0 Latest Latest
Warning

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

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

Documentation

Overview

Package agenttest provides deterministic consumer-side fixtures and reusable conformance suites for the Agent Framework's public execution boundaries. It exercises public Definition, Execution, DeploymentResolver, and TreeCommitter contracts without simulating private Engine state or Process lifecycle ownership. Each suite covers the behavior its contract states in prose and no compiler checks; it never asserts one implementation arrangement.

Example (MemoryCommitter)
package main

import (
	"fmt"

	"github.com/Tangerg/scope/agent"
)

func main() {
	committer := agent.NewMemoryTreeCommitter()
	var contract agent.TreeCommitter = committer

	fmt.Printf("%T\n", contract)
}
Output:
*agent.MemoryTreeCommitter

Index

Examples

Constants

This section is empty.

Variables

View Source
var (
	ErrInvalidDispatchScript = errors.New("agenttest: invalid dispatch script")
	ErrUnexpectedDispatch    = errors.New("agenttest: unexpected dispatch")
	ErrEffectMismatch        = errors.New("agenttest: effect does not match script")
)
View Source
var ErrInvalidEventPredicate = errors.New("agenttest: invalid event predicate")

Functions

func RunDefinitionConformance

func RunDefinitionConformance(t *testing.T, config DefinitionConformanceConfig)

RunDefinitionConformance verifies descriptor stability, concurrent Start isolation, exact Snapshot/Restore, byte-equivalent Step results, and stable rejection classifications for the supplied representative cases. All configured Signals are validated before invoking the Definition. Restore and Step inherit the test context; each Step receives a child context canceled when that call returns. RestoredCases and the fresh Signal batches must describe successful Steps; RejectedCases describe domain violations and assert the exact Failure the Definition persists for them. Cancellation paths remain ordinary tests owned by the Definition implementation.

func RunDeploymentResolverConformance added in v0.36.0

func RunDeploymentResolverConformance(t *testing.T, config DeploymentResolverConformanceConfig)

RunDeploymentResolverConformance verifies the behavior a DeploymentResolver promises but no compiler checks: exact reference matching, rejection of a reference that only shares a name, rejection of unknown references, and lookups that stay independent of their order, repetition, and concurrency.

Boundedness, absence of remote input/output, and absence of Process re-entry cannot be observed from outside an implementation and remain the implementation's own tests. Run this suite under -race so the concurrency case can report a data race.

func RunTreeCommitterConformance added in v0.32.0

func RunTreeCommitterConformance(
	t *testing.T,
	factory func() TreeCommitterConformanceDriver,
)

RunTreeCommitterConformance injects failures on both sides of storage commits because a lost response must not cause duplicate dispatch or false publication. Scenarios include explicit Unknown resolution, child publication, subsequent input consumption, budget preservation, and subtree cancellation recovery. Each factory call must return an empty isolated store so prior head ownership cannot mask a missing compare-and-swap or idempotency check. Runtime operations inherit the test context; storage calls detach its cancellation. Cleanup may continue after cancellation to join owned work. Shutdown scenarios release an injected storage gate independently of caller cancellation and verify both possible authoritative heads. Hosts must also fault-inject their real transport to prove its own storage deadline and shutdown interrupt blocked I/O.

Types

type DefinitionConformanceConfig

type DefinitionConformanceConfig struct {
	// Definition is the immutable behavior under test.
	Definition agent.Definition
	// Input is one valid value accepted by Definition.Start.
	Input agent.Payload
	// InitialSignals are delivered to each fresh Execution created from Input.
	InitialSignals []agent.Signal
	// FollowingSignals exercises the original instance and each restored copy
	// through a representative multi-Step suffix.
	FollowingSignals [][]agent.Signal
	// RestoredCases exercise additional previously captured states.
	RestoredCases []ExecutionConformanceCase
	// RejectedCases exercise domain violations the Definition must classify.
	RejectedCases []RejectedStepConformanceCase
}

DefinitionConformanceConfig describes representative public boundary cases for one Definition. Conformance is evidence for these cases, not a proof that arbitrary implementation code never reads hidden input or performs I/O.

type DeploymentResolverConformanceConfig added in v0.36.0

type DeploymentResolverConformanceConfig struct {
	// Resolver is the implementation under test.
	Resolver agent.DeploymentResolver

	// Resolvable lists every Deployment the resolver must return for that
	// Deployment's own reference. At least one is required. The suite derives
	// its name-collision probes from these, so a resolver that falls back by
	// name is detected without the caller constructing the collision.
	Resolvable []agent.Deployment

	// Unresolvable lists references the resolver must reject. It may be empty;
	// the derived collision probes already exercise rejection.
	Unresolvable []agent.DeploymentRef
}

DeploymentResolverConformanceConfig describes one resolver and the exact bindings it must answer.

type DispatchStep

type DispatchStep struct {
	// ExpectedEffect is the optional complete Effect expected at this step.
	ExpectedEffect *agent.Effect
	// Deltas are emitted in declaration order before the final outcome.
	Deltas []json.RawMessage
	// SettlementStatus is the definite or unknown settlement status.
	SettlementStatus agent.SettlementStatus
	// SettlementPayload is the Strategy-owned settlement payload.
	SettlementPayload json.RawMessage
	// Error makes Dispatch return an indeterminate external error.
	Error error
}

DispatchStep describes one expected Dispatcher call and its deterministic stream and settlement outcome. ExpectedEffect is optional; when present, the complete immutable Effect must match. Error may follow emitted Deltas and is mutually exclusive with SettlementStatus and SettlementPayload.

type ExecutionConformanceCase

type ExecutionConformanceCase struct {
	// Name identifies the sample in test output.
	Name string
	// State is an exact state previously produced by the Definition.
	State agent.ExecutionState
	// Signals are the ordered Signal prefix delivered to Step.
	Signals          []agent.Signal
	FollowingSignals [][]agent.Signal
}

ExecutionConformanceCase describes one successful Restore and Step sample.

type ObservationRecorder

type ObservationRecorder struct {
	// contains filtered or unexported fields
}

ObservationRecorder is a concurrency-safe EventListener and DeltaListener. Its zero value is ready for use.

func (*ObservationRecorder) AwaitEvent

func (o *ObservationRecorder) AwaitEvent(
	ctx context.Context,
	predicate func(agent.Event) bool,
) (agent.Event, error)

AwaitEvent returns the first recorded Event accepted by predicate. It waits for later events until ctx ends and never polls Process state.

func (*ObservationRecorder) Deltas

func (o *ObservationRecorder) Deltas() []agent.Delta

Deltas returns recorded increments in delivery order.

func (*ObservationRecorder) Events

func (o *ObservationRecorder) Events() []agent.Event

Events returns recorded events in publication order.

func (*ObservationRecorder) OnDelta

func (o *ObservationRecorder) OnDelta(_ context.Context, delta agent.Delta)

func (*ObservationRecorder) OnEvent

func (o *ObservationRecorder) OnEvent(_ context.Context, event agent.Event)

type RejectedStepConformanceCase added in v0.36.0

type RejectedStepConformanceCase struct {
	// Name identifies the sample in test output.
	Name string
	// State is an exact state previously produced by the Definition.
	State agent.ExecutionState
	// Signals are the ordered Signal prefix Step must reject.
	Signals []agent.Signal
	// FailureKind and FailureCode are the exact classification persisted for
	// this violation. Asserting both keeps the reason stable across wording
	// changes and proves the Definition, not the Engine fallback, classified it.
	FailureKind agent.FailureKind
	FailureCode string
}

RejectedStepConformanceCase describes one domain violation that Step must reject with a stable classification. Without this evidence a violation can reach the Engine as an ordinary error and be recorded as the generic execution.step.failed, which no Host can distinguish from an execution defect.

type ScriptedDispatcher

type ScriptedDispatcher struct {
	// contains filtered or unexported fields
}

ScriptedDispatcher is a concurrency-safe finite Dispatcher fixture. It records every request that reaches script consumption and fails calls made beyond or contrary to the configured script.

func NewScriptedDispatcher

func NewScriptedDispatcher(config ScriptedDispatcherConfig) (*ScriptedDispatcher, error)

NewScriptedDispatcher freezes the script at construction so a test cannot mutate expectations while the Engine is running against them. It fails calls that go beyond or contrary to the script rather than returning a zero settlement, because a dispatcher that quietly answers anything turns an ordering bug into a passing test.

func (*ScriptedDispatcher) Dispatch

Dispatch consumes the next scripted step, emits its Deltas, and returns its configured settlement or error.

func (*ScriptedDispatcher) Remaining

func (s *ScriptedDispatcher) Remaining() int

Remaining reports how many scripted calls have not been consumed.

func (*ScriptedDispatcher) ReplayPolicy

func (s *ScriptedDispatcher) ReplayPolicy(effect agent.Effect) agent.ReplayPolicy

ReplayPolicy returns the immutable policy declared at construction.

func (*ScriptedDispatcher) Requests

func (s *ScriptedDispatcher) Requests() []agent.EffectRequest

Requests returns consumed Dispatch requests in actual call order, including requests that mismatch or exceed the script.

type ScriptedDispatcherConfig

type ScriptedDispatcherConfig struct {
	// ReplayPolicy is returned for every valid Dispatcher Effect.
	ReplayPolicy agent.ReplayPolicy
	// Steps are consumed in actual Dispatch order.
	Steps []DispatchStep
}

ScriptedDispatcherConfig declares a finite deterministic dispatch script.

type TreeCommitterConformanceDriver added in v0.32.0

type TreeCommitterConformanceDriver interface {
	// TreeCommitter must share storage with LoadTree so the suite can verify
	// acknowledged writes through an independent read.
	agent.TreeCommitter
	// LoadTree must not activate the tree, because observation cannot take
	// ownership from the writer being tested.
	LoadTree(ctx context.Context, rootID agent.ProcessID) (agent.TreeSnapshot, bool, error)
}

TreeCommitterConformanceDriver separates commits from reads so the suite can detect acknowledgments that did not install the claimed authoritative head.

Jump to

Keyboard shortcuts

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