aboutsummaryrefslogblamecommitdiff
path: root/flow-core/src/test/scala/ch/jodersky/flow/SerialOperatorSpec.scala
blob: 4a6cf1e508bb059b6bc6a9ce7967f0978a59a422 (plain) (tree)




















































                                                                                      
package ch.jodersky.flow

import scala.concurrent.duration._

import akka.actor.{ActorRef, ActorSystem}
import akka.testkit.{ImplicitSender, TestKit}
import akka.util.ByteString
import org.scalatest._

case class Ack(n: Int) extends Serial.Event

class SerialOperatorSpec
    extends TestKit(ActorSystem("serial-operator"))
    with ImplicitSender
    with WordSpecLike
    with Matchers
    with BeforeAndAfterAll
    with SequentialNestedSuiteExecution
    with PseudoTerminal {

  override def afterAll {
    TestKit.shutdownActorSystem(system)
  }

  def withEchoOp[A](action: ActorRef => A): A = {
    withEcho { case (port, settings) =>
      val connection = SerialConnection.open(port, settings)
      val operator = system.actorOf(SerialOperator.apply(connection, 1024, testActor))
      action(operator)
    }
  }

  "Serial operator" should {

    "follow the correct protocol" in withEchoOp { op =>
      expectMsgType[Serial.Opened]

      val data = ByteString("hello world".getBytes("utf-8"))
      op ! Serial.Write(data)
      expectMsg(Serial.Received(data))

      op ! Serial.Write(data, n => Ack(n))
      expectMsg(Serial.Received(data))
      expectMsg(Ack(data.length))

      op ! Serial.Close
      expectMsg(Serial.Closed)

    }

  }

}