示例#1
0
    def test_abort(self):
        rq1 = ResourceReply(Request(id=unique_id.toMsg(TEST_UUID),
                                    resources=[TEST_RESOURCE],
                                    status=Request.NEW))
        rq1.abort()
        self.assertEqual(rq1.msg.status, Request.ABORTED)

        rq2 = ResourceReply(Request(id=unique_id.toMsg(TEST_UUID),
                                    resources=[TEST_RESOURCE],
                                    status=Request.WAITING))
        rq2.abort()
        self.assertEqual(rq2.msg.status, Request.ABORTED)

        rq3 = ResourceReply(Request(id=unique_id.toMsg(TEST_UUID),
                                    resources=[TEST_RESOURCE],
                                    status=Request.PREEMPTING))
        rq3.abort()
        self.assertEqual(rq3.msg.status, Request.ABORTED)

        rq4 = ResourceReply(Request(id=unique_id.toMsg(TEST_UUID),
                                    resources=[TEST_RESOURCE],
                                    status=Request.PREEMPTED))
        rq4.abort()
        self.assertEqual(rq4.msg.status, Request.ABORTED)

        rq5 = ResourceReply(Request(id=unique_id.toMsg(TEST_UUID),
                                    resources=[TEST_WILDCARD],
                                    status=Request.GRANTED))
        rq5.abort()
        self.assertEqual(rq5.msg.status, Request.ABORTED)
示例#2
0
    def test_reject(self):
        rq1 = ResourceReply(Request(id=unique_id.toMsg(TEST_UUID),
                                    resources=[TEST_RESOURCE],
                                    status=Request.NEW))
        rq1.reject()
        self.assertEqual(rq1.msg.status, Request.REJECTED)

        rq2 = ResourceReply(Request(id=unique_id.toMsg(TEST_UUID),
                                    resources=[TEST_RESOURCE],
                                    status=Request.WAITING))
        rq2.reject()
        self.assertEqual(rq2.msg.status, Request.REJECTED)

        rq3 = ResourceReply(Request(id=unique_id.toMsg(TEST_UUID),
                                    resources=[TEST_RESOURCE],
                                    status=Request.PREEMPTING))
        rq3.reject()
        self.assertEqual(rq3.msg.status, Request.REJECTED)

        rq4 = ResourceReply(Request(id=unique_id.toMsg(TEST_UUID),
                                    resources=[TEST_RESOURCE],
                                    status=Request.PREEMPTED))
        rq4.reject()
        self.assertEqual(rq4.msg.status, Request.REJECTED)

        rq5 = ResourceReply(Request(id=unique_id.toMsg(TEST_UUID),
                                    resources=[TEST_WILDCARD],
                                    status=Request.GRANTED))
        self.assertRaises(TransitionError, rq5.reject)
示例#3
0
    def test_constructor(self):
        msg1 = Request(id=unique_id.toMsg(TEST_UUID),
                       resources=[TEST_WILDCARD],
                       status=Request.NEW)
        rq1 = ResourceRequest(msg1)
        self.assertIsNotNone(rq1)
        self.assertEqual(str(rq1),
                         'id: 01234567-89ab-cdef-fedc-ba9876543210\n'
                         '    priority: 0\n'
                         '    resources: \n'
                         '      linux.precise.ros.segbot.*/test_rapp\n'
                         '    status: 0')
        self.assertEqual(rq1.msg.status, Request.NEW)
        self.assertEqual(rq1.msg.resources, [TEST_WILDCARD])

        # why is this broken???
        #self.assertEqual(rq1.get_uuid, TEST_UUID)

        rq2 = ResourceRequest(Request(id=unique_id.toMsg(DIFF_UUID),
                                      resources=[TEST_RESOURCE],
                                      status=Request.NEW))
        self.assertEqual(rq2.msg.status, Request.NEW)
        self.assertEqual(rq2.msg.resources, [TEST_RESOURCE])
        self.assertEqual(rq2.get_uuid(), DIFF_UUID)
        self.assertEqual(str(rq2),
                         'id: 01234567-cdef-fedc-89ab-ba9876543210\n'
                         '    priority: 0\n'
                         '    resources: \n'
                         '      linux.precise.ros.segbot.roberto/test_rapp\n'
                         '    status: 0')
