mirror of https://gerrit.osmocom.org/libosmocore
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:
parent
bb22df3db9
commit
fcf79926e5
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue