14
FINITE STATE MACHINES (FSM) WITH AKKA ACTORS WRITING AND UNIT TESTING 'EM "LIGHTNING TALK" BY PRASANNA KUMAR

Akka fsm presentation

Embed Size (px)

DESCRIPTION

akka fsm talk given on Glassbeam

Citation preview

Page 1: Akka fsm presentation

FINITE STATE MACHINES(FSM)

WITH AKKA ACTORSWRITING AND UNIT TESTING 'EM

"LIGHTNING TALK" BY PRASANNA KUMAR

Page 2: Akka fsm presentation

WHAT IS FSM?when a program is in a state S and anevent E occurs then do an action A and

change to another state S1

If the above sounds too theoritical to understand ....

Page 3: Akka fsm presentation

IMAGINE A TRAFFIC SIGNALhope you could understand !!!

Page 4: Akka fsm presentation

WHY DO WE NEED FSM?AT LEAST FOR US ...

Model and Execute Rules (we are using it !!!)SimulationsAutomata based programming

Page 5: Akka fsm presentation

WHY THIS PRESENTATIONI want to learn FSM

Page 6: Akka fsm presentation

"FSM" FROM AKKA PERSPECTIVEStateDataMessages to the actor is analogous to EventsActor abstraction itself

sealed trait FSMSignal case class SignalColorData class SignalChangeFSMActor extends Actor with FSM[FSMSignal, SignalColorData] { ..... }

Page 7: Akka fsm presentation

LET'S MODEL FSM

// state - sealed trait FSMSignal case object RedSignal extends FSMSignal case object YellowSignal extends FSMSignal case object GreenSignal extends FSMSignal

// data case class SignalColorData

// event case object ChangeSignal case object RetainSignal

Page 8: Akka fsm presentation

ACTOR CODEclass SignalChangeFSMActor extends Actor with FSM[FSMSignal, SignalColorData] {

// initial state of FSM startWith(RedSignal, SignalColorData())

when(RedSignal) { case Event(ChangeSignal, _) => goto(YellowSignal) case Event(RetainSignal, _) => stay }

when(YellowSignal) { case Event(ChangeSignal, _) => goto(GreenSignal) case Event(RetainSignal, _) => stay }

Page 9: Akka fsm presentation

CONTD ... when(GreenSignal) { case Event(ChangeSignal, _) => goto(RedSignal) case Event(RetainSignal, _) => stay }

onTransition { case RedSignal -> YellowSignal => println("Changing from red to yellow signal - get ready to go") case YellowSignal -> GreenSignal => println("Changing from yellow to green signal - wroooom") case GreenSignal -> RedSignal => println("Changing from green to red signal - stop !!! :(") }

initialize}

Page 10: Akka fsm presentation

UNIT TESTING FSM ACTORS WITHclass FSMActorTest(as: ActorSystem) extends TestKit(as) with ImplicitSender with WordSpecLike with Matchers with BeforeAndAfterAll { // all our test cases}

Page 11: Akka fsm presentation

val fsmRef = TestFSMRef(new SignalChangeFSMActor)

def this() = this(ActorSystem("FSMActorSystem"))

"Our signal emulating FSMActor" must { "be red at initial stage " in { assert(fsmRef.stateName == RedSignal) assert(fsmRef.stateData == SignalColorData()) } "change to yellow after AlternateColour event occured " in { fsmRef ! ChangeSignal // send an event to FSM assert(fsmRef.stateName == YellowSignal) assert(fsmRef.stateData == SignalColorData()) } "change to green after AlternateColour event occured" in { fsmRef ! ChangeSignal assert(fsmRef.stateName == GreenSignal) assert(fsmRef.stateData == SignalColorData()) } "retain should not change the fsm state" in { fsmRef ! RetainSignal assert(fsmRef.stateName == GreenSignal) assert(fsmRef.stateData == SignalColorData()) } } override def afterAll = { println("traffic is clear now - obey traffic rules") }

Page 12: Akka fsm presentation

SESSION TAKEAWAYCode :- https://github.com/prassee/FSMExperiment

Page 13: Akka fsm presentation

HOW I MADE THIS PRESENTATION ?HTML 5CSS 3Presentation :- reveal.jsImages courtesy :- google image search :)

This presentation is CCL licensed - feel free to modify

Page 14: Akka fsm presentation

THANKS :)