示例#4
0
    def test_canceled_merge_plus_new_request(self):
        msg1 = Request(id=unique_id.toMsg(TEST_UUID),
                       resources=[TEST_RESOURCE],
                       status=Request.CANCELING)
        msg2 = Request(id=unique_id.toMsg(DIFF_UUID),
                       resources=[TEST_WILDCARD],
                       status=Request.NEW)
        rset = RequestSet([msg1, msg2], RQR_UUID)
        self.assertEqual(len(rset), 2)
        self.assertIn(TEST_UUID, rset)
        self.assertIn(DIFF_UUID, rset)
        self.assertEqual(rset[DIFF_UUID].msg.status, Request.NEW)

        # merge a canceled request: TEST_UUID should be deleted, but
        # DIFF_UUID should not
        msg3 = Request(id=unique_id.toMsg(TEST_UUID),
                       resources=[TEST_RESOURCE],
                       status=Request.CLOSED)
        rel_rset = RequestSet([msg3], RQR_UUID)
        rset.merge(rel_rset)
        self.assertEqual(len(rset), 1)
        self.assertNotIn(TEST_UUID, rset)
        self.assertIn(DIFF_UUID, rset)
        self.assertEqual(rset[DIFF_UUID].msg.status, Request.NEW)

        # make a fresh object like the original msg2 for comparison
        msg4 = Request(id=unique_id.toMsg(DIFF_UUID),
                       resources=[TEST_WILDCARD],
                       status=Request.NEW)
        self.assertEqual(rset, RequestSet([msg4], RQR_UUID))
        self.assertNotEqual(rset, rel_rset)
示例#5
0
    def test_constructor(self):
        msg1 = Request(id=unique_id.toMsg(TEST_UUID),
                       resources=[TEST_WILDCARD],
                       status=Request.NEW)
        rq1 = ResourceRequest(msg1)
        self.assertIsNotNone(rq1)
        self.assertEqual(
            str(rq1), """id: 01234567-89ab-cdef-fedc-ba9876543210
    priority: 0
    resources: 
      rocon:/segbot#test_rapp
    status: 0""")
        self.assertEqual(rq1.msg.status, Request.NEW)
        self.assertEqual(rq1.msg.resources, [TEST_WILDCARD])
        self.assertEqual(rq1.uuid, TEST_UUID)

        rq2 = ResourceRequest(
            Request(id=unique_id.toMsg(DIFF_UUID),
                    resources=[TEST_RESOURCE],
                    status=Request.NEW))
        self.assertEqual(rq2.msg.status, Request.NEW)
        self.assertEqual(rq2.msg.resources, [TEST_RESOURCE])
        self.assertEqual(rq2.uuid, DIFF_UUID)
        self.assertEqual(
            str(rq2), """id: 01234567-cdef-fedc-89ab-ba9876543210
    priority: 0
    resources: 
      rocon:/segbot/roberto#test_rapp
    status: 0""")
 def test_validate(self):
     rq1 = ResourceRequest(Request(id=unique_id.toMsg(TEST_UUID),
                                   resources=[TEST_RESOURCE],
                                   status=Request.NEW))
     self.assertTrue(rq1._validate(Request.GRANTED))
     self.assertTrue(rq1._validate(Request.PREEMPTING))
     self.assertFalse(rq1._validate(Request.CLOSED))
示例#7
0
 def test_allocate_permutation_two_resources(self):
     """ Request a regexp allocation followed by an exact
     allocation.  Initially the exact resource gets assigned to the
     regexp, so the second part of the request fails.  The
     allocator must try the other permutation for it to succeed.
     """
     pool = ResourcePool(
         KnownResources(resources=[
             CurrentStatus(uri=MARVIN_NAME,
                           rapps={TELEOP_RAPP, EXAMPLE_RAPP}),
             CurrentStatus(uri=ROBERTO_NAME, rapps={TELEOP_RAPP})
         ]))
     rq = ActiveRequest(
         Request(id=unique_id.toMsg(RQ_UUID),
                 resources=[
                     Resource(rapp=TELEOP_RAPP, uri=ANY_NAME),
                     Resource(rapp=EXAMPLE_RAPP, uri=MARVIN_NAME)
                 ]))
     alloc = pool.allocate(rq)
     self.assertTrue(alloc)
     self.assertEqual(len(alloc), 2)
     self.assertEqual(pool[MARVIN_NAME].status, CurrentStatus.ALLOCATED)
     self.assertEqual(pool[MARVIN_NAME].owner, RQ_UUID)
     self.assertEqual(pool[ROBERTO_NAME].status, CurrentStatus.ALLOCATED)
     self.assertEqual(pool[ROBERTO_NAME].owner, RQ_UUID)
     self.assertEqual(alloc[0], Resource(rapp=TELEOP_RAPP,
                                         uri=ROBERTO_NAME))
     self.assertEqual(alloc[1], Resource(rapp=EXAMPLE_RAPP,
                                         uri=MARVIN_NAME))
    def new_request(self, resources, priority=None, uuid=None):
        """ Add a new scheduler request.

        Call this method for each desired new request, then invoke
        :py:meth:`.send_requests` to notify the scheduler.

        :param resources: ROCON resources requested
        :type resources: list of scheduler_msgs/Resource

        :param priority: Scheduling priority of this request.  If
            ``None`` provided, use this requester's priority.
        :type priority: int

        :param uuid: UUID_ of this request. If ``None`` provided, a
            random UUID will be assigned.
        :type uuid: :class:`uuid.UUID` or ``None``

        :returns: UUID (:class:`uuid.UUID`) assigned.
        :raises: :exc:`.WrongRequestError` if request already exists.
        """
        if priority is None:
            priority = self.priority
        if uuid is None:
            uuid = unique_id.fromRandom()
        if uuid in self.rset:
            raise WrongRequestError('UUID already in use.')
        msg = Request(id=unique_id.toMsg(uuid),
                      priority=priority,
                      resources=resources,
                      status=Request.NEW)
        self.rset[uuid] = ResourceRequest(msg)
        return uuid
