독립 호스트에서 안전한 작업 실행과 복구를 제공하기 위해 런타임 설정, 정책, 상태 저장소, 워크스페이스 격리 및 AgentTask 오케스트레이션을 확장한다.
99 lines
2.7 KiB
Go
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)
|
|
}
|
|
})
|
|
}
|
|
}
|