diff --git a/src/test/groovy/sdkman/env/CleanBashEnvBuilder.groovy b/src/test/groovy/sdkman/env/CleanBashEnvBuilder.groovy new file mode 100644 index 00000000..26c6197f --- /dev/null +++ b/src/test/groovy/sdkman/env/CleanBashEnvBuilder.groovy @@ -0,0 +1,27 @@ +package sdkman.env + +class CleanBashEnvBuilder { + private final File baseFolder + String httpProxy + + static CleanBashEnvBuilder create(File baseFolder){ + new CleanBashEnvBuilder(baseFolder) + } + + private CleanBashEnvBuilder(File baseFolder){ + this.baseFolder = baseFolder + } + + CleanBashEnvBuilder withHttpProxy(String httpProxy){ + this.httpProxy = httpProxy + this + } + + BashEnv build() { + def env = [HOME: baseFolder.absolutePath] + if(httpProxy) { + env.put("http_proxy", httpProxy) + } + new BashEnv(baseFolder.absolutePath, env) + } +} diff --git a/src/test/groovy/sdkman/specs/InstallSpec.groovy b/src/test/groovy/sdkman/specs/InstallSpec.groovy new file mode 100644 index 00000000..39dde807 --- /dev/null +++ b/src/test/groovy/sdkman/specs/InstallSpec.groovy @@ -0,0 +1,77 @@ +package sdkman.specs + +import com.github.tomakehurst.wiremock.WireMockServer +import sdkman.env.BashEnv +import sdkman.env.CleanBashEnvBuilder +import sdkman.utils.WireMockServerProvider +import spock.lang.Specification + +import static sdkman.stubs.WebServiceStub.primePlainFileEndpoint +import static sdkman.stubs.WebServiceStub.primeZipEndpoint +import static sdkman.utils.FilesystemUtils.prepareBaseDir + +class InstallSpec extends Specification { + final installScriptName = "install.sh" + final sdkmanScriptsName = "sdkman-scripts.zip" + final service = "http://localhost:8080" + final testScriptBuildDir = "build/testScripts" as File + final distributionsBuildDir = "build/distributions" as File + final wiremockStaticFolder = "src/test/resources/__files/" as File + BashEnv bash + File sdkmanBaseDir + WireMockServer wireMockServer + + + void setup() { + sdkmanBaseDir = prepareBaseDir() + bash = CleanBashEnvBuilder.create(sdkmanBaseDir).build() + bash.start() + copyInstallRequiredFilesIntoWiremockFolder() + wireMockServer = WireMockServerProvider.wireMockServer() + primeInstallScriptEndpoint() + primeDownloadSdkmanEndpoint() + } + + void cleanup() { + removeInstallRequiredFilesFromWiremockFolder() + } + + void "should install init script at bin dir"() { + given: + bash.execute("curl -s ${service} | bash") + bash.resetOutput() + + when: + bash.execute("ls ${sdkmanBaseDir.absolutePath}/.sdkman/bin") + + then: + bash.output.contains("sdkman-init.sh") + } + + private def copyInstallRequiredFilesIntoWiremockFolder() { + def installScript = "${testScriptBuildDir.absolutePath}/${installScriptName}" + def sdkManScriptsZip = "${distributionsBuildDir.absolutePath}/${sdkmanScriptsName}" + bash.execute("cp ${installScript} ${wiremockStaticFolder.absolutePath}") + bash.execute("cp ${sdkManScriptsZip} ${wiremockStaticFolder.absolutePath}") + } + + private def removeInstallRequiredFilesFromWiremockFolder() { + bash.execute("rm -rf ${wiremockStaticFolder.absolutePath}/${installScriptName}") + bash.execute("rm -rf ${wiremockStaticFolder.absolutePath}/${sdkmanScriptsName}") + } + + private def primeInstallScriptEndpoint() { + primePlainFileEndpoint("/", installScriptName) + } + + private def primeDownloadSdkmanEndpoint() { + primeZipEndpoint("/res?platform=${getUname()}&purpose=install", sdkmanScriptsName) + } + + private def getUname() { + bash.execute('echo $(uname)') + def uname = bash.output.trim() + bash.resetOutput() + uname + } +} diff --git a/src/test/groovy/sdkman/stubs/WebServiceStub.groovy b/src/test/groovy/sdkman/stubs/WebServiceStub.groovy index 3ecb4de5..7f81d44e 100644 --- a/src/test/groovy/sdkman/stubs/WebServiceStub.groovy +++ b/src/test/groovy/sdkman/stubs/WebServiceStub.groovy @@ -19,19 +19,27 @@ class WebServiceStub { .withStatus(302))) def binary = "${candidate}-${version}.zip" - stubFor(get(urlEqualTo("/$binary")).willReturn( - aResponse() - .withStatus(200) - .withHeader("Content-Type", "application/zip") - .withBodyFile(binary))) + primeZipEndpoint("/$binary", binary) } static primeSelfupdate() { - stubFor(get(urlEqualTo("/selfupdate")).willReturn( - aResponse() - .withStatus(200) - .withHeader("Content-Type", "text/plain") - .withBodyFile("selfupdate.sh"))) + primePlainFileEndpoint("/selfupdate", "selfupdate.sh") + } + + static primeFileEndpoint(String endpoint, String filePath, String contentType) { + stubFor(get(urlEqualTo(endpoint)).willReturn( + aResponse() + .withStatus(200) + .withHeader("Content-Type", contentType) + .withBodyFile(filePath))) + } + + static primeZipEndpoint(String endpoint, String filePath) { + primeFileEndpoint(endpoint, filePath, "application/zip") + } + + static primePlainFileEndpoint(String endpoint, String filePath) { + primeFileEndpoint(endpoint, filePath, "text/plain") } } diff --git a/src/test/groovy/sdkman/utils/WireMockServerProvider.groovy b/src/test/groovy/sdkman/utils/WireMockServerProvider.groovy new file mode 100644 index 00000000..85e78ed3 --- /dev/null +++ b/src/test/groovy/sdkman/utils/WireMockServerProvider.groovy @@ -0,0 +1,25 @@ +package sdkman.utils + +import com.github.tomakehurst.wiremock.WireMockServer +import com.github.tomakehurst.wiremock.client.WireMock + +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig + +class WireMockServerProvider { + static SERVICE_UP_HOST = "localhost" + static SERVICE_UP_PORT = 8080 + static WireMockServer wireMockServer + + static def wireMockServer() { + wireMockServer == null ? createWireMockServer() : wireMockServer + } + + private static def createWireMockServer() { + wireMockServer = new WireMockServer(wireMockConfig().port(SERVICE_UP_PORT)) + wireMockServer.start() + WireMock.configureFor(SERVICE_UP_HOST, SERVICE_UP_PORT) + wireMockServer + } + + +} diff --git a/src/test/steps/sdkman/env.groovy b/src/test/steps/sdkman/env.groovy index 3c22128f..6e6f527f 100644 --- a/src/test/steps/sdkman/env.groovy +++ b/src/test/steps/sdkman/env.groovy @@ -3,6 +3,7 @@ package sdkman import com.github.tomakehurst.wiremock.WireMockServer import com.github.tomakehurst.wiremock.client.WireMock import sdkman.utils.UnixUtils +import sdkman.utils.WireMockServerProvider import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig import static cucumber.api.groovy.Hooks.After @@ -47,9 +48,7 @@ initScript = new File(binDir, "sdkman-init.sh") bash = null if(!binding.hasVariable("wireMock")) { - wireMock = new WireMockServer(wireMockConfig().port(SERVICE_UP_PORT)) - wireMock.start() - WireMock.configureFor(SERVICE_UP_HOST, SERVICE_UP_PORT) + wireMock = WireMockServerProvider.wireMockServer() } Before(){