From 33334ae71355e41e8050a56933f0f4f4977127ba Mon Sep 17 00:00:00 2001 From: Lukasz Wojciechowski Date: Thu, 30 Nov 2017 13:02:00 +0100 Subject: [PATCH] Implement ListJobs in Controller with tests Implementation enhances JobsController interface and implementation. The mockup of JobsController is regenerated using: mockgen -source=controller/jobscontroller.go \ -destination=controller/mock/jobscontroller.go \ -package mock \ -imports ".=git.tizen.org/tools/weles" Tests for both JobsControllerImpl and Controller are updated. Change-Id: Ie30234ac754d19616ce2811e3f30a6834d28e296 Signed-off-by: Lukasz Wojciechowski --- controller/controller.go | 2 +- controller/controller_test.go | 16 +++++++++---- controller/jobscontroller.go | 4 ++++ controller/jobscontrollerimpl.go | 24 +++++++++++++++++++ controller/jobscontrollerimpl_test.go | 43 +++++++++++++++++++++++++++++++++++ controller/mock/jobscontroller.go | 13 +++++++++++ 6 files changed, 97 insertions(+), 5 deletions(-) diff --git a/controller/controller.go b/controller/controller.go index 200fc1c..691c720 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -105,7 +105,7 @@ func (c *Controller) CancelJob(j JobID) error { // and contains information about requested Jobs only. // It is a part of JobManager implementation. func (c *Controller) ListJobs(filter []JobID) ([]JobInfo, error) { - return nil, ErrNotImplemented + return c.jobs.List(filter) } // loop implements main loop of the Controller reacting to different events diff --git a/controller/controller_test.go b/controller/controller_test.go index efc3b30..3867271 100644 --- a/controller/controller_test.go +++ b/controller/controller_test.go @@ -143,12 +143,20 @@ var _ = Describe("Controller", func() { }) }) Describe("ListJobs", func() { - It("should not be implemented yet", func() { + It("should call JobsController method", func() { filter := []JobID{2, 3, 5} - info, err := h.ListJobs(filter) + list := []JobInfo{ + JobInfo{ + JobID: JobID(67), + Name: "test name", + }, + } + jc.EXPECT().List(filter).Return(list, err) - Expect(err).To(Equal(ErrNotImplemented)) - Expect(info).To(BeZero()) + ret, retErr := h.ListJobs(filter) + + Expect(retErr).To(Equal(err)) + Expect(ret).To(Equal(list)) }) }) Describe("Actions", func() { diff --git a/controller/jobscontroller.go b/controller/jobscontroller.go index 369dddc..e670efb 100644 --- a/controller/jobscontroller.go +++ b/controller/jobscontroller.go @@ -50,4 +50,8 @@ type JobsController interface { SetDryad(JobID, Dryad) error // GetConfig returns Dryad acquired for the Job. GetDryad(JobID) (Dryad, error) + // List returns information about Jobs. If argument is a nil/empty slice + // information about all Jobs is returned. Otherwise result is filtered + // and contains information about requested Jobs only. + List([]JobID) ([]JobInfo, error) } diff --git a/controller/jobscontrollerimpl.go b/controller/jobscontrollerimpl.go index adff3cf..3258343 100644 --- a/controller/jobscontrollerimpl.go +++ b/controller/jobscontrollerimpl.go @@ -229,3 +229,27 @@ func (js *JobsControllerImpl) GetDryad(j JobID) (Dryad, error) { return job.dryad, nil } + +// List returns information about Jobs. If argument is a nil/empty slice +// information about all Jobs is returned. Otherwise result is filtered +// and contains information about requested Jobs only. +func (js *JobsControllerImpl) List(filter []JobID) ([]JobInfo, error) { + js.mutex.RLock() + defer js.mutex.RUnlock() + var ret []JobInfo + if len(filter) == 0 { + // Get all Jobs. + for _, job := range js.jobs { + ret = append(ret, job.JobInfo) + } + } else { + // Get filtered Jobs. + for _, j := range filter { + job, ok := js.jobs[j] + if ok { + ret = append(ret, job.JobInfo) + } + } + } + return ret, nil +} diff --git a/controller/jobscontrollerimpl_test.go b/controller/jobscontrollerimpl_test.go index 976f6d9..636073a 100644 --- a/controller/jobscontrollerimpl_test.go +++ b/controller/jobscontrollerimpl_test.go @@ -302,5 +302,48 @@ var _ = Describe("JobsControllerImpl", func() { Expect(dryad).To(BeZero()) }) }) + + Describe("List", func() { + var jobids []JobID + const elems int = 5 + expectIDs := func(result []JobInfo, expected []JobID) { + Expect(len(result)).To(Equal(len(expected))) + for _, j := range expected { + Expect(result).To(ContainElement(WithTransform(func(info JobInfo) JobID { + return info.JobID + }, Equal(j)))) + } + } + BeforeEach(func() { + jobids = []JobID{} + for i := 1; i <= elems; i++ { + j, err := jc.NewJob(yaml) + Expect(err).NotTo(HaveOccurred()) + jobids = append(jobids, j) + } + }) + It("should return all Jobs if filter is nil", func() { + list, err := jc.List(nil) + Expect(err).NotTo(HaveOccurred()) + expectIDs(list, jobids) + }) + It("should return all Jobs if filter is empty", func() { + list, err := jc.List([]JobID{}) + Expect(err).NotTo(HaveOccurred()) + expectIDs(list, jobids) + }) + It("should return only filtered Jobs", func() { + filter := []JobID{jobids[1], jobids[2]} + list, err := jc.List(filter) + Expect(err).NotTo(HaveOccurred()) + expectIDs(list, filter) + }) + It("should ignore not existing Jobs listed in filter", func() { + filter := []JobID{jobids[1], jobids[2]} + list, err := jc.List(append(filter, JobID(0x0BCA))) + Expect(err).NotTo(HaveOccurred()) + expectIDs(list, filter) + }) + }) }) }) diff --git a/controller/mock/jobscontroller.go b/controller/mock/jobscontroller.go index 4d52ce4..9f4c605 100644 --- a/controller/mock/jobscontroller.go +++ b/controller/mock/jobscontroller.go @@ -120,3 +120,16 @@ func (m *MockJobsController) GetDryad(arg0 JobID) (Dryad, error) { func (mr *MockJobsControllerMockRecorder) GetDryad(arg0 interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDryad", reflect.TypeOf((*MockJobsController)(nil).GetDryad), arg0) } + +// List mocks base method +func (m *MockJobsController) List(arg0 []JobID) ([]JobInfo, error) { + ret := m.ctrl.Call(m, "List", arg0) + ret0, _ := ret[0].([]JobInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// List indicates an expected call of List +func (mr *MockJobsControllerMockRecorder) List(arg0 interface{}) *gomock.Call { + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockJobsController)(nil).List), arg0) +} -- 2.7.4