filed
Job queue using FUSE
git clone git://mccd.space/filed
| Log | Files | Refs | README | LICENSE |
jobs_test.go (3264B)
1 package store
2
3 import (
4 "path/filepath"
5 "testing"
6 )
7
8 // Create a new store in a temporary directory for each test.
9 func setupTestDB(t *testing.T) *Store {
10 t.Helper()
11 tmpDir := t.TempDir()
12 dbPath := filepath.Join(tmpDir, "jobs.db")
13
14 store, err := NewStore(dbPath)
15 if err != nil {
16 t.Fatalf("Failed to create store: %v", err)
17 }
18
19 t.Cleanup(func() {
20 store.Close()
21 })
22
23 return store
24 }
25
26 func TestCreateJob(t *testing.T) {
27 s := setupTestDB(t)
28
29 jobID := "job-123"
30 cmd := "echo hello"
31
32 job, err := s.CreateJob(jobID, cmd)
33 if err != nil {
34 t.Fatalf("Failed to create job: %v", err)
35 }
36
37 if job.ID != jobID {
38 t.Errorf("Expected ID %s, got %s", jobID, job.ID)
39 }
40 if job.State != StatePending {
41 t.Errorf("Expected state %s, got %s", StatePending, job.State)
42 }
43 if job.Command != cmd {
44 t.Errorf("Expected command %s, got %s", cmd, job.Command)
45 }
46 }
47
48 func TestGetJob(t *testing.T) {
49 s := setupTestDB(t)
50 jobID := "test-job-get"
51
52 _, err := s.CreateJob(jobID, "sleep 1")
53 if err != nil {
54 t.Fatalf("CreateJob failed: %v", err)
55 }
56
57 // Retrieve it
58 job, err := s.GetJob(jobID)
59 if err != nil {
60 t.Fatalf("GetJob failed: %v", err)
61 }
62
63 if job.ID != jobID {
64 t.Errorf("Expected retrieved ID to match")
65 }
66 }
67
68 func TestLifecycleTransitions(t *testing.T) {
69 s := setupTestDB(t)
70 jobID := "lifecycle-1"
71
72 _, err := s.CreateJob(jobID, "echo hello")
73 if err != nil {
74 t.Fatalf("CreateJob failed: %v", err)
75 }
76
77 // 1. Pending -> Running (AttemptJob)
78 if err := s.AttemptJob(jobID); err != nil {
79 t.Fatalf("AttemptJob failed: %v", err)
80 }
81
82 j, _ := s.GetJob(jobID)
83 if j.State != StateRunning {
84 t.Errorf("Expected state Running, got %s", j.State)
85 }
86 if j.Attempts != 1 {
87 t.Errorf("Expected attempts 1, got %d", j.Attempts)
88 }
89
90 // 2. Running -> Completed
91 if err := s.CompleteJob(jobID, []byte("hello")); err != nil {
92 t.Fatalf("CompleteJob failed: %v", err)
93 }
94
95 j, _ = s.GetJob(jobID)
96 if j.State != StateCompleted {
97 t.Errorf("Expected state Completed, got %s", j.State)
98 }
99
100 // 3. Restart (Completed -> Pending)
101 if err := s.RestartJob(jobID, nil); err != nil {
102 t.Fatalf("RestartJob failed: %v", err)
103 }
104
105 j, _ = s.GetJob(jobID)
106 if j.State != StatePending {
107 t.Errorf("Expected state Pending after restart, got %s", j.State)
108 }
109 }
110
111 func TestListJobsByState(t *testing.T) {
112 s := setupTestDB(t)
113
114 s.CreateJob("p1", "cmd1")
115 s.CreateJob("p2", "cmd2")
116
117 s.CreateJob("c1", "cmd3")
118 s.CompleteJob("c1", []byte("out"))
119
120 // List Pending
121 pending, err := s.ListJobsByState(StatePending)
122 if err != nil {
123 t.Fatalf("ListJobsByState failed: %v", err)
124 }
125
126 if len(pending) != 2 {
127 t.Errorf("Expected 2 pending jobs, got %d", len(pending))
128 }
129
130 // List Completed
131 completed, err := s.ListJobsByState(StateCompleted)
132 if err != nil {
133 t.Fatalf("ListJobsByState failed: %v", err)
134 }
135 if len(completed) != 1 {
136 t.Errorf("Expected 1 completed job, got %d", len(completed))
137 }
138 if completed[0].ID != "c1" {
139 t.Errorf("Expected completed job to be c1")
140 }
141 }
142
143 func TestDeleteJob(t *testing.T) {
144 s := setupTestDB(t)
145 jobID := "del-1"
146
147 s.CreateJob(jobID, "cmd")
148
149 if err := s.DeleteJob(jobID); err != nil {
150 t.Fatalf("DeleteJob failed: %v", err)
151 }
152
153 _, err := s.GetJob(jobID)
154 if err == nil {
155 t.Error("Expected error getting deleted job, got nil")
156 }
157 }