示例#9
0
 def test_allocate_four_resources_success(self):
     """ Similar to test_allocate_four_resources_failure(), but the
     order of the request is different, so the allocator succeeds.
     """
     pool = ResourcePool(
         KnownResources(resources=[
             CurrentStatus(uri=DUDE1_NAME, rapps={TELEOP_RAPP}),
             CurrentStatus(uri=DUDE2_NAME, rapps={TELEOP_RAPP}),
             CurrentStatus(uri=DUDE3_NAME, rapps={TELEOP_RAPP}),
             CurrentStatus(uri=DUDE4_NAME,
                           rapps={TELEOP_RAPP, EXAMPLE_RAPP})
         ]))
     rq = ActiveRequest(
         Request(id=unique_id.toMsg(RQ_UUID),
                 resources=[
                     Resource(rapp=EXAMPLE_RAPP, uri=DUDE4_NAME),
                     Resource(rapp=TELEOP_RAPP, uri=DUDE2_NAME),
                     Resource(rapp=TELEOP_RAPP, uri=DUDE3_NAME),
                     Resource(rapp=TELEOP_RAPP, uri=ANY_NAME)
                 ]))
     alloc = pool.allocate(rq)
     self.assertTrue(alloc)
     bot_names = [DUDE4_NAME, DUDE2_NAME, DUDE3_NAME, DUDE1_NAME]
     for name, i in zip(bot_names, range(4)):
         self.assertEqual(pool[name].status, CurrentStatus.ALLOCATED)
         self.assertEqual(alloc[i].uri, name)
示例#10
0
 def test_allocate_four_resources_failure(self):
     """ Similar to test_allocate_permutation_two_resources(), but
     here there are more permutations, so the allocator gives up
     after the initial failure.
     """
     pool = ResourcePool(
         KnownResources(resources=[
             CurrentStatus(uri=DUDE1_NAME, rapps={TELEOP_RAPP}),
             CurrentStatus(uri=DUDE2_NAME, rapps={TELEOP_RAPP}),
             CurrentStatus(uri=DUDE3_NAME, rapps={TELEOP_RAPP}),
             CurrentStatus(uri=DUDE4_NAME,
                           rapps={TELEOP_RAPP, EXAMPLE_RAPP})
         ]))
     rq = ActiveRequest(
         Request(id=unique_id.toMsg(RQ_UUID),
                 resources=[
                     Resource(rapp=TELEOP_RAPP, uri=ANY_NAME),
                     Resource(rapp=EXAMPLE_RAPP, uri=DUDE4_NAME),
                     Resource(rapp=TELEOP_RAPP, uri=DUDE2_NAME),
                     Resource(rapp=TELEOP_RAPP, uri=DUDE3_NAME)
                 ]))
     self.assertRaises(InvalidRequestError, pool.allocate, rq)
     for name in [DUDE1_NAME, DUDE2_NAME, DUDE3_NAME, DUDE4_NAME]:
         self.assertEqual(pool[name].status, CurrentStatus.AVAILABLE)
         self.assertIsNone(pool[name].owner)
示例#11
0
    def test_one_request_set(self):
        msg1 = Request(id=unique_id.toMsg(TEST_UUID),
                       resources=[TEST_WILDCARD],
                       status=Request.NEW)
        rset = RequestSet([msg1], RQR_UUID, contents=ResourceReply)
        self.assertEqual(len(rset), 1)
        self.assertTrue(TEST_UUID in rset)
        self.assertEqual(rset[TEST_UUID].msg, msg1)
        self.assertEqual(rset.get(TEST_UUID), rset[TEST_UUID])
        self.assertFalse(DIFF_UUID in rset)
        self.assertIsNone(rset.get(DIFF_UUID))
        self.assertEqual(rset.get(DIFF_UUID, 10), 10)
        self.assertTrue(rset == RequestSet([msg1], RQR_UUID))
        self.assertTrue(rset == RequestSet([msg1], RQR_UUID,
                                           contents=ResourceReply))
        rs2 = copy.deepcopy(rset)
        self.assertTrue(rset == rs2)

        rset_str = """requester_id: 01234567-89ab-cdef-0123-456789abcdef
requests:
  id: 01234567-89ab-cdef-fedc-ba9876543210
    priority: 0
    resources: 
      linux.precise.ros.segbot.*/test_rapp
    status: 0"""
        self.assertEqual(str(rset), rset_str)

        sch_msg = SchedulerRequests(requester=unique_id.toMsg(RQR_UUID),
                                    requests=[msg1])
        self.assertEqual(rset.to_msg(stamp=rospy.Time()), sch_msg)
