aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jakob@driver.xyz>2017-08-28 15:19:21 -0700
committerJakob Odersky <jakob@driver.xyz>2017-08-28 15:19:21 -0700
commitfb455acf5d10c2d457fa4011056ac17696e2d3e4 (patch)
tree4a3f85d6a864b7777e830b4031d135b8a7b0f24c
parent8d5a39deffb8d1b9da6e7d90a8748336d39248e8 (diff)
downloadsbt-settings-fb455acf5d10c2d457fa4011056ac17696e2d3e4.tar.gz
sbt-settings-fb455acf5d10c2d457fa4011056ac17696e2d3e4.tar.bz2
sbt-settings-fb455acf5d10c2d457fa4011056ac17696e2d3e4.zip
Package integration tests
-rw-r--r--src/main/scala/xyz.driver.sbt/IntegrationTestPackaging.scala86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/main/scala/xyz.driver.sbt/IntegrationTestPackaging.scala b/src/main/scala/xyz.driver.sbt/IntegrationTestPackaging.scala
new file mode 100644
index 0000000..a5a16bc
--- /dev/null
+++ b/src/main/scala/xyz.driver.sbt/IntegrationTestPackaging.scala
@@ -0,0 +1,86 @@
+package xyz.driver.sbt
+
+import java.nio.file._
+
+import scala.collection.JavaConverters._
+
+import com.typesafe.sbt.packager._
+import com.typesafe.sbt.packager.Keys._
+import com.typesafe.sbt.packager.docker._
+import com.typesafe.sbt.packager.docker.DockerPlugin.autoImport.Docker
+import com.typesafe.sbt.packager.universal._
+import com.typesafe.sbt.packager.universal.UniversalPlugin.autoImport._
+import sbt._
+import sbt.Keys._
+
+object IntegrationTestPackaging extends AutoPlugin {
+
+ override def requires = UniversalPlugin && DockerPlugin
+ override def trigger = AllRequirements
+
+ object autoImport {
+ val IntegrationTest = config("it") extend (Test) // make test classes available
+ }
+ import autoImport._
+
+ private def list(base: Path): Seq[(Path, String)] = base match {
+ case _ if Files.isRegularFile(base) => Seq(base -> base.getFileName.toString)
+ case _ if Files.isDirectory(base) =>
+ Files.walk(base).iterator().asScala.toSeq.map { file =>
+ file -> base.relativize(file).toString
+ }
+ }
+
+ override def projectSettings = Seq(
+ mappings in Universal ++= {
+ val cp: Seq[(File, String)] = (dependencyClasspath in IntegrationTest).value
+ .map(_.data.toPath)
+ .flatMap(list)
+ .map {
+ case (file, location) =>
+ file.toFile -> ("lib-it/" + location)
+ }
+
+ val tests: Seq[(File, String)] = list((packageBin in IntegrationTest).value.toPath)
+ .map {
+ case (file, location) =>
+ file.toFile -> ("lib-it/" + location)
+ }
+
+ val script = {
+ def libs(mappings: Seq[(File, String)]): String =
+ mappings
+ .map {
+ case (_, location) =>
+ s"$$bin_dir/../$location"
+ }
+ .mkString(":")
+ s"""|#!/bin/bash
+ |bin_dir="$$(dirname "$$(readlink -f "$$0")")"
+ |exec java \\
+ | -cp "${libs(tests ++ cp)}" \\
+ | org.scalatest.tools.Runner \\
+ | -o \\
+ | -R "${libs(tests)}"
+ |""".stripMargin
+ }
+
+ val scriptFile = (resourceManaged in IntegrationTest).value / "runit"
+ IO.write(scriptFile, script)
+ scriptFile.setExecutable(true)
+
+ cp ++ tests ++ Seq(scriptFile -> s"bin/${normalizedName.value}-it")
+ },
+ dockerCommands in Docker := {
+ (dockerCommands in Docker).value ++ Seq(
+ ExecCmd("RUN", "mkdir", "-p", "/test"),
+ ExecCmd("RUN",
+ "ln",
+ "-s",
+ s"${(defaultLinuxInstallLocation in Docker).value}/bin/${normalizedName.value}-it",
+ "/test/run_integration_test.sh")
+ )
+ }
+ )
+
+}