diff --git a/src/main/java/io/appium/java_client/service/local/AppiumServiceBuilder.java b/src/main/java/io/appium/java_client/service/local/AppiumServiceBuilder.java index 0196579c2..e0ce11520 100644 --- a/src/main/java/io/appium/java_client/service/local/AppiumServiceBuilder.java +++ b/src/main/java/io/appium/java_client/service/local/AppiumServiceBuilder.java @@ -16,6 +16,8 @@ package io.appium.java_client.service.local; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; import static org.openqa.selenium.remote.CapabilityType.PLATFORM_NAME; import com.google.common.collect.ImmutableList; @@ -217,6 +219,9 @@ public AppiumServiceBuilder withArgument(ServerArgument argument, String value) case "-g": withLogFile(new File(value)); break; + case "--base-path": + serverArguments.put(argName, sanitizeBasePath(value)); + break; default: serverArguments.put(argName, value); break; @@ -224,6 +229,13 @@ public AppiumServiceBuilder withArgument(ServerArgument argument, String value) return this; } + private static String sanitizeBasePath(String basePath) { + basePath = checkNotNull(basePath).trim(); + checkArgument(!basePath.isEmpty(), + "Given base path is not valid - blank or empty values are not allowed for base path"); + return basePath.endsWith("/") ? basePath : basePath + "/"; + } + /** * Adds capabilities. * diff --git a/src/test/java/io/appium/java_client/service/local/ServerBuilderTest.java b/src/test/java/io/appium/java_client/service/local/ServerBuilderTest.java index 7db741cdd..3c3fed15e 100644 --- a/src/test/java/io/appium/java_client/service/local/ServerBuilderTest.java +++ b/src/test/java/io/appium/java_client/service/local/ServerBuilderTest.java @@ -4,6 +4,9 @@ import static io.appium.java_client.TestUtils.getLocalIp4Address; import static io.appium.java_client.service.local.AppiumDriverLocalService.buildDefaultService; import static io.appium.java_client.service.local.AppiumServiceBuilder.APPIUM_PATH; +import static io.appium.java_client.service.local.AppiumServiceBuilder.BROADCAST_IP_ADDRESS; +import static io.appium.java_client.service.local.AppiumServiceBuilder.DEFAULT_APPIUM_PORT; +import static io.appium.java_client.service.local.flags.GeneralServerFlag.BASEPATH; import static io.appium.java_client.service.local.flags.GeneralServerFlag.CALLBACK_ADDRESS; import static io.appium.java_client.service.local.flags.GeneralServerFlag.SESSION_OVERRIDE; import static io.github.bonigarcia.wdm.WebDriverManager.chromedriver; @@ -18,6 +21,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import com.google.common.collect.ImmutableMap; @@ -312,4 +316,45 @@ public void checkAbilityToStartServiceWithLogFileUsingShortFlag() { service.start(); assertTrue(testLogFile.exists()); } + + @Test + public void checkAbilityToStartServiceUsingValidBasePathWithMultiplePathParams() { + String baseUrl = String.format("http://%s:%d/", BROADCAST_IP_ADDRESS, DEFAULT_APPIUM_PORT); + String basePath = "wd/hub"; + service = new AppiumServiceBuilder().withArgument(BASEPATH, basePath).build(); + service.start(); + assertTrue(service.isRunning()); + assertEquals(baseUrl + basePath + "/", service.getUrl().toString()); + } + + @Test + public void checkAbilityToStartServiceUsingValidBasePathWithSinglePathParams() { + String baseUrl = String.format("http://%s:%d/", BROADCAST_IP_ADDRESS, DEFAULT_APPIUM_PORT); + String basePath = "/wd/"; + service = new AppiumServiceBuilder().withArgument(BASEPATH, basePath).build(); + service.start(); + assertTrue(service.isRunning()); + assertEquals(baseUrl + basePath.substring(1), service.getUrl().toString()); + } + + @Test + public void checkAbilityToValidateBasePathForEmptyBasePath() { + assertThrows(IllegalArgumentException.class, () -> { + new AppiumServiceBuilder().withArgument(BASEPATH, "").build(); + }); + } + + @Test + public void checkAbilityToValidateBasePathForBlankBasePath() { + assertThrows(IllegalArgumentException.class, () -> { + new AppiumServiceBuilder().withArgument(BASEPATH, " ").build(); + }); + } + + @Test + public void checkAbilityToValidateBasePathForNullBasePath() { + assertThrows(NullPointerException.class, () -> { + new AppiumServiceBuilder().withArgument(BASEPATH, null).build(); + }); + } }