@@ -2,6 +2,7 @@ package test
22
33import (
44 "fmt"
5+ "sort"
56 "sync"
67 "time"
78
@@ -113,6 +114,8 @@ func (dbt *dbTest) GetAllTasks() []types.TaskIndex {
113114 taskIDs = append (taskIDs , types .TaskIndex (task .TaskID ))
114115 }
115116
117+ dbt .sortTaskList (taskIDs )
118+
116119 return taskIDs
117120}
118121
@@ -149,6 +152,8 @@ func (dbt *dbTest) GetAllCleanupTasks() []types.TaskIndex {
149152 taskIDs = append (taskIDs , types .TaskIndex (task .TaskID ))
150153 }
151154
155+ dbt .sortTaskList (taskIDs )
156+
152157 return taskIDs
153158}
154159
@@ -172,6 +177,60 @@ func (dbt *dbTest) GetRootCleanupTasks() []types.TaskIndex {
172177 return taskIDs
173178}
174179
180+ func (dbt * dbTest ) sortTaskList (taskList []types.TaskIndex ) {
181+ taskMap := map [types.TaskIndex ]* db.TaskStateIndex {}
182+
183+ for _ , task := range dbt .taskIndex {
184+ taskMap [types .TaskIndex (task .TaskID )] = task
185+ }
186+
187+ sort .Slice (taskList , func (a , b int ) bool {
188+ taskStateA := taskMap [taskList [a ]]
189+ taskStateB := taskMap [taskList [b ]]
190+
191+ if taskStateA == nil || taskStateB == nil {
192+ return false
193+ }
194+
195+ if taskStateA .ParentTask == taskStateB .ParentTask {
196+ return taskStateA .TaskID < taskStateB .TaskID
197+ }
198+
199+ for {
200+ switch {
201+ case taskStateA .ParentTask == int (taskList [b ]):
202+ return false
203+ case taskStateB .ParentTask == int (taskList [a ]):
204+ return true
205+ }
206+
207+ taskStateADepth := 0
208+ for taskState := taskStateA ; taskState != nil && taskState .ParentTask != 0 ; taskState = taskMap [types .TaskIndex (taskState .ParentTask )] {
209+ taskStateADepth ++
210+ }
211+
212+ taskStateBDepth := 0
213+ for taskState := taskStateB ; taskState != nil && taskState .ParentTask != 0 ; taskState = taskMap [types .TaskIndex (taskState .ParentTask )] {
214+ taskStateBDepth ++
215+ }
216+
217+ switch {
218+ case taskStateADepth > taskStateBDepth :
219+ taskStateA = taskMap [types .TaskIndex (taskStateA .ParentTask )]
220+ case taskStateBDepth > taskStateADepth :
221+ taskStateB = taskMap [types .TaskIndex (taskStateB .ParentTask )]
222+ default :
223+ taskStateA = taskMap [types .TaskIndex (taskStateA .ParentTask )]
224+ taskStateB = taskMap [types .TaskIndex (taskStateB .ParentTask )]
225+ }
226+
227+ if taskStateA .ParentTask == taskStateB .ParentTask {
228+ return taskStateA .TaskID < taskStateB .TaskID
229+ }
230+ }
231+ })
232+ }
233+
175234func (dbt * dbTest ) GetTaskState (taskIndex types.TaskIndex ) types.TaskState {
176235 task , err := dbt .database .GetTaskStateByTaskID (dbt .runID , int (taskIndex ))
177236 if err != nil {
0 commit comments