windymelt / p2p2ch

2ch like p2p bbs by Scala
BSD 3-Clause "New" or "Revised" License
11 stars 1 forks source link

Play ! 2.x / Akka 2.2.3 : 結合環境では "POST /test/bbs.cgi" に成功するが、ユニットテストでは失敗する #9

Closed hangingman closed 4 years ago

hangingman commented 9 years ago

以下のような単体テストを実行すると

    "POST /test/bbs.cgi will succeed to post with ascii strings" in {
      running(FakeApplication()) {

        val data: Map[String, String] = Map(
          "bbs"     -> "test",
          "time"    -> String.valueOf(System.currentTimeMillis / 1000),
          "submit"  -> "",
          "FROM"    -> "nanashi",
          "mail"    -> "nanashi@example.com",
          "MESSAGE" -> "I am a Chaika",
          "subject" -> "This is it"
        )

        val bbs = route(FakeRequest(POST, "/test/bbs.cgi").withFormUrlEncodedBody(data.toSeq: _*)).get

        status(bbs) must equalTo(OK)
      }
    }

以下のようなエラーが発生する

[info] ! POST /test/bbs.cgi will succeed to post with ascii strings
[error]     AskTimeoutException: Recipient[Actor[akka://ChordCore-DHT/user/Receiver2ch#-1633806031]] had already been terminated. (AskSupport.scala:134)
[error] akka.pattern.AskableActorRef$.ask$extension(AskSupport.scala:134)
[error] akka.pattern.AskableActorRef$.$qmark$extension(AskSupport.scala:146)
[error] momijikawa.p2pscalaproto.Message.$bang$qmark(Messages.scala:17)
[error] momijikawa.p2pscalaproto.Chord.put(Chord.scala:66)
[error] controllers.Application$.controllers$Application$$buildThread(Application.scala:292)
[error] controllers.Application$$anonfun$writeThread$1.apply(Application.scala:179)
[error] controllers.Application$$anonfun$writeThread$1.apply(Application.scala:153)
[error] play.api.mvc.ActionBuilder$$anonfun$apply$10.apply(Action.scala:221)
[error] play.api.mvc.ActionBuilder$$anonfun$apply$10.apply(Action.scala:220)
[error] play.api.mvc.Action$.invokeBlock(Action.scala:357)
[error] play.api.mvc.ActionBuilder$$anon$1.apply(Action.scala:309)
[error] play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:109)
[error] play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:109)
[error] play.utils.Threads$.withContextClassLoader(Threads.scala:18)
[error] play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:108)
[error] play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:107)
[error] play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:107)
[error] play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:100)
[error] play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:481)
[error] play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:481)
[error] play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:517)
[error] play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:517)
[error] play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$14.apply(Iteratee.scala:494)
[error] play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$14.apply(Iteratee.scala:494)
[error] akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:42)
[error] akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386)

原因は ActorRef の使い回しによるものらしい。 http://stackoverflow.com/a/20893193/4894767 もし修正できるのであれば修正してほしい。

hangingman commented 9 years ago

ここかな

package controllers

import momijikawa.p2pscalaproto.Chord

class Chord2ch extends Chord {

  import akka.actor._

  override val receiver = system.actorOf(Props(classOf[Receiver2ch], stateAgt), "Receiver2ch")
}
windymelt commented 9 years ago

確認します。ちょっとお待ちください。