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
This commit is contained in:
Neels Hofmeyr 2018-03-25 01:03:26 +01:00 committed by Neels Hofmeyr
parent bb22df3db9
commit fcf79926e5
1 changed files with 12 additions and 1 deletions

View File

@ -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))