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

io.github.adven27.env.selenium.SeleniumContainerSystem.kt Maven / Gradle / Ivy

package io.github.adven27.env.selenium

import io.github.adven27.env.container.parseImage
import io.github.adven27.env.core.ExternalSystem
import io.github.adven27.env.core.ExternalSystemConfig
import mu.KLogging
import org.testcontainers.containers.GenericContainer
import org.testcontainers.shaded.org.apache.commons.io.FileUtils
import org.testcontainers.utility.DockerImageName
import java.time.Duration

@Suppress("unused")
open class SeleniumContainerSystem @JvmOverloads constructor(
    dockerImageName: DockerImageName = DEFAULT_IMAGE,
    private val defaultPort: Int = PORT,
    private val afterStart: SeleniumContainerSystem.() -> Unit = { }
) : GenericContainer(dockerImageName), ExternalSystem {

    companion object : KLogging() {
        private const val PORT = 4444
        private const val STARTUP_TIMEOUT = 30L

        @JvmField
        val DEFAULT_IMAGE = "selenium/standalone-chrome".parseImage()
    }

    override lateinit var config: Config

    @JvmOverloads
    constructor(imageName: DockerImageName = DEFAULT_IMAGE, afterStart: SeleniumContainerSystem.() -> Unit) : this(
        dockerImageName = imageName,
        afterStart = afterStart
    )

    override fun start(fixedEnv: Boolean) {
        withExposedPorts(PORT)
        withStartupTimeout(Duration.ofSeconds(STARTUP_TIMEOUT))
        if (fixedEnv) addFixedExposedPort(defaultPort, PORT)
        start()
    }

    override fun start() {
        withEnv("START_XVFB", "true")
        withEnv("SE_NODE_OVERRIDE_MAX_SESSIONS", "true")
        withEnv("SE_NODE_MAX_SESSIONS", "2")
        withSharedMemorySize(2 * FileUtils.ONE_GB)
        super.start()
        config = Config(host, firstMappedPort)
        apply(afterStart)
    }

    override fun running() = isRunning

    data class Config @JvmOverloads constructor(
        val host: String = "localhost",
        val port: Int = PORT
    ) : ExternalSystemConfig(
        "env.selenium.host" to host,
        "env.selenium.port" to port.toString()
    )
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy