package org.akka.essentials.stm.transactor.example2; import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor.Props; import akka.testkit.TestKit; import org.akka.essentials.stm.transactor.example2.msg.AccountBalance; import org.akka.essentials.stm.transactor.example2.msg.AccountCredit; import org.akka.essentials.stm.transactor.example2.msg.AccountDebit; import org.akka.essentials.stm.transactor.example2.msg.TransferMsg; import org.junit.Assert; import org.junit.Test; import scala.concurrent.Await; import scala.concurrent.duration.Duration; import static akka.pattern.Patterns.ask; public class BankTransactorTest extends TestKit { static ActorSystem _system = ActorSystem.create("STM-Example"); public BankTransactorTest() { super(_system); } @Test public void successTest() throws Exception { ActorRef bank = _system.actorOf(new Props(BankActor.class)); bank.tell(new TransferMsg(Float.valueOf("1777"))); AccountBalance balance = (AccountBalance) Await.result( ask(bank, new AccountBalance("XYZ"), 5000), Duration.create("5 second")); Assert.assertEquals(Float.parseFloat("3223"), balance.getBalance(), Float.parseFloat("0")); balance = (AccountBalance) Await.result( ask(bank, new AccountBalance("ABC"), 5000), Duration.create("5 second")); Assert.assertEquals(Float.parseFloat("2777"), balance.getBalance(), Float.parseFloat("0")); } @Test public void failureTest() throws Exception { ActorRef bank = _system.actorOf(new Props(BankActor.class)); bank.tell(new TransferMsg(Float.valueOf("5500"))); // sleeping to allow some time for actors to be restarted Thread.sleep(4000); AccountBalance balance = (AccountBalance) Await.result( ask(bank, new AccountBalance("XYZ"), 5000), Duration.create("5 second")); Assert.assertEquals(Float.parseFloat("5000"), balance.getBalance(), Float.parseFloat("0")); balance = (AccountBalance) Await.result( ask(bank, new AccountBalance("ABC"), 5000), Duration.create("5 second")); Assert.assertEquals(Float.parseFloat("1000"), balance.getBalance(), Float.parseFloat("0")); } @Test public void accountTest() throws Exception { ActorRef bank = _system.actorOf(new Props(BankActor.class)); bank.tell(new AccountDebit(Float.parseFloat("1000"))); bank.tell(new AccountCredit(Float.parseFloat("1000"))); bank.tell(new AccountDebit(Float.parseFloat("1000"))); bank.tell(new AccountDebit(Float.parseFloat("1000"))); bank.tell(new AccountDebit(Float.parseFloat("3500"))); bank.tell(new AccountCredit(Float.parseFloat("2500"))); bank.tell(new AccountDebit(Float.parseFloat("3500"))); // sleeping to allow some time for all messages to be processed Thread.sleep(4000); AccountBalance balance = (AccountBalance) Await.result( ask(bank, new AccountBalance("XYZ"), 5000), Duration.create("5 second")); Assert.assertEquals(Float.parseFloat("2000"), balance.getBalance(), Float.parseFloat("0")); } }