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

com.github.j5ik2o.dockerController.DockerControllerSpecSupport.scala Maven / Gradle / Ivy

package com.github.j5ik2o.dockerController

import org.scalatest._

trait DockerControllerSpecSupport extends SuiteMixin with DockerControllerHelper with RandomPortUtil {
  this: TestSuite =>

  protected def createRemoveLifecycle: DockerContainerCreateRemoveLifecycle.Value =
    DockerContainerCreateRemoveLifecycle.ForEachTest

  protected def startStopLifecycle: DockerContainerStartStopLifecycle.Value =
    DockerContainerStartStopLifecycle.ForEachTest

  protected def createDockerContainers(
      createRemoveLifecycle: DockerContainerCreateRemoveLifecycle.Value,
      testName: Option[String]
  ): Boolean = {
    if (this.createRemoveLifecycle == createRemoveLifecycle) {
      beforeCreateContainers()
      for (dockerController <- dockerControllers) {
        createDockerContainer(dockerController, testName)
      }
      afterCreateContainers()
      true
    } else false
  }

  protected def startDockerContainers(
      startStopLifecycle: DockerContainerStartStopLifecycle.Value,
      testName: Option[String]
  ): Boolean = {
    if (this.startStopLifecycle == startStopLifecycle) {
      beforeStartContainers()
      for (dockerController <- dockerControllers) {
        startDockerContainer(dockerController, testName)
      }
      afterStartContainers()
      true
    } else false
  }

  protected def stopDockerContainers(
      startStopLifecycle: DockerContainerStartStopLifecycle.Value,
      testName: Option[String]
  ): Boolean = {
    if (this.startStopLifecycle == startStopLifecycle) {
      beforeStopContainers()
      for (dockerController <- dockerControllers) {
        stopDockerContainer(dockerController, testName)
      }
      afterStopContainers()
      true
    } else false
  }

  protected def removeDockerContainers(
      createRemoveLifecycle: DockerContainerCreateRemoveLifecycle.Value,
      testName: Option[String]
  ): Boolean = {
    if (this.createRemoveLifecycle == createRemoveLifecycle) {
      beforeRemoveContainers()
      for (dockerController <- dockerControllers) {
        removeDockerContainer(dockerController, testName)
      }
      afterRemoveContainers()
      true
    } else false
  }

  protected def beforeCreateContainers(): Unit = {}
  protected def afterCreateContainers(): Unit  = {}
  protected def beforeStartContainers(): Unit  = {}
  protected def afterStartContainers(): Unit   = {}
  protected def beforeStopContainers(): Unit   = {}
  protected def afterStopContainers(): Unit    = {}
  protected def beforeRemoveContainers(): Unit = {}
  protected def afterRemoveContainers(): Unit  = {}

  abstract override def run(testName: Option[String], args: Args): Status = {
    (createRemoveLifecycle, startStopLifecycle) match {
      case (DockerContainerCreateRemoveLifecycle.ForEachTest, DockerContainerStartStopLifecycle.ForAllTest) =>
        throw new Error(s"Incorrect lifecycle settings: ($createRemoveLifecycle, $startStopLifecycle)")
      case _ =>
    }
    if (expectedTestCount(args.filter) == 0) {
      new CompositeStatus(Set.empty)
    } else {
      var created = false
      var started = false
      try {
        created = createDockerContainers(DockerContainerCreateRemoveLifecycle.ForAllTest, testName)
        started = startDockerContainers(DockerContainerStartStopLifecycle.ForAllTest, testName)
        super.run(testName, args)
      } finally {
        try {
          if (started)
            stopDockerContainers(DockerContainerStartStopLifecycle.ForAllTest, testName)
        } finally {
          try {
            if (created)
              removeDockerContainers(DockerContainerCreateRemoveLifecycle.ForAllTest, testName)
          } finally {
            afterRemoveContainers()
            dockerClient.close()
          }
        }
      }
    }
  }

  abstract protected override def runTest(testName: String, args: Args): Status = {
    var created = false
    var started = false
    try {
      created = createDockerContainers(DockerContainerCreateRemoveLifecycle.ForEachTest, Some(testName))
      started = startDockerContainers(DockerContainerStartStopLifecycle.ForEachTest, Some(testName))
      super.runTest(testName, args)
    } finally {
      try {
        if (started)
          stopDockerContainers(DockerContainerStartStopLifecycle.ForEachTest, Some(testName))
      } finally {
        if (created)
          removeDockerContainers(DockerContainerCreateRemoveLifecycle.ForEachTest, Some(testName))
      }
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy