iop/packages/go/agenttask/workflow_evidence_test.go
toki 3c48879c44 feat(agent-runtime): 독립 Agent CLI 런타임 기반을 구현한다
독립 호스트에서 안전한 작업 실행과 복구를 제공하기 위해 런타임 설정, 정책, 상태 저장소, 워크스페이스 격리 및 AgentTask 오케스트레이션을 확장한다.
2026-07-29 13:12:21 +09:00

99 lines
2.7 KiB
Go

package agenttask
import (
"context"
"sync"
"testing"
)
type fakeWorkflowEvidence struct {
mu sync.Mutex
observeFunc func(WorkflowEvidenceRequest, int) (ArtifactEvidence, error)
repairErr error
observeCalls []WorkflowEvidenceRequest
repairCalls []WorkflowEvidenceRepairRequest
}
func newFakeWorkflowEvidence() *fakeWorkflowEvidence {
return &fakeWorkflowEvidence{}
}
func (f *fakeWorkflowEvidence) Observe(
_ context.Context,
request WorkflowEvidenceRequest,
) (ArtifactEvidence, error) {
f.mu.Lock()
defer f.mu.Unlock()
call := len(f.observeCalls)
f.observeCalls = append(f.observeCalls, request)
if f.observeFunc != nil {
return f.observeFunc(request, call)
}
return ArtifactEvidence{
Active: true, Identity: artifactIdentity(request.Project, request.Work, request.Submission),
Completeness: ArtifactComplete,
}, nil
}
func (f *fakeWorkflowEvidence) Repair(
_ context.Context,
request WorkflowEvidenceRepairRequest,
) error {
f.mu.Lock()
defer f.mu.Unlock()
f.repairCalls = append(f.repairCalls, request)
return f.repairErr
}
func (f *fakeWorkflowEvidence) counts() (int, int) {
f.mu.Lock()
defer f.mu.Unlock()
return len(f.observeCalls), len(f.repairCalls)
}
func TestMatchWorkflowEvidence(t *testing.T) {
expected := ArtifactIdentity{
ProjectID: "project", WorkspaceID: "workspace", WorkUnitID: "work",
AttemptID: "attempt", ArtifactID: "artifact",
}
for _, test := range []struct {
name string
observed ArtifactEvidence
want WorkflowEvidenceStatus
}{
{
name: "complete active pair",
observed: ArtifactEvidence{Active: true, Identity: expected, Completeness: ArtifactComplete},
want: WorkflowEvidenceMatched,
},
{
name: "placeholder active pair",
observed: ArtifactEvidence{Active: true, Identity: expected, Completeness: ArtifactPlaceholder},
want: WorkflowEvidencePlaceholder,
},
{
name: "wrong attempt identity",
observed: ArtifactEvidence{Active: true, Identity: ArtifactIdentity{
ProjectID: "project", WorkspaceID: "workspace", WorkUnitID: "work",
AttemptID: "other-attempt", ArtifactID: "artifact",
}, Completeness: ArtifactComplete},
want: WorkflowEvidenceIdentityMismatch,
},
{
name: "inactive pair",
observed: ArtifactEvidence{Active: false, Identity: expected, Completeness: ArtifactComplete},
want: WorkflowEvidenceNotActive,
},
{
name: "unknown completeness is invalid",
observed: ArtifactEvidence{Active: true, Identity: expected, Completeness: "unknown"},
want: WorkflowEvidenceInvalid,
},
} {
t.Run(test.name, func(t *testing.T) {
if got := MatchWorkflowEvidence(expected, test.observed).Status; got != test.want {
t.Fatalf("match status = %q, want %q", got, test.want)
}
})
}
}