From fcf79926e5e5d296efc4d53b1c50849e4fff7908 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Sun, 25 Mar 2018 01:03:26 +0100 Subject: contrib/fsm-to-dot: warn and draw unallowed state transitions Hacked as it is, fsm-to-dot is capable of detecting action functions transitioning to states that are not allowed according to the FSM definition struct. Draw those in red and output a warning. Found these osmo-bsc gscon errors with this patch: ERROR: gscon_fsm_active() triggers a transition to ST_WAIT_HO_COMPL, but this is not allowed by the FSM definition ERROR: gscon_fsm_wait_ho_compl() triggers a transition to ST_WAIT_MDCX_BTS_HO, but this is not allowed by the FSM definition Related: OS#3109 Change-Id: Ic6319a958b3c7247510c1930bac8b02b95f9dcf2 --- contrib/fsm-to-dot.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'contrib') diff --git a/contrib/fsm-to-dot.py b/contrib/fsm-to-dot.py index ce94a4eb..7a4694e7 100755 --- a/contrib/fsm-to-dot.py +++ b/contrib/fsm-to-dot.py @@ -137,9 +137,10 @@ class Event: return cmp(event.name, other.name) class Edge: - def __init__(edge, to_state, event_name=None, style=None, action=None): + def __init__(edge, to_state, event_name=None, style=None, action=None, color=None): edge.to_state = to_state edge.style = style + edge.color = color edge.events = [] edge.actions = [] edge.add_event_name(event_name) @@ -379,9 +380,17 @@ class Fsm: for to_state_name, event_name in transitions: if not event_name: continue + found = False for out_edge in state.out_edges: if out_edge.to_state.name == to_state_name: out_edge.add_event_name(event_name) + found = True + if not found: + sys.stderr.write( + "ERROR: %s() triggers a transition to %s, but this is not allowed by the FSM definition\n" + % (state.action, to_state_name)) + state.add_out_edge(Edge(fsm.find_state_by_name(to_state_name, True), event_name, + color='red')) additional_states = [] @@ -526,6 +535,8 @@ class Fsm: attrs.append('label="%s"' % (r'\n'.join(labels))) if out_edge.style: attrs.append('style=%s'% out_edge.style) + if out_edge.color: + attrs.append('color=%s'% out_edge.color) attrs_str = '' if attrs: attrs_str = ' [%s]' % (','.join(attrs)) -- cgit v1.2.3