add state_machine & test