示例#12
0
 def test_insufficient_resources(self):
     # ask for two when there's only one
     pool = ResourcePool(KnownResources(resources=[ROBERTO]))
     rq1 = ActiveRequest(
         Request(id=unique_id.toMsg(RQ_UUID),
                 resources=[ANY_RESOURCE, ANY_RESOURCE]))
     alloc1 = pool.allocate(rq1)
     self.assertFalse(alloc1)
     self.assertEqual(pool[ROBERTO_NAME].status, CurrentStatus.AVAILABLE)
     self.assertIsNone(pool[ROBERTO_NAME].owner)
 def assert_invalid(self, request_type, old_status,
                    operation, exception, *args):
     """
     Assert that *request_type* with *old_status* rejects named
     *operation*, raising *exception*.
     """
     rq = request_type(Request(id=unique_id.toMsg(TEST_UUID),
                               resources=[TEST_WILDCARD],
                               status=old_status))
     op_method = getattr(rq, operation)
     self.assertRaises(exception, op_method, *args)
    def test_heap_queue(self):
        qe1 = QueueElement(ActiveRequest(
                Request(id=unique_id.toMsg(RQ1_UUID),
                        resources=[ROBERTO_RESOURCE],
                        priority=10)
                ), RQR_ID)
        qe2 = QueueElement(ActiveRequest(
                Request(id=unique_id.toMsg(RQ1_UUID),
                        resources=[MARVIN_RESOURCE],
                        priority=0)
                ), RQR_ID)
        self.assertLess(qe1, qe2)       # due to higher priority
        h = []
        heapq.heappush(h, qe2)
        heapq.heappush(h, qe1)
        self.assertEqual(len(h), 2)
        self.assertEqual(heapq.heappop(h), qe1)
        self.assertEqual(len(h), 1)
        heapq.heappush(h, qe1)
        self.assertEqual(len(h), 2)
        self.assertEqual(heapq.heappop(h), qe1)

        qe3 = QueueElement(ActiveRequest(
                Request(id=unique_id.toMsg(RQ1_UUID),
                        resources=[ROBERTO_RESOURCE])
                ), RQR_ID)
        qe4 = QueueElement(ActiveRequest(
                Request(id=unique_id.toMsg(RQ1_UUID),
                        resources=[MARVIN_RESOURCE])
                ), RQR_ID)
        self.assertLess(qe3, qe4)       # due to sequence number
        heapq.heappush(h, qe4)
        heapq.heappush(h, qe3)
        heapq.heappush(h, qe1)
        self.assertEqual(len(h), 4)
        self.assertEqual(heapq.heappop(h), qe1)
        self.assertEqual(heapq.heappop(h), qe2)
        self.assertEqual(heapq.heappop(h), qe3)
        self.assertEqual(heapq.heappop(h), qe4)
        self.assertEqual(len(h), 0)
        self.assertRaises(IndexError, heapq.heappop, h)
示例#15
0
    def test_single_merge(self):
        msg1 = Request(id=unique_id.toMsg(TEST_UUID),
                       resources=[TEST_WILDCARD],
                       status=Request.NEW)
        rset = RequestSet([msg1], RQR_UUID)
        self.assertEqual(rset[TEST_UUID].msg.status, Request.NEW)
        self.assertEqual(rset[TEST_UUID].msg.resources, [TEST_WILDCARD])
        self.assertEqual(rset[TEST_UUID].msg.id, unique_id.toMsg(TEST_UUID))

        # merge an updated request set: resource list should change
        msg2 = Request(id=unique_id.toMsg(TEST_UUID),
                       resources=[TEST_RESOURCE],
                       status=Request.GRANTED)
        rset.merge(RequestSet([msg2], RQR_UUID, contents=ActiveRequest))
        self.assertEqual(len(rset), 1)
        self.assertIn(TEST_UUID, rset)
        self.assertEqual(rset[TEST_UUID].msg.status, Request.GRANTED)
        self.assertEqual(rset[TEST_UUID].msg.resources, [TEST_RESOURCE])
        sch_msg = SchedulerRequests(requester=unique_id.toMsg(RQR_UUID),
                                    requests=[msg2])
        self.assertEqual(rset.to_msg(stamp=rospy.Time()), sch_msg)
