summaryrefslogtreecommitdiff
path: root/examples/scala-js/sbt-plugin-test/project/Jetty9Test.scala
blob: 6a84114e2ab53ae944fb19f16475cf9c0e8e5daa (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import sbt._
import Keys._

import scala.scalajs.sbtplugin._
import ScalaJSPlugin.autoImport._
import Implicits._

import scala.scalajs.tools.env._
import scala.scalajs.tools.io._

import org.eclipse.jetty.server._
import org.eclipse.jetty.server.handler._
import org.eclipse.jetty.util.component._

import java.io.File

object Jetty9Test {

  private val jettyPort = 23548

  val runSetting = run <<= Def.inputTask {
    val env = (jsEnv in Compile).value.asInstanceOf[ComJSEnv]
    val cp = (scalaJSExecClasspath in Compile).value
    val jsConsole = scalaJSConsole.value

    val code = new MemVirtualJSFile("runner.js").withContent(
      """
      scalajsCom.init(function(msg) {
        jQuery.ajax({
          url: msg,
          success: function(dat) {
            scalajsCom.send(dat.trim());
            scalajsCom.close();
          },
          error: function() {
            scalajsCom.send("failed!");
            scalajsCom.close();
          }
        });
      });
      """
    )

    val runner = env.comRunner(cp, code, streams.value.log, jsConsole)

    runner.start()

    val jetty = setupJetty((resourceDirectory in Compile).value)

    jetty.addLifeCycleListener(new AbstractLifeCycle.AbstractLifeCycleListener {
      override def lifeCycleStarted(event: LifeCycle): Unit = {
        try {
          runner.send(s"http://localhost:$jettyPort/test.txt")
          val msg = runner.receive()
          val expected = "It works!"
          if (msg != expected)
            sys.error(s"""received "$msg" instead of "$expected"""")
        } finally {
          runner.close()
          jetty.stop()
        }
      }
    })

    jetty.start()
    runner.await()
    jetty.join()
  }

  private def setupJetty(dir: File): Server = {
    val server = new Server(jettyPort)

    val resource_handler = new ResourceHandler()
    resource_handler.setResourceBase(dir.getAbsolutePath)

    val handlers = new HandlerList()
    handlers.setHandlers(Array(resource_handler, new DefaultHandler()))
    server.setHandler(handlers)

    server
  }

}