github.com/justinjmoses/evergreen@v0.0.0-20170530173719-1d50e381ff0d/scheduler/task_queue_persister_test.go (about) 1 package scheduler 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/evergreen-ci/evergreen/db" 8 "github.com/evergreen-ci/evergreen/model" 9 "github.com/evergreen-ci/evergreen/model/task" 10 "github.com/evergreen-ci/evergreen/testutil" 11 "github.com/mongodb/grip" 12 . "github.com/smartystreets/goconvey/convey" 13 ) 14 15 var taskQueuePersisterTestConf = testutil.TestConfig() 16 17 func init() { 18 db.SetGlobalSessionProvider(db.SessionFactoryFromConfig(taskQueuePersisterTestConf)) 19 grip.CatchError(grip.SetSender(testutil.SetupTestSender(taskQueuePersisterTestConf.Scheduler.LogFile))) 20 } 21 22 func TestDBTaskQueuePersister(t *testing.T) { 23 24 var taskQueuePersister *DBTaskQueuePersister 25 var distroIds []string 26 var displayNames []string 27 var buildVariants []string 28 var RevisionOrderNumbers []int 29 var requesters []string 30 var gitspecs []string 31 var projects []string 32 var taskIds []string 33 var durations []time.Duration 34 var tasks []task.Task 35 36 Convey("With a DBTaskQueuePersister", t, func() { 37 38 taskQueuePersister = &DBTaskQueuePersister{} 39 distroIds = []string{"d1", "d2"} 40 taskIds = []string{"t1", "t2", "t3", "t4", "t5"} 41 displayNames = []string{"dn1", "dn2", "dn3", "dn4", "dn5"} 42 buildVariants = []string{"bv1", "bv2", "bv3", "bv4", "bv5"} 43 RevisionOrderNumbers = []int{0, 1, 2, 3, 4} 44 requesters = []string{"r1", "r2", "r3", "r4", "r5"} 45 gitspecs = []string{"g1", "g2", "g3", "g4", "g5"} 46 projects = []string{"p1", "p2", "p3", "p4", "p5"} 47 durations = []time.Duration{ 48 time.Duration(1) * time.Minute, 49 time.Duration(2) * time.Minute, 50 time.Duration(3) * time.Minute, 51 time.Duration(4) * time.Minute, 52 } 53 54 tasks = []task.Task{ 55 { 56 Id: taskIds[0], 57 DisplayName: displayNames[0], 58 BuildVariant: buildVariants[0], 59 RevisionOrderNumber: RevisionOrderNumbers[0], 60 Requester: requesters[0], 61 Revision: gitspecs[0], 62 Project: projects[0], 63 }, 64 { 65 Id: taskIds[1], 66 DisplayName: displayNames[1], 67 BuildVariant: buildVariants[1], 68 RevisionOrderNumber: RevisionOrderNumbers[1], 69 Requester: requesters[1], 70 Revision: gitspecs[1], 71 Project: projects[1], 72 }, 73 { 74 Id: taskIds[2], 75 DisplayName: displayNames[2], 76 BuildVariant: buildVariants[2], 77 RevisionOrderNumber: RevisionOrderNumbers[2], 78 Requester: requesters[2], 79 Revision: gitspecs[2], 80 Project: projects[2], 81 }, 82 { 83 Id: taskIds[3], 84 DisplayName: displayNames[3], 85 BuildVariant: buildVariants[3], 86 RevisionOrderNumber: RevisionOrderNumbers[3], 87 Requester: requesters[3], 88 Revision: gitspecs[3], 89 Project: projects[3], 90 }, 91 { 92 Id: taskIds[4], 93 DisplayName: displayNames[4], 94 BuildVariant: buildVariants[4], 95 RevisionOrderNumber: RevisionOrderNumbers[4], 96 Requester: requesters[4], 97 Revision: gitspecs[4], 98 Project: projects[4], 99 }, 100 } 101 102 durationMappings := model.ProjectTaskDurations{ 103 map[string]*model.BuildVariantTaskDurations{ 104 projects[0]: { 105 map[string]*model.TaskDurations{ 106 buildVariants[0]: { 107 map[string]time.Duration{ 108 displayNames[0]: durations[0], 109 }, 110 }, 111 }, 112 }, 113 projects[1]: { 114 map[string]*model.TaskDurations{ 115 buildVariants[1]: { 116 map[string]time.Duration{ 117 displayNames[1]: durations[1], 118 }, 119 }, 120 }, 121 }, 122 projects[2]: { 123 map[string]*model.TaskDurations{ 124 buildVariants[2]: { 125 map[string]time.Duration{ 126 displayNames[2]: durations[2], 127 }, 128 }, 129 }, 130 }, 131 projects[3]: { 132 map[string]*model.TaskDurations{ 133 buildVariants[3]: { 134 map[string]time.Duration{ 135 displayNames[3]: durations[3], 136 }, 137 }, 138 }, 139 }, 140 }, 141 } 142 143 So(db.Clear(model.TaskQueuesCollection), ShouldBeNil) 144 145 Convey("saving task queues should place them in the database with the "+ 146 "correct ordering of tasks along with the relevant average task "+ 147 "completion times", func() { 148 _, err := taskQueuePersister.PersistTaskQueue(distroIds[0], 149 []task.Task{tasks[0], tasks[1], tasks[2]}, 150 durationMappings) 151 So(err, ShouldBeNil) 152 _, err = taskQueuePersister.PersistTaskQueue(distroIds[1], 153 []task.Task{tasks[3], tasks[4]}, 154 durationMappings) 155 So(err, ShouldBeNil) 156 157 taskQueue, err := model.FindTaskQueueForDistro(distroIds[0]) 158 So(err, ShouldBeNil) 159 So(len(taskQueue.Queue), ShouldEqual, 3) 160 161 So(taskQueue.Queue[0].Id, ShouldEqual, taskIds[0]) 162 So(taskQueue.Queue[0].DisplayName, ShouldEqual, 163 tasks[0].DisplayName) 164 So(taskQueue.Queue[0].BuildVariant, ShouldEqual, 165 tasks[0].BuildVariant) 166 So(taskQueue.Queue[0].RevisionOrderNumber, ShouldEqual, 167 tasks[0].RevisionOrderNumber) 168 So(taskQueue.Queue[0].Requester, ShouldEqual, tasks[0].Requester) 169 So(taskQueue.Queue[0].Revision, ShouldEqual, tasks[0].Revision) 170 So(taskQueue.Queue[0].Project, ShouldEqual, tasks[0].Project) 171 So(taskQueue.Queue[0].ExpectedDuration, ShouldEqual, durations[0]) 172 173 So(taskQueue.Queue[1].Id, ShouldEqual, taskIds[1]) 174 So(taskQueue.Queue[1].DisplayName, ShouldEqual, 175 tasks[1].DisplayName) 176 So(taskQueue.Queue[1].BuildVariant, ShouldEqual, 177 tasks[1].BuildVariant) 178 So(taskQueue.Queue[1].RevisionOrderNumber, ShouldEqual, 179 tasks[1].RevisionOrderNumber) 180 So(taskQueue.Queue[1].Requester, ShouldEqual, tasks[1].Requester) 181 So(taskQueue.Queue[1].Revision, ShouldEqual, tasks[1].Revision) 182 So(taskQueue.Queue[1].Project, ShouldEqual, tasks[1].Project) 183 So(taskQueue.Queue[1].ExpectedDuration, ShouldEqual, durations[1]) 184 185 So(taskQueue.Queue[2].Id, ShouldEqual, taskIds[2]) 186 So(taskQueue.Queue[2].DisplayName, ShouldEqual, 187 tasks[2].DisplayName) 188 So(taskQueue.Queue[2].BuildVariant, ShouldEqual, 189 tasks[2].BuildVariant) 190 So(taskQueue.Queue[2].RevisionOrderNumber, ShouldEqual, 191 tasks[2].RevisionOrderNumber) 192 So(taskQueue.Queue[2].Requester, ShouldEqual, tasks[2].Requester) 193 So(taskQueue.Queue[2].Revision, ShouldEqual, tasks[2].Revision) 194 So(taskQueue.Queue[2].Project, ShouldEqual, tasks[2].Project) 195 So(taskQueue.Queue[2].ExpectedDuration, ShouldEqual, durations[2]) 196 197 taskQueue, err = model.FindTaskQueueForDistro(distroIds[1]) 198 So(err, ShouldBeNil) 199 So(len(taskQueue.Queue), ShouldEqual, 2) 200 201 So(taskQueue.Queue[0].Id, ShouldEqual, taskIds[3]) 202 So(taskQueue.Queue[0].DisplayName, ShouldEqual, 203 tasks[3].DisplayName) 204 So(taskQueue.Queue[0].BuildVariant, ShouldEqual, 205 tasks[3].BuildVariant) 206 So(taskQueue.Queue[0].RevisionOrderNumber, ShouldEqual, 207 tasks[3].RevisionOrderNumber) 208 So(taskQueue.Queue[0].Requester, ShouldEqual, tasks[3].Requester) 209 So(taskQueue.Queue[0].Revision, ShouldEqual, tasks[3].Revision) 210 So(taskQueue.Queue[0].Project, ShouldEqual, tasks[3].Project) 211 So(taskQueue.Queue[0].ExpectedDuration, ShouldEqual, durations[3]) 212 213 So(taskQueue.Queue[1].Id, ShouldEqual, taskIds[4]) 214 So(taskQueue.Queue[1].DisplayName, ShouldEqual, 215 tasks[4].DisplayName) 216 So(taskQueue.Queue[1].BuildVariant, ShouldEqual, 217 tasks[4].BuildVariant) 218 So(taskQueue.Queue[1].RevisionOrderNumber, ShouldEqual, 219 tasks[4].RevisionOrderNumber) 220 So(taskQueue.Queue[1].Requester, ShouldEqual, tasks[4].Requester) 221 So(taskQueue.Queue[1].Revision, ShouldEqual, tasks[4].Revision) 222 So(taskQueue.Queue[1].Project, ShouldEqual, tasks[4].Project) 223 So(taskQueue.Queue[1].ExpectedDuration, ShouldEqual, 224 model.DefaultTaskDuration) 225 }) 226 227 }) 228 229 }