示例#16
0
 def test_allocate(self):
     res1 = PoolResource(copy.deepcopy(TEST_RESOURCE))
     self.assertEqual(res1.status, CurrentStatus.AVAILABLE)
     self.assertEqual(res1.owner, None)
     res1.allocate(copy.deepcopy(ROBERTO_REQUEST))
     self.assertEqual(res1.status, CurrentStatus.ALLOCATED)
     self.assertEqual(res1.owner, RQ_UUID)
     self.assertRaises(
         ResourceNotAvailableError, res1.allocate,
         ActiveRequest(
             Request(id=unique_id.toMsg(DIFF_UUID),
                     resources=[ROBERTO_RESOURCE])))
示例#17
0
 def test_two_request_set(self):
     msg1 = Request(id=unique_id.toMsg(TEST_UUID),
                    resources=[TEST_WILDCARD])
     msg2 = Request(id=unique_id.toMsg(DIFF_UUID),
                    resources=[TEST_RESOURCE])
     rset = RequestSet([msg1, msg2], RQR_UUID)
     self.assertEqual(len(rset), 2)
     self.assertIn(TEST_UUID, rset)
     self.assertIn(DIFF_UUID, rset)
     self.assertEqual(rset[TEST_UUID].msg, msg1)
     self.assertEqual(rset[DIFF_UUID].msg, msg2)
     self.assertEqual(rset.get(TEST_UUID), rset[TEST_UUID])
     self.assertEqual(rset.get(DIFF_UUID), rset[DIFF_UUID])
     self.assertEqual(rset, RequestSet([msg1, msg2], RQR_UUID))
     self.assertEqual(rset, RequestSet([msg2, msg1], RQR_UUID))
     self.assertNotEqual(rset, RequestSet([msg1], RQR_UUID))
     self.assertNotEqual(rset, RequestSet([msg2], RQR_UUID))
     self.assertNotEqual(rset, RequestSet([], RQR_UUID))
     rs2 = copy.deepcopy(rset)
     self.assertEqual(rset, rs2)
     rs2[TEST_UUID]._transition(EVENT_GRANT)
     self.assertNotEqual(rset, rs2)
示例#18
0
    def new_request(self,
                    resources,
                    priority=None,
                    uuid=None,
                    reservation=rospy.Time(),
                    hold_time=rospy.Duration()):
        """ Add a new scheduler request.

        Call this method for each desired new request, then invoke
        :py:meth:`.send_requests` to notify the scheduler.

        :param resources: ROCON resources requested
        :type resources: list of scheduler_msgs/Resource

        :param priority: Scheduling priority of this request.  If
            ``None`` provided, use this requester's default priority.
        :type priority: int

        :param uuid: UUID_ of this request. If ``None`` provided, a
            random UUID will be assigned.
        :type uuid: :class:`uuid.UUID` or ``None``

        :param reservation: time when request desired, default:
            immediately.
        :type reservation: rospy.Time

        :param hold_time: estimated duration the resource will be
            held, default: unknown.
        :type hold_time: rospy.Duration

        :returns: UUID (:class:`uuid.UUID`) assigned.
        :raises: :exc:`.WrongRequestError` if request already exists.
        """
        if priority is None:
            priority = self.priority
        status = Request.NEW
        if reservation != rospy.Time():
            status = Request.RESERVED
        if uuid is None:
            uuid = unique_id.fromRandom()
        if uuid in self.rset:
            raise WrongRequestError('UUID already in use.')
        msg = Request(id=unique_id.toMsg(uuid),
                      priority=priority,
                      resources=resources,
                      status=status,
                      availability=reservation,
                      hold_time=hold_time)
        with self.lock:
            self.rset[uuid] = msg
        return uuid
示例#19
0
    def test_release(self):
        rq1 = ResourceRequest(Request(id=unique_id.toMsg(TEST_UUID),
                                      resources=[TEST_RESOURCE],
                                      status=Request.GRANTED))
        rq1.release()
        self.assertEqual(rq1.msg.status, Request.RELEASING)

        rq2 = ResourceRequest(Request(id=unique_id.toMsg(TEST_UUID),
                                      resources=[TEST_RESOURCE],
                                      status=Request.WAITING))
        rq2.release()
        self.assertEqual(rq2.msg.status, Request.RELEASING)

        rq3 = ResourceRequest(Request(id=unique_id.toMsg(TEST_UUID),
                                      resources=[TEST_RESOURCE],
                                      status=Request.PREEMPTING))
        rq3.release()
        self.assertEqual(rq3.msg.status, Request.RELEASING)

        rq4 = ResourceRequest(Request(id=unique_id.toMsg(TEST_UUID),
                                      resources=[TEST_RESOURCE],
                                      status=Request.ABORTED))
        self.assertRaises(TransitionError, rq4.release)
    def assert_valid(self, request_type, old_status,
                     operation, new_status, *args):
        """
        Assert that *request_type* with *old_status* accepts named
        *operation*, yielding *new_status*.

        :returns: request contents after the *operation*.
        """
        rq = request_type(Request(id=unique_id.toMsg(TEST_UUID),
                                  resources=[TEST_WILDCARD],
                                  status=old_status))
        getattr(rq, operation)(*args)
        self.assertEqual(rq.msg.status, new_status)
        return rq
