예제 #1
0
    def test_history(self):
        sm = self.make_sm()
        history = ContainerHistory(sm)

        parent_ud = UserData()
        parent_ud.key = 0
        outcome = sm.execute(parent_ud)

        self.assertEqual(outcome, 'ok')
        self.assertEqual(parent_ud.key, 5)

        labels = [
            '.'.join(s.label for s in c.save_states)
            for c in history._checkpoints
        ]
        self.assertEqual(labels, ['A', 'A.A', 'A.B', 'B', 'B.A', 'B.B', 'C'])

        uds = [
            tuple(s.userdata.key for s in c.save_states)
            for c in history._checkpoints
        ]
        self.assertEqual(uds, [
            (0, ),
            (0, 0),
            (0, 1),
            (2, ),
            (2, 2),
            (2, 3),
            (4, ),
        ])
예제 #2
0
    def userdata_from_set(self, data, state=None, grammar=grammar):
        """ UserData random generation.

        Keywords arguments:
        data -- A set of inputs_key that need the userdata.
        state -- The name of state to be fuzzed. Used for get information from configuration.
        grammar -- A specific grammar if the default is not enogh.
        """
        userdata = UserData()
        log = {}
        for k in data:
            value = "<value>"
            if state != None and self.config != None and state in self.config:
                if k in self.config[state]["data"]["keys"]:
                    index = self.config[state]["data"]["keys"].index(k)
                    value = self.config[state]["data"]["types"][index]
                    if "grammar" in self.config[state]["data"]:
                        grammar = self.config[state]["data"]["grammar"]
            if "list" in k:
                value = "<array>"
            elif "text" in k:
                value = "<string>"
            userdata[k] = self.specific_grammar_fuzzer(grammar, value)
            log[k] = userdata[k]
        if state != None and self.config != None and state in self.config and "keys" in self.config[
                state]["params"]:
            for k in self.config[state]["params"]["keys"]:
                if "grammar" in self.config[state]["params"]:
                    grammar = self.config[state]["params"]["grammar"]
                index = self.config[state]["params"]["keys"].index(k)
                self.fuzz_param(
                    k,
                    self.specific_grammar_fuzzer(
                        grammar, self.config[state]["params"]["types"][index]))
        return userdata, log
예제 #3
0
    def test_resume_from_history(self):
        sm = self.make_sm()
        history = ContainerHistory(sm)

        parent_ud = UserData()
        parent_ud.key = 0
        outcome = sm.execute(parent_ud)

        self.assertEqual(outcome, 'ok')
        self.assertEqual(parent_ud.key, 5)

        checkpoints = list(history.checkpoints)
        for checkpoint in checkpoints:
            parent_ud.key = 0
            outcome = sm.execute_from(checkpoint, parent_ud)
            self.assertEqual(outcome, 'ok')
            self.assertEqual(parent_ud.key, 5)
예제 #4
0
    def test_resume_to_end(self):
        """
        Can resume to final state
        """
        sm = self.simple_sm()

        outcome = sm.execute_from(
            Checkpoint(uuid4(), datetime.now(),
                       [ContainerSaveState(label='C', userdata=UserData())]))
        self.assertEqual(outcome, 'ok')
        self.assertEqual(self.trace(), ['C'])
예제 #5
0
    def test_nested_sm(self):
        """
        Can resume to nested state-machines
        """
        sm = self.nested_sm()
        outcome = sm.execute_from(
            Checkpoint(uuid4(), datetime.now(), [
                ContainerSaveState(label='A', userdata=UserData()),
                ContainerSaveState(label='B', userdata=UserData()),
            ]))
        self.assertEqual(outcome, 'ok')
        self.assertEqual(self.trace(), ['A.B', 'B.A', 'B.B', 'C'])

        # Cannot resume to non-resumable sm
        self.assertRaises(
            ValueError, lambda: sm.execute_from(
                Checkpoint(uuid4(), datetime.now(), [
                    ContainerSaveState(label='B', userdata=UserData()),
                    ContainerSaveState(label='B', userdata=UserData()),
                ])))

        # Cannot resume to nonexistant state
        self.assertRaises(
            ValueError, lambda: sm.execute_from(
                Checkpoint(uuid4(), datetime.now(), [
                    ContainerSaveState(label='A', userdata=UserData()),
                    ContainerSaveState(label='X', userdata=UserData()),
                ])))

        # Cannot resume with spec nested deeper than state-machine is
        self.assertRaises(
            ValueError, lambda: sm.execute_from(
                Checkpoint(uuid4(), datetime.now(), [
                    ContainerSaveState(label='A', userdata=UserData()),
                    ContainerSaveState(label='B', userdata=UserData()),
                    ContainerSaveState(label='C', userdata=UserData()),
                ])))
예제 #6
0
#!/usr/bin/env python

import rospy

from smach.user_data import UserData

from thorp_toolkit.geometry import TF2, create_2d_pose
from thorp_smach.states.navigation import LookToPose
from thorp_smach.utils import wait_for_mbf

if __name__ == '__main__':
    rospy.init_node('run_look_to_pose_state')

    # MBF is the last component to start, so wait for it before running the sm
    wait_for_mbf()

    ud = UserData()
    ud['robot_pose'] = TF2().transform_pose(None, 'base_footprint', 'map')
    ud['target_pose'] = create_2d_pose(0.0, 0.0, 0.0, 'map')
    state = LookToPose()
    t0 = rospy.get_time()
    outcome = state.execute(ud)
    rospy.loginfo("LookToPose completed in %.2fs with outcome '%s'",
                  rospy.get_time() - t0, outcome)

    # Wait for ctrl-c to stop the application
    rospy.spin()

    rospy.signal_shutdown('All done.')
예제 #7
0
 def make_ud(**kwargs):
     ud = UserData()
     ud._data.update(kwargs)
     return ud
예제 #8
0
def data_to_userdata(data):
    """ Create a UserData from dictionary. """
    userdata = UserData()
    for k in data.keys():
        userdata[k] = data[k]
    return userdata