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  }