示例#21
0
    def test_released_merge(self):
        msg1 = Request(id=unique_id.toMsg(TEST_UUID),
                       resources=[TEST_WILDCARD],
                       status=Request.RELEASING)
        rset = RequestSet([msg1], RQR_UUID)
        self.assertEqual(len(rset), 1)
        self.assertTrue(TEST_UUID in rset)
        sch_msg = SchedulerRequests(requester=unique_id.toMsg(RQR_UUID),
                                    requests=[msg1])
        self.assertEqual(rset.to_msg(stamp=rospy.Time()), sch_msg)

        # merge a released request: TEST_UUID should be deleted
        msg2 = Request(id=unique_id.toMsg(TEST_UUID),
                       resources=[TEST_WILDCARD],
                       status=Request.RELEASED)
        rel_rset = RequestSet([msg2], RQR_UUID, contents=ResourceReply)
        rset.merge(rel_rset)
        self.assertEqual(len(rset), 0)
        self.assertFalse(TEST_UUID in rset)
        self.assertEqual(rset, RequestSet([], RQR_UUID,
                                          contents=ResourceReply))
        self.assertNotEqual(rset.to_msg(stamp=rospy.Time()), sch_msg)
        self.assertNotEqual(rset, rel_rset)
示例#22
0
    def test_canceled_merge(self):
        msg1 = Request(id=unique_id.toMsg(TEST_UUID),
                       resources=[TEST_WILDCARD],
                       status=Request.CANCELING)
        rset = RequestSet([msg1], RQR_UUID)
        self.assertEqual(len(rset), 1)
        self.assertIn(TEST_UUID, rset)
        sch_msg = SchedulerRequests(requester=unique_id.toMsg(RQR_UUID),
                                    requests=[msg1])
        self.assertEqual(rset.to_msg(stamp=rospy.Time()), sch_msg)

        # merge a canceled request: TEST_UUID should be deleted
        msg2 = Request(id=unique_id.toMsg(TEST_UUID),
                       resources=[TEST_WILDCARD],
                       status=Request.CLOSED)
        rel_rset = RequestSet([msg2], RQR_UUID, contents=ActiveRequest)
        rset.merge(rel_rset)
        self.assertEqual(len(rset), 0)
        self.assertNotIn(TEST_UUID, rset)
        self.assertEqual(rset, RequestSet([], RQR_UUID,
                                          contents=ActiveRequest))
        self.assertNotEqual(rset.to_msg(stamp=rospy.Time()), sch_msg)
        self.assertNotEqual(rset, rel_rset)
示例#23
0
 def test_two_request_set(self):
     msg1 = Request(id=unique_id.toMsg(TEST_UUID),
                    resources=[TEST_WILDCARD])
     msg2 = Request(id=unique_id.toMsg(DIFF_UUID),
                    resources=[TEST_RESOURCE])
     rset = RequestSet([msg1, msg2], RQR_UUID)
     self.assertEqual(len(rset), 2)
     self.assertTrue(TEST_UUID in rset)
     self.assertTrue(DIFF_UUID in rset)
     self.assertEqual(rset[TEST_UUID].msg, msg1)
     self.assertEqual(rset[DIFF_UUID].msg, msg2)
     self.assertEqual(rset.get(TEST_UUID), rset[TEST_UUID])
     self.assertEqual(rset.get(DIFF_UUID), rset[DIFF_UUID])
     self.assertTrue(rset == RequestSet([msg1, msg2], RQR_UUID))
     self.assertTrue(rset == RequestSet([msg2, msg1], RQR_UUID))
     self.assertTrue(rset != RequestSet([msg1], RQR_UUID))
     self.assertTrue(rset != RequestSet([msg2], RQR_UUID))
     self.assertTrue(rset != RequestSet([], RQR_UUID))
     rs2 = copy.deepcopy(rset)
     self.assertTrue(rset == rs2)
     self.assertFalse(rset != rs2)
     rs2[TEST_UUID]._update_status(Request.GRANTED)
     self.assertTrue(rset != rs2)
     self.assertFalse(rset == rs2)
示例#24
0
    def test_grant(self):
        rq1 = ResourceReply(Request(id=unique_id.toMsg(TEST_UUID),
                                    resources=[TEST_WILDCARD],
                                    status=Request.NEW))
        rq1.grant([TEST_RESOURCE])
        self.assertEqual(rq1.msg.status, Request.GRANTED)
        self.assertEqual(rq1.msg.resources, [TEST_RESOURCE])

        rq2 = ResourceReply(Request(id=unique_id.toMsg(TEST_UUID),
                                    resources=[TEST_WILDCARD],
                                    status=Request.WAITING))
        rq2.grant([TEST_RESOURCE])
        self.assertEqual(rq2.msg.status, Request.GRANTED)
        self.assertEqual(rq2.msg.resources, [TEST_RESOURCE])

        rq3 = ResourceReply(Request(id=unique_id.toMsg(TEST_UUID),
                                    resources=[TEST_WILDCARD],
                                    status=Request.PREEMPTING))
        self.assertRaises(TransitionError, rq3.grant, [TEST_RESOURCE])

        rq4 = ResourceReply(Request(id=unique_id.toMsg(TEST_UUID),
                                    resources=[TEST_WILDCARD],
                                    status=Request.ABORTED))
        self.assertRaises(TransitionError, rq4.grant, [TEST_RESOURCE])
 def test_sort_diff_priority(self):
     qe1 = QueueElement(ActiveRequest(
             Request(id=unique_id.toMsg(RQ1_UUID),
                     resources=[ROBERTO_RESOURCE],
                     priority=10)
             ), RQR_ID)
     qe2 = QueueElement(ActiveRequest(
             Request(id=unique_id.toMsg(RQ1_UUID),
                     resources=[MARVIN_RESOURCE],
                     priority=0)
             ), RQR_ID)
     self.assertLess(qe1, qe2)
     self.assertEqual(sorted([qe2, qe1]), [qe1, qe2])
     qe3 = QueueElement(ActiveRequest(
             Request(id=unique_id.toMsg(RQ1_UUID),
                     resources=[ROBERTO_RESOURCE])
             ), RQR_ID)
     qe4 = QueueElement(ActiveRequest(
             Request(id=unique_id.toMsg(RQ1_UUID),
                     resources=[MARVIN_RESOURCE])
             ), RQR_ID)
     self.assertEqual(sorted([qe4, qe3]), [qe3, qe4])
     self.assertEqual(sorted([qe4, qe1, qe3, qe2]),
                      [qe1, qe2, qe3, qe4])
示例#26
0
    def test_empty_merge(self):
        msg1 = Request(id=unique_id.toMsg(TEST_UUID),
                       resources=[TEST_WILDCARD],
                       status=Request.NEW)
        rset = RequestSet([msg1], RQR_UUID)
        self.assertEqual(len(rset), 1)
        self.assertIn(TEST_UUID, rset)
        sch_msg = SchedulerRequests(requester=unique_id.toMsg(RQR_UUID),
                                    requests=[msg1])
        self.assertEqual(rset.to_msg(stamp=rospy.Time()), sch_msg)

        # merge an empty request set: rset should remain the same
        rset.merge(RequestSet([], RQR_UUID, contents=ActiveRequest))
        self.assertEqual(len(rset), 1)
        self.assertIn(TEST_UUID, rset)
        self.assertEqual(rset.to_msg(stamp=rospy.Time()), sch_msg)
示例#27
0
    def test_one_request_set(self):
        msg1 = Request(id=unique_id.toMsg(TEST_UUID),
                       resources=[TEST_WILDCARD],
                       status=Request.NEW)
        rset = RequestSet([msg1], RQR_UUID, contents=ActiveRequest)
        self.assertEqual(len(rset), 1)
        self.assertIn(TEST_UUID, rset)
        self.assertEqual(rset[TEST_UUID].msg, msg1)
        self.assertEqual(rset.get(TEST_UUID), rset[TEST_UUID])
        self.assertNotIn(DIFF_UUID, rset)
        self.assertIsNone(rset.get(DIFF_UUID))
        self.assertEqual(rset.get(DIFF_UUID, 10), 10)
        self.assertEqual(rset, RequestSet([msg1], RQR_UUID))
        self.assertEqual(rset,
                         RequestSet([msg1], RQR_UUID, contents=ActiveRequest))
        rset_str = """requester_id: 01234567-89ab-cdef-0123-456789abcdef
requests:
  id: 01234567-89ab-cdef-fedc-ba9876543210
    priority: 0
    resources: 
      rocon:/segbot#test_rapp
    status: 0"""
        self.assertEqual(str(rset), rset_str)
        sch_msg = SchedulerRequests(requester=unique_id.toMsg(RQR_UUID),
                                    requests=[msg1])
        self.assertEqual(rset.to_msg(stamp=rospy.Time()), sch_msg)

        # vary message contents:
        rs2 = copy.deepcopy(rset)
        self.assertEqual(rset, rs2)
        rq = rs2.get(TEST_UUID)
        rq.msg.priority = 10
        self.assertNotEqual(rset, rs2)
        rq.msg.priority = 0
        self.assertEqual(rset, rs2)
        rq.msg.availability = rospy.Time(1000.0)
        self.assertNotEqual(rset, rs2)
        rq.msg.availability = rospy.Time()
        self.assertEqual(rset, rs2)
        rq.msg.hold_time = rospy.Duration(1000.0)
        self.assertNotEqual(rset, rs2)
        rq.msg.hold_time = rospy.Duration()
        self.assertEqual(rset, rs2)
        rq.msg.resources = [TEST_RESOURCE]
        self.assertNotEqual(rset, rs2)
        rq.msg.resources = [TEST_WILDCARD]
        self.assertEqual(rset, rs2)
