From 979e8261e4020b9e9a3ec2531aed0816b51bb2f5 Mon Sep 17 00:00:00 2001 From: Andrei Kamarouski Date: Fri, 8 Mar 2024 13:47:18 +0100 Subject: [PATCH] feature: stf support (without manual reserve) --- agent/pom.xml | 41 ++++++ .../grid/agent/MobileCapabilityMatcher.java | 2 +- .../mcloud/grid/agent/NodeAgent.java | 37 +++++- .../agent/RelaySessionFactoryInterceptor.java | 1 + .../agent/SessionSlotReleaseInterceptor.java | 44 ++++++ .../agent/SessionSlotReserveInterceptor.java | 113 ++++++++++++++++ .../mcloud/grid/agent/stf/entity}/App.java | 2 +- .../grid/agent/stf/entity}/Battery.java | 9 +- .../grid/agent/stf/entity}/Browser.java | 2 +- .../mcloud/grid/agent/stf/entity}/Device.java | 9 +- .../grid/agent/stf/entity}/Devices.java | 2 +- .../grid/agent/stf/entity}/Display.java | 2 +- .../grid/agent/stf/entity}/Network.java | 2 +- .../mcloud/grid/agent/stf/entity}/Path.java | 2 +- .../mcloud/grid/agent/stf/entity}/Phone.java | 2 +- .../grid/agent/stf/entity}/Provider.java | 2 +- .../stf/entity}/RemoteConnectUserDevice.java | 2 +- .../grid/agent/stf/entity}/STFDevice.java | 2 +- .../grid/agent/stf/entity}/STFUser.java | 9 +- .../mcloud/grid/agent/stf/entity}/User.java | 9 +- .../{utils => util}/CapabilityUtils.java | 13 +- .../grid/agent}/util/GensonProvider.java | 2 +- .../mcloud/grid/agent}/util/HttpClient.java | 22 ++- .../grid/agent}/util/HttpClientApache.java | 30 ++--- .../agent/validator/DeviceNameValidator.java | 2 +- .../agent/validator/DeviceTypeValidator.java | 2 +- .../validator/MobilePlatformValidator.java | 2 +- .../validator/PlatformVersionValidator.java | 2 +- .../grid/agent/validator/UDIDValidator.java | 2 +- pom.xml | 37 ------ .../mcloud/grid/MobileRemoteProxy.java | 125 +----------------- 31 files changed, 304 insertions(+), 229 deletions(-) create mode 100644 agent/src/main/java/com/zebrunner/mcloud/grid/agent/SessionSlotReleaseInterceptor.java create mode 100644 agent/src/main/java/com/zebrunner/mcloud/grid/agent/SessionSlotReserveInterceptor.java rename {src/main/java/com/zebrunner/mcloud/grid/models/stf => agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity}/App.java (97%) rename {src/main/java/com/zebrunner/mcloud/grid/models/stf => agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity}/Battery.java (97%) rename {src/main/java/com/zebrunner/mcloud/grid/models/stf => agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity}/Browser.java (97%) rename {src/main/java/com/zebrunner/mcloud/grid/models/stf => agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity}/Device.java (96%) rename {src/main/java/com/zebrunner/mcloud/grid/models/stf => agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity}/Devices.java (97%) rename {src/main/java/com/zebrunner/mcloud/grid/models/stf => agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity}/Display.java (97%) rename {src/main/java/com/zebrunner/mcloud/grid/models/stf => agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity}/Network.java (97%) rename {src/main/java/com/zebrunner/mcloud/grid/integration/client => agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity}/Path.java (97%) rename {src/main/java/com/zebrunner/mcloud/grid/models/stf => agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity}/Phone.java (97%) rename {src/main/java/com/zebrunner/mcloud/grid/models/stf => agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity}/Provider.java (96%) rename {src/main/java/com/zebrunner/mcloud/grid/models/stf => agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity}/RemoteConnectUserDevice.java (95%) rename {src/main/java/com/zebrunner/mcloud/grid/models/stf => agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity}/STFDevice.java (98%) rename {src/main/java/com/zebrunner/mcloud/grid/models/stf => agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity}/STFUser.java (96%) rename {src/main/java/com/zebrunner/mcloud/grid/models/stf => agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity}/User.java (96%) rename agent/src/main/java/com/zebrunner/mcloud/grid/agent/{utils => util}/CapabilityUtils.java (79%) rename {src/main/java/com/zebrunner/mcloud/grid => agent/src/main/java/com/zebrunner/mcloud/grid/agent}/util/GensonProvider.java (96%) rename {src/main/java/com/zebrunner/mcloud/grid => agent/src/main/java/com/zebrunner/mcloud/grid/agent}/util/HttpClient.java (98%) rename {src/main/java/com/zebrunner/mcloud/grid => agent/src/main/java/com/zebrunner/mcloud/grid/agent}/util/HttpClientApache.java (89%) diff --git a/agent/pom.xml b/agent/pom.xml index 579736f..2fd4cd7 100644 --- a/agent/pom.xml +++ b/agent/pom.xml @@ -12,6 +12,11 @@ UTF-8 4.18.1 3.14.0 + 2.16.0 + 5.2.2 + 1.6 + 1.19.4 + 1.18.30 3.5.0 3.11.0 @@ -38,6 +43,42 @@ commons-lang3 ${commons-lang3.version} + + org.projectlombok + lombok + ${lombok.version} + provided + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-databind.version} + + + org.apache.httpcomponents.client5 + httpclient5 + ${httpclient.version} + + + com.owlike + genson + ${genson.version} + + + com.sun.jersey + jersey-bundle + ${jersey-bundle.version} + + + jakarta.annotation + jakarta.annotation-api + 3.0.0-M1 + diff --git a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/MobileCapabilityMatcher.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/MobileCapabilityMatcher.java index 1a46fe3..8f8424a 100644 --- a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/MobileCapabilityMatcher.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/MobileCapabilityMatcher.java @@ -28,7 +28,7 @@ import java.util.List; import java.util.logging.Logger; -import static com.zebrunner.mcloud.grid.agent.utils.CapabilityUtils.getAppiumCapability; +import static com.zebrunner.mcloud.grid.agent.util.CapabilityUtils.getAppiumCapability; @SuppressWarnings("unused") public final class MobileCapabilityMatcher extends DefaultSlotMatcher { diff --git a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/NodeAgent.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/NodeAgent.java index 86885bd..87c8b65 100644 --- a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/NodeAgent.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/NodeAgent.java @@ -20,7 +20,7 @@ public class NodeAgent { private static final Logger LOGGER = Logger.getLogger(NodeAgent.class.getName()); private static final String RELAY_SESSION_FACTORY_CLASS = "org.openqa.selenium.grid.node.relay.RelaySessionFactory"; - private static final String TEST_METHOD_NAME = "test"; + private static final String SESSION_SLOT_CLASS = "org.openqa.selenium.grid.node.local.SessionSlot"; public static void premain(String args, Instrumentation instrumentation) { try { @@ -28,6 +28,8 @@ public static void premain(String args, Instrumentation instrumentation) { .with(new AgentBuilder.InitializationStrategy.SelfInjection.Eager()) .type(named(RELAY_SESSION_FACTORY_CLASS)) .transform((builder, type, classloader, module, protectionDomain) -> addTestMethodInterceptor(builder)) + .type(named(SESSION_SLOT_CLASS)) + .transform((builder, type, classloader, module, protectionDomain) -> addSessionSlotMethodInterceptor(builder)) .installOn(instrumentation); } catch (Exception e) { LOGGER.warning(() -> "Could not init instrumentation."); @@ -39,10 +41,17 @@ private static DynamicType.Builder addTestMethodInterceptor(DynamicType.Build .intercept(to(testMethodInterceptor())); } + private static DynamicType.Builder addSessionSlotMethodInterceptor(DynamicType.Builder builder) { + return builder.method(isReleaseMethod()) + .intercept(to(releaseMethodInterceptor())) + .method(isReserveMethod()) + .intercept(to(reserveMethodInterceptor())); + } + public static ElementMatcher isTestMethod() { return isPublic() .and(not(isStatic())) - .and(new NameMatcher<>(TEST_METHOD_NAME::equals)); + .and(new NameMatcher<>("test"::equals)); } private static TypeDescription testMethodInterceptor() { @@ -50,4 +59,28 @@ private static TypeDescription testMethodInterceptor() { .describe(RelaySessionFactoryInterceptor.class.getName()) .resolve(); } + + public static ElementMatcher isReleaseMethod() { + return isPublic() + .and(not(isStatic())) + .and(new NameMatcher<>("release"::equals)); + } + + private static TypeDescription releaseMethodInterceptor() { + return TypePool.Default.ofSystemLoader() + .describe(SessionSlotReleaseInterceptor.class.getName()) + .resolve(); + } + + public static ElementMatcher isReserveMethod() { + return isPublic() + .and(not(isStatic())) + .and(new NameMatcher<>("reserve"::equals)); + } + + private static TypeDescription reserveMethodInterceptor() { + return TypePool.Default.ofSystemLoader() + .describe(SessionSlotReserveInterceptor.class.getName()) + .resolve(); + } } diff --git a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/RelaySessionFactoryInterceptor.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/RelaySessionFactoryInterceptor.java index e107408..1de0a45 100644 --- a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/RelaySessionFactoryInterceptor.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/RelaySessionFactoryInterceptor.java @@ -17,4 +17,5 @@ public static Object onTestMethodInvocation(@This final RelaySessionFactory fact @SuperCall final Callable proxy, @Argument(0) Capabilities capabilities) throws Exception { return CAPABILITY_MATCHER.matches(factory.getStereotype(), capabilities); } + } diff --git a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/SessionSlotReleaseInterceptor.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/SessionSlotReleaseInterceptor.java new file mode 100644 index 0000000..0ff7fbd --- /dev/null +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/SessionSlotReleaseInterceptor.java @@ -0,0 +1,44 @@ +package com.zebrunner.mcloud.grid.agent; + +import com.zebrunner.mcloud.grid.agent.stf.entity.Path; +import com.zebrunner.mcloud.grid.agent.util.HttpClient; +import net.bytebuddy.implementation.bind.annotation.RuntimeType; +import net.bytebuddy.implementation.bind.annotation.SuperCall; +import net.bytebuddy.implementation.bind.annotation.This; +import org.apache.commons.lang3.StringUtils; +import org.openqa.selenium.grid.node.local.SessionSlot; + +import java.util.concurrent.atomic.AtomicReference; +import java.util.logging.Logger; + +public class SessionSlotReleaseInterceptor { + private static final Logger LOGGER = Logger.getLogger(SessionSlotReleaseInterceptor.class.getName()); + private static final String STF_URL = System.getenv("STF_URL"); + private static final String DEFAULT_STF_TOKEN = System.getenv("STF_TOKEN"); + private static final boolean STF_ENABLED = (!StringUtils.isEmpty(STF_URL) && !StringUtils.isEmpty(DEFAULT_STF_TOKEN)); + private static final String UDID = System.getenv("DEVICE_UDID"); + static final AtomicReference DISCONNECT = new AtomicReference<>(true); + + @RuntimeType + public static void onTestMethodInvocation(@This final SessionSlot slot, @SuperCall final Runnable proxy) throws Exception { + if (STF_ENABLED) { + try { + if (DISCONNECT.getAndSet(true)) { + LOGGER.info(() -> "[STF] Return STF Device."); + if (HttpClient.uri(Path.STF_USER_DEVICES_BY_ID_PATH, STF_URL, UDID) + .withAuthorization(buildAuthToken(DEFAULT_STF_TOKEN)) + .delete(Void.class).getStatus() != 200) { + LOGGER.warning(() -> "[STF] Could not return device to the STF."); + } + } + } catch (Exception e) { + LOGGER.warning(() -> String.format("[STF] Could not return device to the STF. Error: %s", e.getMessage())); + } + } + proxy.run(); + } + + private static String buildAuthToken(String authToken) { + return "Bearer " + authToken; + } +} diff --git a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/SessionSlotReserveInterceptor.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/SessionSlotReserveInterceptor.java new file mode 100644 index 0000000..bb35b9c --- /dev/null +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/SessionSlotReserveInterceptor.java @@ -0,0 +1,113 @@ +package com.zebrunner.mcloud.grid.agent; + +import com.zebrunner.mcloud.grid.agent.stf.entity.Devices; +import com.zebrunner.mcloud.grid.agent.stf.entity.Path; +import com.zebrunner.mcloud.grid.agent.stf.entity.STFDevice; +import com.zebrunner.mcloud.grid.agent.stf.entity.User; +import com.zebrunner.mcloud.grid.agent.util.HttpClient; +import net.bytebuddy.implementation.bind.annotation.RuntimeType; +import net.bytebuddy.implementation.bind.annotation.SuperCall; +import net.bytebuddy.implementation.bind.annotation.This; +import org.apache.commons.lang3.StringUtils; +import org.openqa.selenium.grid.node.local.SessionSlot; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.util.logging.Logger; + +import static com.zebrunner.mcloud.grid.agent.SessionSlotReleaseInterceptor.DISCONNECT; + +public class SessionSlotReserveInterceptor { + + private static final Logger LOGGER = Logger.getLogger(SessionSlotReserveInterceptor.class.getName()); + private static final String NOT_AUTHENTICATED_ERROR = "[STF] Not authenticated at STF successfully! URL: '%s'; Token: '%s'"; + private static final String UNABLE_GET_DEVICES_STATUS_ERROR = "[STF] Unable to get devices status. HTTP status: %s"; + private static final String COULD_NOT_FIND_DEVICE_ERROR = "[STF] Could not find STF device with udid: %s"; + private static final String STF_URL = System.getenv("STF_URL"); + private static final String DEFAULT_STF_TOKEN = System.getenv("STF_TOKEN"); + private static final boolean STF_ENABLED = (!StringUtils.isEmpty(STF_URL) && !StringUtils.isEmpty(DEFAULT_STF_TOKEN)); + // Max time is seconds for reserving devices in STF + private static final String DEFAULT_STF_TIMEOUT = Optional.ofNullable(System.getenv("STF_TIMEOUT")) + .filter(StringUtils::isNotBlank) + .orElse("3600"); + private static final String UDID = System.getenv("DEVICE_UDID"); + + @RuntimeType + public static void onTestMethodInvocation(@This final SessionSlot slot, @SuperCall final Runnable proxy) throws Exception { + try { + if (STF_ENABLED) { + // String stfToken = CapabilityUtils.getZebrunnerCapability(slot, "STF_TOKEN") + // .map(String::valueOf) + // .orElse(DEFAULT_STF_TOKEN); + String stfToken = DEFAULT_STF_TOKEN; + + HttpClient.Response user = HttpClient.uri(Path.STF_USER_PATH, STF_URL) + .withAuthorization(buildAuthToken(stfToken)) + .get(User.class); + if (user.getStatus() != 200) { + LOGGER.warning(() -> String.format(NOT_AUTHENTICATED_ERROR, STF_URL, stfToken)); + return; + } + HttpClient.Response devices = HttpClient.uri(Path.STF_DEVICES_PATH, STF_URL) + .withAuthorization(buildAuthToken(stfToken)) + .get(Devices.class); + + if (devices.getStatus() != 200) { + LOGGER.warning(() -> String.format(UNABLE_GET_DEVICES_STATUS_ERROR, devices.getStatus())); + return; + } + + Optional optionalSTFDevice = devices.getObject() + .getDevices() + .stream() + .filter(device -> StringUtils.equals(device.getSerial(), UDID)) + .findFirst(); + if (optionalSTFDevice.isEmpty()) { + LOGGER.warning(() -> String.format(COULD_NOT_FIND_DEVICE_ERROR, UDID)); + return; + } + + STFDevice device = optionalSTFDevice.get(); + LOGGER.info(() -> String.format("[STF] STF device info: %s", device)); + + boolean reserve = true; + + if (device.getOwner() != null) { + if (!(StringUtils.equals(device.getOwner().getName(), user.getObject().getUser().getName()) && + device.getPresent() && + device.getReady())) { + LOGGER.warning(() -> String.format("[STF] STF device busy by %s or not present/ready.", device.getOwner().getName())); + return; + } else if (!StringUtils.equals(stfToken, DEFAULT_STF_TOKEN)) { + DISCONNECT.set(false); + LOGGER.info(() -> String.format("[STF] STF device manually reserved by the same user: %s.", device.getOwner().getName())); + reserve = false; + } + } + if (reserve) { + Map entity = new HashMap<>(); + entity.put("serial", UDID); + entity.put("timeout", + TimeUnit.SECONDS.toMillis(Integer.parseInt(DEFAULT_STF_TIMEOUT))); + if (HttpClient.uri(Path.STF_USER_DEVICES_PATH, STF_URL) + .withAuthorization(buildAuthToken(stfToken)) + .post(Void.class, entity).getStatus() != 200) { + LOGGER.warning(() -> String.format("[STF] Could not reserve STF device with udid: %s.", UDID)); + } else { + LOGGER.info(() -> "[STF] Device successfully reserved."); + } + } + } + } catch (Exception e) { + LOGGER.warning(() -> String.format("[STF] Could not reserve STF device. Error: %s", e.getMessage())); + } finally { + proxy.run(); + } + } + + private static String buildAuthToken(String authToken) { + return "Bearer " + authToken; + } +} diff --git a/src/main/java/com/zebrunner/mcloud/grid/models/stf/App.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/App.java similarity index 97% rename from src/main/java/com/zebrunner/mcloud/grid/models/stf/App.java rename to agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/App.java index bb6a1db..50c6d2d 100644 --- a/src/main/java/com/zebrunner/mcloud/grid/models/stf/App.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/App.java @@ -14,7 +14,7 @@ * limitations under the License. *******************************************************************************/ -package com.zebrunner.mcloud.grid.models.stf; +package com.zebrunner.mcloud.grid.agent.stf.entity; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; diff --git a/src/main/java/com/zebrunner/mcloud/grid/models/stf/Battery.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Battery.java similarity index 97% rename from src/main/java/com/zebrunner/mcloud/grid/models/stf/Battery.java rename to agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Battery.java index 83ebd59..06a71f6 100644 --- a/src/main/java/com/zebrunner/mcloud/grid/models/stf/Battery.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Battery.java @@ -14,20 +14,19 @@ * limitations under the License. *******************************************************************************/ -package com.zebrunner.mcloud.grid.models.stf; - -import java.util.HashMap; -import java.util.Map; +package com.zebrunner.mcloud.grid.agent.stf.entity; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; - import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import java.util.HashMap; +import java.util.Map; + @Getter @Setter @NoArgsConstructor diff --git a/src/main/java/com/zebrunner/mcloud/grid/models/stf/Browser.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Browser.java similarity index 97% rename from src/main/java/com/zebrunner/mcloud/grid/models/stf/Browser.java rename to agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Browser.java index 66c9cf4..86ee2ef 100644 --- a/src/main/java/com/zebrunner/mcloud/grid/models/stf/Browser.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Browser.java @@ -14,7 +14,7 @@ * limitations under the License. *******************************************************************************/ -package com.zebrunner.mcloud.grid.models.stf; +package com.zebrunner.mcloud.grid.agent.stf.entity; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; diff --git a/src/main/java/com/zebrunner/mcloud/grid/models/stf/Device.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Device.java similarity index 96% rename from src/main/java/com/zebrunner/mcloud/grid/models/stf/Device.java rename to agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Device.java index 98db35a..22f4a2e 100644 --- a/src/main/java/com/zebrunner/mcloud/grid/models/stf/Device.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Device.java @@ -14,20 +14,19 @@ * limitations under the License. *******************************************************************************/ -package com.zebrunner.mcloud.grid.models.stf; - -import java.util.HashMap; -import java.util.Map; +package com.zebrunner.mcloud.grid.agent.stf.entity; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; - import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import java.util.HashMap; +import java.util.Map; + @Getter @Setter @NoArgsConstructor diff --git a/src/main/java/com/zebrunner/mcloud/grid/models/stf/Devices.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Devices.java similarity index 97% rename from src/main/java/com/zebrunner/mcloud/grid/models/stf/Devices.java rename to agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Devices.java index 49645f4..08dc5e0 100644 --- a/src/main/java/com/zebrunner/mcloud/grid/models/stf/Devices.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Devices.java @@ -14,7 +14,7 @@ * limitations under the License. *******************************************************************************/ -package com.zebrunner.mcloud.grid.models.stf; +package com.zebrunner.mcloud.grid.agent.stf.entity; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; diff --git a/src/main/java/com/zebrunner/mcloud/grid/models/stf/Display.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Display.java similarity index 97% rename from src/main/java/com/zebrunner/mcloud/grid/models/stf/Display.java rename to agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Display.java index 2611f7f..4a1dcbf 100644 --- a/src/main/java/com/zebrunner/mcloud/grid/models/stf/Display.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Display.java @@ -14,7 +14,7 @@ * limitations under the License. *******************************************************************************/ -package com.zebrunner.mcloud.grid.models.stf; +package com.zebrunner.mcloud.grid.agent.stf.entity; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; diff --git a/src/main/java/com/zebrunner/mcloud/grid/models/stf/Network.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Network.java similarity index 97% rename from src/main/java/com/zebrunner/mcloud/grid/models/stf/Network.java rename to agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Network.java index 54a4509..b0ecbd5 100644 --- a/src/main/java/com/zebrunner/mcloud/grid/models/stf/Network.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Network.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ -package com.zebrunner.mcloud.grid.models.stf; +package com.zebrunner.mcloud.grid.agent.stf.entity; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; diff --git a/src/main/java/com/zebrunner/mcloud/grid/integration/client/Path.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Path.java similarity index 97% rename from src/main/java/com/zebrunner/mcloud/grid/integration/client/Path.java rename to agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Path.java index 60ea490..7d75abd 100644 --- a/src/main/java/com/zebrunner/mcloud/grid/integration/client/Path.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Path.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ -package com.zebrunner.mcloud.grid.integration.client; +package com.zebrunner.mcloud.grid.agent.stf.entity; public enum Path { diff --git a/src/main/java/com/zebrunner/mcloud/grid/models/stf/Phone.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Phone.java similarity index 97% rename from src/main/java/com/zebrunner/mcloud/grid/models/stf/Phone.java rename to agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Phone.java index f9dfa4d..d5235ea 100644 --- a/src/main/java/com/zebrunner/mcloud/grid/models/stf/Phone.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Phone.java @@ -14,7 +14,7 @@ * limitations under the License. *******************************************************************************/ -package com.zebrunner.mcloud.grid.models.stf; +package com.zebrunner.mcloud.grid.agent.stf.entity; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; diff --git a/src/main/java/com/zebrunner/mcloud/grid/models/stf/Provider.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Provider.java similarity index 96% rename from src/main/java/com/zebrunner/mcloud/grid/models/stf/Provider.java rename to agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Provider.java index 161e1df..345ca00 100644 --- a/src/main/java/com/zebrunner/mcloud/grid/models/stf/Provider.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/Provider.java @@ -14,7 +14,7 @@ * limitations under the License. *******************************************************************************/ -package com.zebrunner.mcloud.grid.models.stf; +package com.zebrunner.mcloud.grid.agent.stf.entity; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; diff --git a/src/main/java/com/zebrunner/mcloud/grid/models/stf/RemoteConnectUserDevice.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/RemoteConnectUserDevice.java similarity index 95% rename from src/main/java/com/zebrunner/mcloud/grid/models/stf/RemoteConnectUserDevice.java rename to agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/RemoteConnectUserDevice.java index d5fd173..714c92f 100644 --- a/src/main/java/com/zebrunner/mcloud/grid/models/stf/RemoteConnectUserDevice.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/RemoteConnectUserDevice.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ -package com.zebrunner.mcloud.grid.models.stf; +package com.zebrunner.mcloud.grid.agent.stf.entity; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/zebrunner/mcloud/grid/models/stf/STFDevice.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/STFDevice.java similarity index 98% rename from src/main/java/com/zebrunner/mcloud/grid/models/stf/STFDevice.java rename to agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/STFDevice.java index 1ade84d..8466729 100644 --- a/src/main/java/com/zebrunner/mcloud/grid/models/stf/STFDevice.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/STFDevice.java @@ -14,7 +14,7 @@ * limitations under the License. *******************************************************************************/ -package com.zebrunner.mcloud.grid.models.stf; +package com.zebrunner.mcloud.grid.agent.stf.entity; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; diff --git a/src/main/java/com/zebrunner/mcloud/grid/models/stf/STFUser.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/STFUser.java similarity index 96% rename from src/main/java/com/zebrunner/mcloud/grid/models/stf/STFUser.java rename to agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/STFUser.java index 0812c41..8b2ed52 100644 --- a/src/main/java/com/zebrunner/mcloud/grid/models/stf/STFUser.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/STFUser.java @@ -14,20 +14,19 @@ * limitations under the License. *******************************************************************************/ -package com.zebrunner.mcloud.grid.models.stf; - -import java.util.HashMap; -import java.util.Map; +package com.zebrunner.mcloud.grid.agent.stf.entity; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; - import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import java.util.HashMap; +import java.util.Map; + @Getter @Setter @NoArgsConstructor diff --git a/src/main/java/com/zebrunner/mcloud/grid/models/stf/User.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/User.java similarity index 96% rename from src/main/java/com/zebrunner/mcloud/grid/models/stf/User.java rename to agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/User.java index 4ca1054..d78d53a 100644 --- a/src/main/java/com/zebrunner/mcloud/grid/models/stf/User.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/stf/entity/User.java @@ -14,20 +14,19 @@ * limitations under the License. *******************************************************************************/ -package com.zebrunner.mcloud.grid.models.stf; - -import java.util.HashMap; -import java.util.Map; +package com.zebrunner.mcloud.grid.agent.stf.entity; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; - import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import java.util.HashMap; +import java.util.Map; + @Getter @Setter @NoArgsConstructor diff --git a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/utils/CapabilityUtils.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/util/CapabilityUtils.java similarity index 79% rename from agent/src/main/java/com/zebrunner/mcloud/grid/agent/utils/CapabilityUtils.java rename to agent/src/main/java/com/zebrunner/mcloud/grid/agent/util/CapabilityUtils.java index 647fb80..21ff5ac 100644 --- a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/utils/CapabilityUtils.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/util/CapabilityUtils.java @@ -1,9 +1,10 @@ -package com.zebrunner.mcloud.grid.agent.utils; +package com.zebrunner.mcloud.grid.agent.util; import org.openqa.selenium.Capabilities; import java.util.ArrayList; import java.util.List; +import java.util.Optional; public final class CapabilityUtils { private static final String APPIUM_PREFIX = "appium:"; @@ -33,6 +34,16 @@ public static T getAppiumCapability(Capabilities caps, String name, Class } return null; } + public static Optional getZebrunnerCapability(Capabilities capabilities, String capabilityName) { + Object value = capabilities.getCapability("zebrunner:" + capabilityName); + if (value == null) { + value = capabilities.getCapability("appium:" + capabilityName); + } + if (value == null) { + value = capabilities.getCapability(capabilityName); + } + return Optional.ofNullable(value); + } public static T getZebrunnerCapability(Capabilities caps, String name, Class expectedType) { List possibleNames = new ArrayList<>(); diff --git a/src/main/java/com/zebrunner/mcloud/grid/util/GensonProvider.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/util/GensonProvider.java similarity index 96% rename from src/main/java/com/zebrunner/mcloud/grid/util/GensonProvider.java rename to agent/src/main/java/com/zebrunner/mcloud/grid/agent/util/GensonProvider.java index 9f3de79..6d27132 100644 --- a/src/main/java/com/zebrunner/mcloud/grid/util/GensonProvider.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/util/GensonProvider.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ -package com.zebrunner.mcloud.grid.util; +package com.zebrunner.mcloud.grid.agent.util; import com.owlike.genson.Genson; import com.owlike.genson.GensonBuilder; diff --git a/src/main/java/com/zebrunner/mcloud/grid/util/HttpClient.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/util/HttpClient.java similarity index 98% rename from src/main/java/com/zebrunner/mcloud/grid/util/HttpClient.java rename to agent/src/main/java/com/zebrunner/mcloud/grid/agent/util/HttpClient.java index 1bf2473..e6101f5 100644 --- a/src/main/java/com/zebrunner/mcloud/grid/util/HttpClient.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/util/HttpClient.java @@ -13,28 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ -package com.zebrunner.mcloud.grid.util; - -import java.util.Map; -import java.util.function.Function; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; - -import org.apache.commons.lang3.StringUtils; +package com.zebrunner.mcloud.grid.agent.util; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.core.util.MultivaluedMapImpl; -import com.zebrunner.mcloud.grid.integration.client.Path; +import com.zebrunner.mcloud.grid.agent.stf.entity.Path; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.concurrent.ConcurrentException; import org.apache.commons.lang3.concurrent.LazyInitializer; import org.apache.commons.lang3.exception.ExceptionUtils; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import java.util.Map; +import java.util.function.Function; +import java.util.logging.Level; +import java.util.logging.Logger; + public final class HttpClient { private static final Logger LOGGER = Logger.getLogger(HttpClient.class.getName()); diff --git a/src/main/java/com/zebrunner/mcloud/grid/util/HttpClientApache.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/util/HttpClientApache.java similarity index 89% rename from src/main/java/com/zebrunner/mcloud/grid/util/HttpClientApache.java rename to agent/src/main/java/com/zebrunner/mcloud/grid/agent/util/HttpClientApache.java index 387f2b8..5dbaa11 100644 --- a/src/main/java/com/zebrunner/mcloud/grid/util/HttpClientApache.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/util/HttpClientApache.java @@ -13,14 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ -package com.zebrunner.mcloud.grid.util; - -import java.io.IOException; -import java.net.URI; -import java.time.Duration; -import java.util.logging.Level; -import java.util.logging.Logger; +package com.zebrunner.mcloud.grid.agent.util; +import com.zebrunner.mcloud.grid.agent.stf.entity.Path; import org.apache.hc.client5.http.classic.methods.HttpDelete; import org.apache.hc.client5.http.classic.methods.HttpGet; import org.apache.hc.client5.http.classic.methods.HttpPost; @@ -36,8 +31,11 @@ import org.apache.hc.core5.http.io.entity.EntityUtils; import org.apache.hc.core5.util.Timeout; -import com.zebrunner.mcloud.grid.integration.client.Path; -import com.zebrunner.mcloud.grid.util.HttpClient.Response; +import java.io.IOException; +import java.net.URI; +import java.time.Duration; +import java.util.logging.Level; +import java.util.logging.Logger; public final class HttpClientApache { @@ -66,7 +64,7 @@ public HttpClientApache withUri(Path path, String serviceUrl, Object... paramete return this; } - public Response get() { + public HttpClient.Response get() { if (url == null) { LOGGER.log(Level.WARNING, "url should be specified!"); return null; @@ -87,7 +85,7 @@ public String getMethod() { } } - public Response get(HttpEntity entity) { + public HttpClient.Response get(HttpEntity entity) { if (url == null) { LOGGER.log(Level.WARNING, "url should be specified!"); return null; @@ -97,7 +95,7 @@ public Response get(HttpEntity entity) { return execute(get); } - public Response post(HttpEntity entity) { + public HttpClient.Response post(HttpEntity entity) { if (url == null) { LOGGER.log(Level.WARNING, "url should be specified!"); return null; @@ -107,7 +105,7 @@ public Response post(HttpEntity entity) { return execute(post); } - public Response put(HttpEntity entity) { + public HttpClient.Response put(HttpEntity entity) { if (url == null) { LOGGER.log(Level.WARNING, "url should be specified!"); return null; @@ -117,7 +115,7 @@ public Response put(HttpEntity entity) { return execute(put); } - public Response delete() { + public HttpClient.Response delete() { if (url == null) { LOGGER.log(Level.WARNING, "url should be specified!"); return null; @@ -126,8 +124,8 @@ public Response delete() { return execute(delete); } - private Response execute(HttpUriRequest req) { - Response result = new Response<>(); + private HttpClient.Response execute(HttpUriRequest req) { + HttpClient.Response result = new HttpClient.Response<>(); try (CloseableHttpClient httpClient = HttpClientBuilder.create() .setDefaultRequestConfig(requestConfig) .build(); diff --git a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/DeviceNameValidator.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/DeviceNameValidator.java index 31dc9c5..4378d6f 100644 --- a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/DeviceNameValidator.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/DeviceNameValidator.java @@ -1,6 +1,6 @@ package com.zebrunner.mcloud.grid.agent.validator; -import com.zebrunner.mcloud.grid.agent.utils.CapabilityUtils; +import com.zebrunner.mcloud.grid.agent.util.CapabilityUtils; import org.apache.commons.lang3.StringUtils; import org.openqa.selenium.Capabilities; diff --git a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/DeviceTypeValidator.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/DeviceTypeValidator.java index 738219c..b7b3e04 100644 --- a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/DeviceTypeValidator.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/DeviceTypeValidator.java @@ -1,6 +1,6 @@ package com.zebrunner.mcloud.grid.agent.validator; -import com.zebrunner.mcloud.grid.agent.utils.CapabilityUtils; +import com.zebrunner.mcloud.grid.agent.util.CapabilityUtils; import org.apache.commons.lang3.StringUtils; import org.openqa.selenium.Capabilities; diff --git a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/MobilePlatformValidator.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/MobilePlatformValidator.java index 9a51121..819f2ec 100644 --- a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/MobilePlatformValidator.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/MobilePlatformValidator.java @@ -1,6 +1,6 @@ package com.zebrunner.mcloud.grid.agent.validator; -import com.zebrunner.mcloud.grid.agent.utils.CapabilityUtils; +import com.zebrunner.mcloud.grid.agent.util.CapabilityUtils; import org.apache.commons.lang3.StringUtils; import org.openqa.selenium.Capabilities; import org.openqa.selenium.Platform; diff --git a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/PlatformVersionValidator.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/PlatformVersionValidator.java index 3f1e2ef..3340763 100644 --- a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/PlatformVersionValidator.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/PlatformVersionValidator.java @@ -1,6 +1,6 @@ package com.zebrunner.mcloud.grid.agent.validator; -import com.zebrunner.mcloud.grid.agent.utils.CapabilityUtils; +import com.zebrunner.mcloud.grid.agent.util.CapabilityUtils; import org.openqa.selenium.Capabilities; import javax.annotation.Nonnull; diff --git a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/UDIDValidator.java b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/UDIDValidator.java index fb2aa90..48713e8 100644 --- a/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/UDIDValidator.java +++ b/agent/src/main/java/com/zebrunner/mcloud/grid/agent/validator/UDIDValidator.java @@ -1,6 +1,6 @@ package com.zebrunner.mcloud.grid.agent.validator; -import com.zebrunner.mcloud.grid.agent.utils.CapabilityUtils; +import com.zebrunner.mcloud.grid.agent.util.CapabilityUtils; import org.apache.commons.lang3.StringUtils; import org.openqa.selenium.Capabilities; diff --git a/pom.xml b/pom.xml index 1906c95..f2efba1 100644 --- a/pom.xml +++ b/pom.xml @@ -11,13 +11,7 @@ UTF-8 4.17.0 - 1.2 3.14.0 - 2.16.0 - 5.2.2 - 1.6 - 1.19.4 - 1.18.30 3.5.0 3.6.1 3.11.0 @@ -35,42 +29,11 @@ selenium-api ${selenium.version} - - org.projectlombok - lombok - ${lombok.version} - provided - org.apache.commons commons-lang3 ${commons-lang3.version} - - com.fasterxml.jackson.core - jackson-databind - ${jackson-databind.version} - - - org.apache.httpcomponents.client5 - httpclient5 - ${httpclient.version} - - - com.owlike - genson - ${genson.version} - - - com.sun.jersey - jersey-bundle - ${jersey-bundle.version} - - - jakarta.annotation - jakarta.annotation-api - 3.0.0-M1 - diff --git a/src/main/java/com/zebrunner/mcloud/grid/MobileRemoteProxy.java b/src/main/java/com/zebrunner/mcloud/grid/MobileRemoteProxy.java index 706182b..15d53b2 100644 --- a/src/main/java/com/zebrunner/mcloud/grid/MobileRemoteProxy.java +++ b/src/main/java/com/zebrunner/mcloud/grid/MobileRemoteProxy.java @@ -15,12 +15,6 @@ *******************************************************************************/ package com.zebrunner.mcloud.grid; -import com.zebrunner.mcloud.grid.integration.client.Path; -import com.zebrunner.mcloud.grid.util.CapabilityUtils; -import com.zebrunner.mcloud.grid.util.HttpClient; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.apache.commons.lang3.reflect.FieldUtils; import org.openqa.selenium.Capabilities; import org.openqa.selenium.NoSuchSessionException; import org.openqa.selenium.WebDriverException; @@ -35,43 +29,22 @@ import org.openqa.selenium.grid.node.Node; import org.openqa.selenium.grid.node.local.LocalNode; import org.openqa.selenium.grid.node.local.LocalNodeFactory; -import org.openqa.selenium.grid.node.local.SessionSlot; import org.openqa.selenium.grid.security.Secret; import org.openqa.selenium.grid.security.SecretOptions; import org.openqa.selenium.grid.server.BaseServerOptions; import org.openqa.selenium.internal.Either; import org.openqa.selenium.io.TemporaryFilesystem; import org.openqa.selenium.remote.SessionId; -import org.openqa.selenium.remote.http.HttpMethod; import org.openqa.selenium.remote.http.HttpRequest; import org.openqa.selenium.remote.http.HttpResponse; import org.openqa.selenium.remote.tracing.Tracer; import java.io.IOException; import java.net.URI; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; import java.util.UUID; -import java.util.concurrent.TimeUnit; -import java.util.logging.Logger; public class MobileRemoteProxy extends Node { - private static final Logger LOGGER = Logger.getLogger(MobileRemoteProxy.class.getName()); - private static final String NOT_AUTHENTICATED_ERROR = "[STF] Not authenticated at STF successfully! URL: '%s'; Token: '%s'"; - private static final String UNABLE_GET_DEVICES_STATUS_ERROR = "[STF] Unable to get devices status. HTTP status: %s"; - private static final String COULD_NOT_FIND_DEVICE_ERROR = "[STF] Could not find STF device with udid: %s"; - private static final String STF_URL = System.getenv("STF_URL"); - private static final String DEFAULT_STF_TOKEN = System.getenv("STF_TOKEN"); - // Max time is seconds for reserving devices in STF - private static final String DEFAULT_STF_TIMEOUT = Optional.ofNullable(System.getenv("STF_TIMEOUT")) - .filter(StringUtils::isNotBlank) - .orElse("3600"); - private LocalNode node; - private Capabilities stereotype; - private String udid; protected MobileRemoteProxy(Tracer tracer, URI uri, Secret registrationSecret) { super(tracer, new NodeId(UUID.randomUUID()), uri, registrationSecret); @@ -89,97 +62,16 @@ public static Node create(Config config) { MobileRemoteProxy wrapper = new MobileRemoteProxy(loggingOptions.getTracer(), uri, secretOptions.getRegistrationSecret()); wrapper.node = (LocalNode) node; - try { - wrapper.stereotype = ((List) FieldUtils.readField(node, "factories", true)).get(0) - .getStereotype(); - } catch (IllegalAccessException e) { - return ExceptionUtils.rethrow(e); - } - wrapper.udid = String.valueOf(CapabilityUtils.getAppiumCapability(wrapper.stereotype, "udid").orElseThrow()); return wrapper; } @Override public Either newSession(CreateSessionRequest sessionRequest) { - /* - if (isSTFEnabled()) { - HttpClient.Response user = HttpClient.uri(Path.STF_USER_PATH, STF_URL) - .withAuthorization(buildAuthToken(stfToken)) - .get(User.class); - if (user.getStatus() != 200) { - LOGGER.warning(() -> - String.format(NOT_AUTHENTICATED_ERROR, STF_URL, stfToken)); - return Either.left( - new RetrySessionRequestException(String.format(NOT_AUTHENTICATED_ERROR, STF_URL, stfToken))); - } - HttpClient.Response devices = HttpClient.uri(Path.STF_DEVICES_PATH, STF_URL) - .withAuthorization(buildAuthToken(stfToken)) - .get(Devices.class); - - if (devices.getStatus() != 200) { - LOGGER.warning(() -> String.format(UNABLE_GET_DEVICES_STATUS_ERROR, devices.getStatus())); - return Either.left( - new RetrySessionRequestException(String.format(UNABLE_GET_DEVICES_STATUS_ERROR, devices.getStatus()))); - } - - Optional optionalSTFDevice = devices.getObject() - .getDevices() - .stream() - .filter(device -> StringUtils.equals(device.getSerial(), udid)) - .findFirst(); - if (optionalSTFDevice.isEmpty()) { - LOGGER.warning(() -> String.format(COULD_NOT_FIND_DEVICE_ERROR, udid)); - return Either.left( - new RetrySessionRequestException(String.format(COULD_NOT_FIND_DEVICE_ERROR, udid))); - } - - STFDevice device = optionalSTFDevice.get(); - LOGGER.info(() -> String.format("STF device info: %s", device)); - - if (device.getOwner() != null) { - if (!(StringUtils.equals(device.getOwner().getName(), user.getObject().getUser().getName()) && - device.getPresent() && - device.getReady())) { - return Either.left(new RetrySessionRequestException( - String.format("STF device busy by %s or not present/ready.", device.getOwner().getName()))); - } - } - } - */ - - Either response = node.newSession(sessionRequest); - if (response.isRight() && isSTFEnabled()) { - String stfToken = CapabilityUtils.getZebrunnerCapability(sessionRequest.getDesiredCapabilities(), "STF_TOKEN") - .map(String::valueOf) - .orElse(DEFAULT_STF_TOKEN); - Map entity = new HashMap<>(); - entity.put("serial", udid); - entity.put("timeout", - TimeUnit.SECONDS.toMillis(CapabilityUtils.getZebrunnerCapability(sessionRequest.getDesiredCapabilities(), "STF_TIMEOUT") - .map(String::valueOf) - .map(Integer::parseInt) - .orElse(Integer.parseInt(DEFAULT_STF_TIMEOUT)))); - if (HttpClient.uri(Path.STF_USER_DEVICES_PATH, STF_URL) - .withAuthorization(buildAuthToken(stfToken)) - .post(Void.class, entity).getStatus() != 200) { - LOGGER.warning(() -> String.format("[STF] Could not reserve STF device with udid: %s.", udid)); - } - } - return response; + return node.newSession(sessionRequest); } @Override public HttpResponse executeWebDriverCommand(HttpRequest req) { - if (HttpMethod.DELETE.equals(req.getMethod())) { - if (isSTFEnabled()) { - LOGGER.info(() -> "[STF] Return STF Device."); - if (HttpClient.uri(Path.STF_USER_DEVICES_BY_ID_PATH, STF_URL, udid) - .withAuthorization(buildAuthToken(DEFAULT_STF_TOKEN)) - .delete(Void.class).getStatus() != 200) { - LOGGER.warning(() -> "[STF] Could not return device to the STF."); - } - } - } return node.executeWebDriverCommand(req); } @@ -210,14 +102,6 @@ public TemporaryFilesystem getUploadsFilesystem(SessionId id) throws IOException @Override public void stop(SessionId id) throws NoSuchSessionException { - if (isSTFEnabled()) { - LOGGER.info(() -> "[STF] Return STF Device."); - if (HttpClient.uri(Path.STF_USER_DEVICES_BY_ID_PATH, STF_URL, udid) - .withAuthorization(buildAuthToken(DEFAULT_STF_TOKEN)) - .delete(Void.class).getStatus() != 200) { - LOGGER.warning(() -> "[STF] Could not return device to the STF."); - } - } node.stop(id); } @@ -251,11 +135,4 @@ public boolean isReady() { return node.isReady(); } - private static boolean isSTFEnabled() { - return (!StringUtils.isEmpty(STF_URL) && !StringUtils.isEmpty(DEFAULT_STF_TOKEN)); - } - - private static String buildAuthToken(String authToken) { - return "Bearer " + authToken; - } }