2013-01-30 18:10:45 +01:00
|
|
|
/**
|
|
|
|
|
* Copyright (C) 2009-2013 Typesafe Inc. <http://www.typesafe.com>
|
|
|
|
|
*/
|
|
|
|
|
package akka.io
|
|
|
|
|
|
|
|
|
|
import akka.testkit.{ TestProbe, ImplicitSender, AkkaSpec }
|
2013-03-25 10:02:50 +01:00
|
|
|
import akka.io.Udp._
|
|
|
|
|
import akka.TestUtils._
|
2013-01-30 18:10:45 +01:00
|
|
|
import akka.util.ByteString
|
|
|
|
|
import java.net.InetSocketAddress
|
|
|
|
|
import akka.actor.ActorRef
|
|
|
|
|
|
2013-05-29 16:13:10 +02:00
|
|
|
class UdpIntegrationSpec extends AkkaSpec("""
|
|
|
|
|
akka.loglevel = INFO
|
|
|
|
|
akka.actor.serialize-creators = on""") with ImplicitSender {
|
2013-01-30 18:10:45 +01:00
|
|
|
|
2013-04-22 11:43:38 +02:00
|
|
|
val addresses = temporaryServerAddresses(3, udp = true)
|
2013-02-22 14:14:13 +01:00
|
|
|
|
|
|
|
|
def bindUdp(address: InetSocketAddress, handler: ActorRef): ActorRef = {
|
2013-01-30 18:10:45 +01:00
|
|
|
val commander = TestProbe()
|
2013-03-25 10:02:50 +01:00
|
|
|
commander.send(IO(Udp), Bind(handler, address))
|
2013-04-13 20:53:52 +02:00
|
|
|
commander.expectMsg(Bound(address))
|
2013-02-22 14:14:13 +01:00
|
|
|
commander.sender
|
2013-01-30 18:10:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
val simpleSender: ActorRef = {
|
|
|
|
|
val commander = TestProbe()
|
2013-03-25 10:02:50 +01:00
|
|
|
commander.send(IO(Udp), SimpleSender)
|
2013-05-26 18:29:23 +02:00
|
|
|
commander.expectMsg(SimpleSenderReady)
|
2013-01-30 18:10:45 +01:00
|
|
|
commander.sender
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
"The UDP Fire-and-Forget implementation" must {
|
|
|
|
|
|
|
|
|
|
"be able to send without binding" in {
|
2013-02-22 14:14:13 +01:00
|
|
|
val serverAddress = addresses(0)
|
|
|
|
|
val server = bindUdp(serverAddress, testActor)
|
2013-01-30 18:10:45 +01:00
|
|
|
val data = ByteString("To infinity and beyond!")
|
|
|
|
|
simpleSender ! Send(data, serverAddress)
|
|
|
|
|
|
2013-02-10 13:52:52 +01:00
|
|
|
expectMsgType[Received].data must be === data
|
|
|
|
|
|
2013-01-30 18:10:45 +01:00
|
|
|
}
|
|
|
|
|
|
2013-02-27 09:20:00 +01:00
|
|
|
"be able to send several packet back and forth with binding" in {
|
2013-02-22 14:14:13 +01:00
|
|
|
val serverAddress = addresses(1)
|
|
|
|
|
val clientAddress = addresses(2)
|
|
|
|
|
val server = bindUdp(serverAddress, testActor)
|
|
|
|
|
val client = bindUdp(clientAddress, testActor)
|
2013-01-30 18:10:45 +01:00
|
|
|
val data = ByteString("Fly little packet!")
|
|
|
|
|
|
2013-02-27 09:20:00 +01:00
|
|
|
def checkSendingToClient(): Unit = {
|
|
|
|
|
server ! Send(data, clientAddress)
|
|
|
|
|
expectMsgPF() {
|
|
|
|
|
case Received(d, a) ⇒
|
|
|
|
|
d must be === data
|
|
|
|
|
a must be === serverAddress
|
|
|
|
|
}
|
2013-01-30 18:10:45 +01:00
|
|
|
}
|
2013-02-27 09:20:00 +01:00
|
|
|
def checkSendingToServer(): Unit = {
|
|
|
|
|
client ! Send(data, serverAddress)
|
|
|
|
|
expectMsgPF() {
|
|
|
|
|
case Received(d, a) ⇒
|
|
|
|
|
d must be === data
|
|
|
|
|
a must be === clientAddress
|
|
|
|
|
}
|
2013-02-07 17:54:42 +01:00
|
|
|
}
|
2013-01-30 18:10:45 +01:00
|
|
|
|
2013-02-27 09:20:00 +01:00
|
|
|
(0 until 20).foreach(_ ⇒ checkSendingToServer())
|
|
|
|
|
(0 until 20).foreach(_ ⇒ checkSendingToClient())
|
|
|
|
|
(0 until 20).foreach { i ⇒
|
|
|
|
|
if (i % 2 == 0) checkSendingToServer()
|
|
|
|
|
else checkSendingToClient()
|
|
|
|
|
}
|
|
|
|
|
}
|
2013-01-30 18:10:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|