Implement ListJobs in Controller with tests 67/162367/2
authorLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Thu, 30 Nov 2017 12:02:00 +0000 (13:02 +0100)
committerLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Mon, 4 Dec 2017 10:01:24 +0000 (11:01 +0100)
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 <l.wojciechow@partner.samsung.com>
controller/controller.go
controller/controller_test.go
controller/jobscontroller.go
controller/jobscontrollerimpl.go
controller/jobscontrollerimpl_test.go
controller/mock/jobscontroller.go

index 200fc1c..691c720 100644 (file)
@@ -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
index efc3b30..3867271 100644 (file)
@@ -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() {
index 369dddc..e670efb 100644 (file)
@@ -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)
 }
index adff3cf..3258343 100644 (file)
@@ -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
+}
index 976f6d9..636073a 100644 (file)
@@ -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)
+                       })
+               })
        })
 })
index 4d52ce4..9f4c605 100644 (file)
@@ -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)
+}