def test_method_callable(self, mock): tm = TaskManager(skills=self.skill_generator()) tm.ongoingTasks = [Skill()] tm.execute_mission() self.assertTrue(mock.called)
def test_refuse_mission_because_robot_is_busy(self): tm = TaskManager(skills=[self.skill_generator()]) response = tm.assign_mission_service_handler(goals=[ self.test_goal_generator(), self.test_goal_generator(), self.test_goal_generator() ]) acceptedResponse = MSGConstructor.ActionAcceptedRefusedConstructor( accepted='True', reasonOfRefusal='None') self.assertEquals(response, acceptedResponse) self.assertEquals(len(tm.ongoingTasks), 3) response = tm.assign_mission_service_handler(goals=[ self.test_goal_generator(), self.test_goal_generator(), self.test_goal_generator() ]) refusedResponse = MSGConstructor.ActionAcceptedRefusedConstructor( accepted='False', reasonOfRefusal= "Robot is currently busy with 3 tasks: ['example-skill', 'example-skill', 'example-skill']" ) self.assertEquals(response, refusedResponse) self.assertEquals(len(tm.ongoingTasks), 3)
def test_refused_because_empty_goals(self): tm = TaskManager(skills=[self.skill_generator()]) response = tm.assign_mission_service_handler(goals=[]) refusedResponse = MSGConstructor.ActionAcceptedRefusedConstructor( accepted='False', reasonOfRefusal='Empty goals!') self.assertEquals(response, refusedResponse) self.assertEquals(len(tm.ongoingTasks), 0)
def test_refused_because_different_robotId(self): tm = TaskManager(skills=[self.skill_generator()]) response = tm.assign_mission_service_handler( robotId='differentRobotId') refusedResponse = MSGConstructor.ActionAcceptedRefusedConstructor( accepted='False', reasonOfRefusal='Different robotId!') self.assertEquals(response, refusedResponse) self.assertEquals(len(tm.ongoingTasks), 0)
def test_accepted_simple_mission(self): tm = TaskManager(skills=[self.skill_generator()]) response = tm.assign_mission_service_handler( goals=[self.test_goal_generator()]) acceptedResponse = MSGConstructor.ActionAcceptedRefusedConstructor( accepted='True', reasonOfRefusal='None') self.assertEquals(response, acceptedResponse) self.assertEquals(len(tm.ongoingTasks), 1)
def test_multiple_generic_skills(self): skills = ROSInterface.get_ROS_param(self.skillsParamName) task1 = GenericSkill(skillName = 'example-skill', skillType = 'GenericSkill', skillClass = 'GenericSkill', allowedSkillPropertiesKeys = ['exampleSkillProperty0', 'exampleSkillProperty0'], skillProperties = {'exampleSkillProperty0': 'exampleSkillValue0', 'exampleSkillProperty1': 'exampleSkillValue1'}) tm = TaskManager(robotId = 'testRobotId', skills = skills) tm.ongoingTasks = [task1, task1, task1] result = tm.execute_mission('fakeMissionId') self.assertEquals(tm.missions[0]['statusCode'], 11) self.assertEquals(tm.missions[0]['taskId'], 'example-skill')
def test_generic_skill_execution_timeout_while_waiting_for_action_response(self): skills = ROSInterface.get_ROS_param(self.skillsParamName) task1 = GenericSkill(skillName = 'example-skill', skillType = 'GenericSkill', skillClass = 'GenericSkill', allowedSkillPropertiesKeys = ['exampleSkillProperty0', 'exampleSkillProperty0'], skillProperties = {'exampleSkillProperty0': 'exampleSkillValue0', 'exampleSkillProperty1': 'exampleSkillValue1'}) tm = TaskManager(robotId = 'testRobotId', skills = skills, waitForActionClientTimeOut = 0.5) tm.ongoingTasks = [task1] result = tm.execute_mission('fakeMissionId') self.assertEquals(tm.missions[0]['statusCode'], 12) self.assertEquals(tm.missions[0]['taskId'], 'example-skill') self.assertEquals(tm.missions[0]['statusDescription'], 'Mission Failed! Task example-skill Failed: Skill Action Client Error: Timed out (0.5s) while waiting for GenericSkill Action Server result')
def test_wait_skill_execution_timeout_while_waiting_for_server(self): skills = ROSInterface.get_ROS_param(self.skillsParamName) task1 = GenericSkill(skillName = 'crob-wait', skillType = 'WaitSkill', skillClass = 'GenericSkill', allowedSkillPropertiesKeys = ['waitTime'], skillProperties = {'waitTime': 5}) tm = TaskManager(robotId = 'testRobotId', skills = skills, waitForServerTimeOut = 2) tm.ongoingTasks = [task1] result = tm.execute_mission('fakeMissionId') self.assertEquals(tm.missions[0]['statusCode'], 12) self.assertEquals(tm.missions[0]['taskId'], 'crob-wait') self.assertEquals(tm.missions[0]['statusDescription'], 'Mission Failed! Task crob-wait Failed: Skill Action Client Error: Timed out (2s) while trying to find Action Server WaitSkill')
def test_refused_bad_syntax_goal(self): tm = TaskManager(skills=[self.skill_generator()]) response = tm.assign_mission_service_handler( goals=['example-skill;exampleSkillProperty0']) refusedResponse = MSGConstructor.ActionAcceptedRefusedConstructor( accepted='False', reasonOfRefusal= 'Badly formatted goal (example-skill;exampleSkillProperty0): need more than 1 value to unpack' ) self.assertEquals(response, refusedResponse) self.assertEquals(len(tm.ongoingTasks), 0)
def test_mix_between_correct_and_incorrect_skills(self): skills = ROSInterface.get_ROS_param(self.skillsParamName) task1 = GenericSkill(skillName = 'example-skill', skillType = 'GenericSkill', skillClass = 'GenericSkill', allowedSkillPropertiesKeys = ['exampleSkillProperty0', 'exampleSkillProperty0'], skillProperties = {'exampleSkillProperty0': 'exampleSkillValue0', 'exampleSkillProperty1': 'exampleSkillValue1'}) task2 = GenericSkill(skillName = 'crob-wait', skillType = 'WaitSkill', skillClass = 'GenericSkill', allowedSkillPropertiesKeys = ['waitTime'], skillProperties = {'waitTime': 5}) tm = TaskManager(robotId = 'testRobotId', skills = skills, waitForServerTimeOut = 2) tm.ongoingTasks = [task1, task2, task1] result = tm.execute_mission('fakeMissionId') self.assertEquals(tm.missions[0]['statusCode'], 12) self.assertEquals(tm.missions[0]['taskId'], 'crob-wait') self.assertEquals(tm.missions[0]['statusDescription'], 'Mission Failed! Task crob-wait Failed: Skill Action Client Error: Timed out (2s) while trying to find Action Server WaitSkill')
def test_execute_mission_called_for_simple_mission(self, mock): tm = TaskManager(skills=[self.skill_generator()]) response = tm.assign_mission_service_handler(goals=[ self.test_goal_generator(), self.test_goal_generator(), self.test_goal_generator() ], executeMission=True) self.assertTrue(mock.called) acceptedResponse = MSGConstructor.ActionAcceptedRefusedConstructor( accepted='True', reasonOfRefusal='None') self.assertEquals(response, acceptedResponse) self.assertEquals(len(tm.ongoingTasks), 3)
def test_correct_task_action_client_called(self, mock): tm = TaskManager(skills=[self.skill_generator()]) task1 = GenericSkill(skillName='example-skill', skillType='GenericSkill', skillClass='GenericSkill', allowedSkillPropertiesKeys=[ 'exampleSkillProperty0', 'exampleSkillProperty0' ], skillProperties={ 'exampleSkillProperty0': 'exampleSkillValue0', 'exampleSkillProperty1': 'exampleSkillValue1' }) tm.ongoingTasks = [task1] tm.execute_mission('fakeMissionId') self.assertTrue(mock.called)
def test_accepted_complex_mission(self): tm = TaskManager(skills=[ self.skill_generator(), self.skill_generator( skillName='drive', skillType='DriveSkill', skillClass='DriveSkill', skillProperties=['toObjectId', 'toObjectType']) ]) response = tm.assign_mission_service_handler(goals=[ self.test_goal_generator(), 'drive;toObjectId=testToObjectId;toObjectType=testToObjectType' ]) acceptedResponse = MSGConstructor.ActionAcceptedRefusedConstructor( accepted='True', reasonOfRefusal='None') self.assertEquals(response, acceptedResponse) self.assertEquals(len(tm.ongoingTasks), 2)
def test_create_object_with_robotId(self): tm = TaskManager(robotId='testRobotId') self.assertEquals(tm.robotId, 'testRobotId')
def test_create_object_with_skills(self): tm = TaskManager(skills=[self.skill_generator()]) self.assertEquals(tm.skills, [self.skill_generator()])
def test_taskStatusTopic_existance(self): tm = TaskManager(robotId = 'testRobotId', taskStatusTopic = '/stamina_msgs/TaskStatus') rospy.Subscriber('/stamina_msgs/TaskStatus', TaskStatus, self.testStatusTopicCallback)
def test_provideTaskStatus_service_parser_existance(self): tm = TaskManager(robotId = 'testRobotId', provideTaskStatusServiceName = 'stamina_msgs/testRobotId/ProvideTaskStatus') rospy.wait_for_service('stamina_msgs/testRobotId/ProvideTaskStatus', timeout=10)
def test_assignMission_service_parser_existance(self): tm = TaskManager(robotId = 'testRobotId', assignMissionServiceName = 'stamina_msgs/testRobotId/AssignMission') rospy.wait_for_service('stamina_msgs/testRobotId/AssignMission', timeout=10)
'~cancel_mission_service_name') ## Topics taskStatusTopic = '~TaskStatus' except KeyError as e: rospy.logerr('[TaskManager] Error: %s', str(e)) rospy.logdebug(traceback.format_exc()) quit() try: tm = TaskManager( robotId=robotId, skills=skills, assignMissionServiceName=assignMissionServiceName, cancelMissionServiceName=cancelMissionServiceName, provideTaskStatusServiceName=provideTaskStatusServiceName, taskStatusTopic=taskStatusTopic, waitForServerTimeOut=waitForServerTimeOut, waitForActionClientTimeOut=waitForActionClientTimeOut, missionQueueSize=missionQueueSize) rospy.spin() except Exception as e: rospy.logerr('[TaskManager] Error: %s', str(e)) rospy.logdebug(traceback.format_exc()) quit()
def test_create_empty_object(self): tm = TaskManager()
def test_create_object_with_waitForActionClientTimeOut(self): tm = TaskManager(waitForActionClientTimeOut=100) self.assertEquals(tm.waitForActionClientTimeOut, 100)
def test_create_object_with_waitForServerTimeOut(self): tm = TaskManager(waitForServerTimeOut=10) self.assertEquals(tm.waitForServerTimeOut, 10)