All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.zalando.test.kit.service.JvmTestService.scala Maven / Gradle / Ivy

The newest version!
package org.zalando.test.kit.service

import java.io._
import java.util.function.Consumer

import com.typesafe.scalalogging.StrictLogging
import scala.collection.JavaConversions._

class JvmTestService(override val name: String,
                     mainClass: String,
                     jvmArgs: List[String] = Nil,
                     programArgs: List[String] = Nil,
                     customClassPath: Option[String] = None,
                     output: PrintStream = System.out,
                     forceStop: Boolean = false) extends TestService with StrictLogging {

  lazy val maybeProcessBuilder = for {
    fileSeparator ← sys.props.get("file.separator")
    pathSeparator ← sys.props.get("path.separator")
    javaHome ← sys.props.get("java.home")
    javaPath = javaHome + fileSeparator + "bin" + fileSeparator + "java"
    cp ← sys.props.get("java.class.path").flatMap(path ⇒ customClassPath.map(ccp ⇒ path + pathSeparator + ccp))

  } yield {
    val arguments = (javaPath :: jvmArgs) ++ ("-cp" :: cp :: mainClass :: programArgs)
    new ProcessBuilder(arguments: _*)
  }

  var maybeProcess: Option[Process] = None

  def start() = {
    maybeProcess = maybeProcessBuilder.map { builder ⇒
      logger.info("Starting process: " + builder.command().mkString(" "))
      val process = builder.start()
      new StreamGobbler(process.getInputStream, output).start()
      new StreamGobbler(process.getErrorStream, output).start()
      process
    }
    ()
  }

  def reset(): Unit = {}

  def stop() = {
    maybeProcess.foreach { process ⇒
      if (process.isAlive) {
        if (forceStop) {
          logger.info("Forcibly destroying process...")
          process.destroyForcibly().waitFor()
        } else {
          logger.info("Destroying process...")
          process.destroy()
        }
      }
    }
  }

  class StreamGobbler(val inputStream: InputStream, val printStream: PrintStream) extends Thread {
    setDaemon(true)
    override def run(): Unit = {
      val reader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"))
      reader.lines().forEach(new Consumer[String] {
        def accept(line: String) = printStream.println(line)
      })
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy