summaryrefslogtreecommitdiff
path: root/internal/executor
diff options
context:
space:
mode:
Diffstat (limited to 'internal/executor')
-rw-r--r--internal/executor/executor.go9
-rw-r--r--internal/executor/executor_test.go39
2 files changed, 40 insertions, 8 deletions
diff --git a/internal/executor/executor.go b/internal/executor/executor.go
index 68ebdf3..d25d3b4 100644
--- a/internal/executor/executor.go
+++ b/internal/executor/executor.go
@@ -149,8 +149,13 @@ func (p *Pool) execute(ctx context.Context, t *task.Task) {
p.store.UpdateTaskState(t.ID, task.StateFailed)
}
} else {
- exec.Status = "COMPLETED"
- p.store.UpdateTaskState(t.ID, task.StateCompleted)
+ if t.ParentTaskID == "" {
+ exec.Status = "READY"
+ p.store.UpdateTaskState(t.ID, task.StateReady)
+ } else {
+ exec.Status = "COMPLETED"
+ p.store.UpdateTaskState(t.ID, task.StateCompleted)
+ }
}
if updateErr := p.store.UpdateExecution(exec); updateErr != nil {
diff --git a/internal/executor/executor_test.go b/internal/executor/executor_test.go
index 5d6a55a..18a79bb 100644
--- a/internal/executor/executor_test.go
+++ b/internal/executor/executor_test.go
@@ -73,13 +73,41 @@ func makeTask(id string) *task.Task {
}
}
-func TestPool_Submit_Success(t *testing.T) {
+func TestPool_Submit_TopLevel_GoesToReady(t *testing.T) {
store := testStore(t)
runner := &mockRunner{}
logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelError}))
pool := NewPool(2, runner, store, logger)
- tk := makeTask("ps-1")
+ tk := makeTask("ps-1") // no ParentTaskID → top-level
+ store.CreateTask(tk)
+
+ if err := pool.Submit(context.Background(), tk); err != nil {
+ t.Fatalf("submit: %v", err)
+ }
+
+ result := <-pool.Results()
+ if result.Err != nil {
+ t.Errorf("expected no error, got: %v", result.Err)
+ }
+ if result.Execution.Status != "READY" {
+ t.Errorf("status: want READY, got %q", result.Execution.Status)
+ }
+
+ got, _ := store.GetTask("ps-1")
+ if got.State != task.StateReady {
+ t.Errorf("task state: want READY, got %v", got.State)
+ }
+}
+
+func TestPool_Submit_Subtask_GoesToCompleted(t *testing.T) {
+ store := testStore(t)
+ runner := &mockRunner{}
+ logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelError}))
+ pool := NewPool(2, runner, store, logger)
+
+ tk := makeTask("sub-1")
+ tk.ParentTaskID = "parent-99" // subtask
store.CreateTask(tk)
if err := pool.Submit(context.Background(), tk); err != nil {
@@ -94,8 +122,7 @@ func TestPool_Submit_Success(t *testing.T) {
t.Errorf("status: want COMPLETED, got %q", result.Execution.Status)
}
- // Verify task state in DB.
- got, _ := store.GetTask("ps-1")
+ got, _ := store.GetTask("sub-1")
if got.State != task.StateCompleted {
t.Errorf("task state: want COMPLETED, got %v", got.State)
}
@@ -195,8 +222,8 @@ func TestPool_ConcurrentExecution(t *testing.T) {
for i := 0; i < 3; i++ {
result := <-pool.Results()
- if result.Execution.Status != "COMPLETED" {
- t.Errorf("task %s: want COMPLETED, got %q", result.TaskID, result.Execution.Status)
+ if result.Execution.Status != "READY" {
+ t.Errorf("task %s: want READY, got %q", result.TaskID, result.Execution.Status)
}
}