from concert_scheduler_requests.priority_queue import *

# some resources for testing
RQR_ID = uuid.uuid4()
RQ1_UUID = uuid.uuid4()
RQ2_UUID = uuid.uuid4()
EXAMPLE_RAPP = 'tests/example_rapp'
MARVIN_NAME = 'rocon:/turtlebot/marvin'
MARVIN = Resource(uri=MARVIN_NAME, rapp=EXAMPLE_RAPP)
ROBERTO_NAME = 'rocon:/turtlebot/roberto'
ROBERTO = Resource(uri=ROBERTO_NAME, rapp=EXAMPLE_RAPP)

# some useful Resource and Request messages
MARVIN_RESOURCE = Resource(rapp=EXAMPLE_RAPP, uri=MARVIN_NAME)
MARVIN_REQUEST = ActiveRequest(Request(
    id=unique_id.toMsg(RQ1_UUID),
    resources=[MARVIN_RESOURCE]))
ROBERTO_RESOURCE = Resource(rapp=EXAMPLE_RAPP, uri=ROBERTO_NAME)
ROBERTO_REQUEST = ActiveRequest(Request(
    id=unique_id.toMsg(RQ2_UUID),
    resources=[ROBERTO_RESOURCE]))


###############################
# queue element tests
###############################


class TestQueueElement(unittest.TestCase):
    """Unit tests for queue element class.
示例#29
0
 def test_free(self):
     rq = ResourceReply(Request(id=unique_id.toMsg(TEST_UUID),
                                resources=[TEST_RESOURCE],
                                status=Request.RELEASING))
     rq.free()
     self.assertEqual(rq.msg.status, Request.RELEASED)
示例#30
0
DUDE1_NAME = 'rocon:/turtlebot/dude1'
DUDE2_NAME = 'rocon:/turtlebot/dude2'
DUDE3_NAME = 'rocon:/turtlebot/dude3'
DUDE4_NAME = 'rocon:/turtlebot/dude4'
MARVIN_NAME = 'rocon:/turtlebot/marvin'
ROBERTO_NAME = 'rocon:/turtlebot/roberto'
MARVIN = CurrentStatus(uri=MARVIN_NAME, rapps=TEST_RAPPS)
ROBERTO = CurrentStatus(uri=ROBERTO_NAME, rapps=TEST_RAPPS)

SINGLETON_POOL = KnownResources(resources=[ROBERTO])
DOUBLETON_POOL = KnownResources(resources=[MARVIN, ROBERTO])

# some useful Resource and Request messages
ANY_RESOURCE = Resource(rapp=TELEOP_RAPP, uri=ANY_NAME)
ANY_REQUEST = ActiveRequest(
    Request(id=unique_id.toMsg(RQ_UUID), resources=[ANY_RESOURCE]))
MARVIN_RESOURCE = Resource(rapp=TELEOP_RAPP, uri=MARVIN_NAME)
ROBERTO_RESOURCE = Resource(rapp=TELEOP_RAPP, uri=ROBERTO_NAME)
ROBERTO_REQUEST = ActiveRequest(
    Request(id=unique_id.toMsg(RQ_UUID), resources=[ROBERTO_RESOURCE]))
NOT_TURTLEBOT_RESOURCE = Resource(rapp=TELEOP_RAPP, uri=NOT_TURTLEBOT_NAME)
NOT_TURTLEBOT_REQUEST = ActiveRequest(
    Request(id=unique_id.toMsg(RQ_UUID), resources=[NOT_TURTLEBOT_RESOURCE]))


class TestResourcePool(unittest.TestCase):
    """Unit tests for simple scheduler resource pool class.

    These tests do not require a running ROS core.
    """