From ebc60c7e74bf5cbbae63307f577e1f87d7c04878 Mon Sep 17 00:00:00 2001 From: Auto81 <48491431+Auto81@users.noreply.github.com> Date: Mon, 20 Jan 2025 08:31:02 +0000 Subject: [PATCH 01/11] Update CACHED_PROXY_CLASSES Replace ConcurrentHashMap with WeakHashMap wrapped with Collections.synchronizedMap to ensure thread-safety. --- src/main/java/io/appium/java_client/proxy/Helpers.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/appium/java_client/proxy/Helpers.java b/src/main/java/io/appium/java_client/proxy/Helpers.java index d162c3ed5..043f19379 100644 --- a/src/main/java/io/appium/java_client/proxy/Helpers.java +++ b/src/main/java/io/appium/java_client/proxy/Helpers.java @@ -50,7 +50,7 @@ public class Helpers { // the performance and to avoid extensive memory usage for our case, where // the amount of instrumented proxy classes we create is low in comparison to the amount // of proxy instances. - private static final ConcurrentMap> CACHED_PROXY_CLASSES = new ConcurrentHashMap<>(); + private static final Map> CACHED_PROXY_CLASSES = Collections.synchronizedMap(new WeakHashMap<>()); private Helpers() { } From dd7e7677400818b8942cf9312d72788b7cd291b2 Mon Sep 17 00:00:00 2001 From: Auto81 <48491431+Auto81@users.noreply.github.com> Date: Mon, 20 Jan 2025 10:36:55 +0000 Subject: [PATCH 02/11] Update CACHED_PROXY_CLASSES --- .../io/appium/java_client/proxy/Helpers.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/appium/java_client/proxy/Helpers.java b/src/main/java/io/appium/java_client/proxy/Helpers.java index 043f19379..082a00e00 100644 --- a/src/main/java/io/appium/java_client/proxy/Helpers.java +++ b/src/main/java/io/appium/java_client/proxy/Helpers.java @@ -17,6 +17,8 @@ package io.appium.java_client.proxy; import com.google.common.base.Preconditions; +import java.util.Map; +import java.util.WeakHashMap; import lombok.Value; import net.bytebuddy.ByteBuddy; import net.bytebuddy.description.method.MethodDescription; @@ -32,14 +34,15 @@ import java.util.Collection; import java.util.Collections; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; import java.util.stream.Collectors; import java.util.stream.Stream; import static java.util.Objects.requireNonNull; import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; +/** + * The type Helpers. + */ public class Helpers { public static final Set OBJECT_METHOD_NAMES = Stream.of(Object.class.getMethods()) .map(Method::getName) @@ -52,6 +55,16 @@ public class Helpers { // of proxy instances. private static final Map> CACHED_PROXY_CLASSES = Collections.synchronizedMap(new WeakHashMap<>()); + /** + * Gets CACHED_PROXY_CLASSES size. + * Used for cache clear up tests. + * + * @return the cached proxy classes size + */ + public static int getCachedProxyClassesSize() { + return CACHED_PROXY_CLASSES.size(); + } + private Helpers() { } @@ -115,6 +128,7 @@ public static T createProxy( @Nullable ElementMatcher extraMethodMatcher ) { var signature = ProxyClassSignature.of(cls, constructorArgTypes, extraMethodMatcher); + System.out.println("CACHED_PROXY_CLASSES size = " + CACHED_PROXY_CLASSES.size()); var proxyClass = CACHED_PROXY_CLASSES.computeIfAbsent(signature, k -> { Preconditions.checkArgument(constructorArgs.length == constructorArgTypes.length, String.format( From 8d379b315bddab1b079da4a2d4e031c0db5b16b9 Mon Sep 17 00:00:00 2001 From: Auto81 <48491431+Auto81@users.noreply.github.com> Date: Mon, 20 Jan 2025 10:43:01 +0000 Subject: [PATCH 03/11] Update CombinedWidgetTest to also check growth --- .../tests/combined/CombinedWidgetTest.java | 58 +++++++++++++------ 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java index 3c1c9145d..96c727cc1 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java @@ -6,6 +6,8 @@ import io.appium.java_client.pagefactory_tests.widget.tests.AbstractStubWebDriver; import io.appium.java_client.pagefactory_tests.widget.tests.DefaultStubWidget; import io.appium.java_client.pagefactory_tests.widget.tests.android.DefaultAndroidWidget; +import io.appium.java_client.proxy.Helpers; +import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -20,6 +22,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.lessThan; import static org.openqa.selenium.support.PageFactory.initElements; @@ -33,30 +36,31 @@ public class CombinedWidgetTest { */ public static Stream data() { return Stream.of( - Arguments.of(new AppWithCombinedWidgets(), - new AbstractStubWebDriver.StubAndroidDriver(), DefaultAndroidWidget.class), - Arguments.of(new AppWithCombinedWidgets(), - new AbstractStubWebDriver.StubIOSXCUITDriver(), DefaultIosXCUITWidget.class), - Arguments.of(new AppWithCombinedWidgets(), - new AbstractStubWebDriver.StubBrowserDriver(), DefaultFindByWidget.class), - Arguments.of(new AppWithCombinedWidgets(), - new AbstractStubWebDriver.StubAndroidBrowserOrWebViewDriver(), DefaultFindByWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubAndroidDriver(), DefaultAndroidWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubIOSXCUITDriver(), DefaultStubWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubWindowsDriver(), DefaultStubWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubBrowserDriver(), DefaultFindByWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubAndroidBrowserOrWebViewDriver(), DefaultFindByWidget.class) + Arguments.of(new AppWithCombinedWidgets(), + new AbstractStubWebDriver.StubAndroidDriver(), DefaultAndroidWidget.class), + Arguments.of(new AppWithCombinedWidgets(), + new AbstractStubWebDriver.StubIOSXCUITDriver(), DefaultIosXCUITWidget.class), + Arguments.of(new AppWithCombinedWidgets(), + new AbstractStubWebDriver.StubBrowserDriver(), DefaultFindByWidget.class), + Arguments.of(new AppWithCombinedWidgets(), + new AbstractStubWebDriver.StubAndroidBrowserOrWebViewDriver(), DefaultFindByWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubAndroidDriver(), DefaultAndroidWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubIOSXCUITDriver(), DefaultStubWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubWindowsDriver(), DefaultStubWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubBrowserDriver(), DefaultFindByWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubAndroidBrowserOrWebViewDriver(), DefaultFindByWidget.class) ); } @ParameterizedTest @MethodSource("data") void checkThatWidgetsAreCreatedCorrectly(AbstractApp app, WebDriver driver, Class widgetClass) { + assertProxyClassCacheGrowth(); initElements(new AppiumFieldDecorator(driver), app); assertThat("Expected widget class was " + widgetClass.getName(), app.getWidget().getSubWidget().getSelfReference().getClass(), @@ -161,4 +165,22 @@ public List getWidgets() { return multipleWidgets; } } + + + /** + * Assert proxy class cache growth for this test class. + * The (@link io.appium.java_client.proxy.Helpers#CACHED_PROXY_CLASSES) should be populated during these tests. + * Prior to the Caching issue being resolved + * - the CACHED_PROXY_CLASSES would grow indefinitely, resulting in an Out Of Memory exception. + * - this ParameterizedTest would have the CACHED_PROXY_CLASSES grow to 266 entries. + */ + private void assertProxyClassCacheGrowth() { + System.gc(); //Trying to force a collection for more accurate check numbers + int thresholdSize = 50; + assertThat( + "Proxy Class Cache threshold is " + thresholdSize, + Helpers.getCachedProxyClassesSize(), + lessThan(thresholdSize) + ); + } } From 91ef4ce1e374cc76f1dc0cd45056ed0f377b3a73 Mon Sep 17 00:00:00 2001 From: Auto81 <48491431+Auto81@users.noreply.github.com> Date: Mon, 20 Jan 2025 11:22:20 +0000 Subject: [PATCH 04/11] Update Helpers.java resolve PR comments --- src/main/java/io/appium/java_client/proxy/Helpers.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/appium/java_client/proxy/Helpers.java b/src/main/java/io/appium/java_client/proxy/Helpers.java index 082a00e00..c05a0cc23 100644 --- a/src/main/java/io/appium/java_client/proxy/Helpers.java +++ b/src/main/java/io/appium/java_client/proxy/Helpers.java @@ -16,6 +16,7 @@ package io.appium.java_client.proxy; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import java.util.Map; import java.util.WeakHashMap; @@ -57,10 +58,11 @@ public class Helpers { /** * Gets CACHED_PROXY_CLASSES size. - * Used for cache clear up tests. + * Used for cache clear up tests {@see io.appium.java_client.pagefactory_tests.widget.tests.combined.CombinedWidgetTest}. * * @return the cached proxy classes size */ + @VisibleForTesting public static int getCachedProxyClassesSize() { return CACHED_PROXY_CLASSES.size(); } @@ -128,7 +130,6 @@ public static T createProxy( @Nullable ElementMatcher extraMethodMatcher ) { var signature = ProxyClassSignature.of(cls, constructorArgTypes, extraMethodMatcher); - System.out.println("CACHED_PROXY_CLASSES size = " + CACHED_PROXY_CLASSES.size()); var proxyClass = CACHED_PROXY_CLASSES.computeIfAbsent(signature, k -> { Preconditions.checkArgument(constructorArgs.length == constructorArgTypes.length, String.format( From 0c6bbe09dc3cf75057aaf73248dc520d81419470 Mon Sep 17 00:00:00 2001 From: Auto81 <48491431+Auto81@users.noreply.github.com> Date: Mon, 20 Jan 2025 11:31:10 +0000 Subject: [PATCH 05/11] Update CombinedWidgetTest.java remove unused import --- .../widget/tests/combined/CombinedWidgetTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java index 96c727cc1..563625c45 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java @@ -7,7 +7,6 @@ import io.appium.java_client.pagefactory_tests.widget.tests.DefaultStubWidget; import io.appium.java_client.pagefactory_tests.widget.tests.android.DefaultAndroidWidget; import io.appium.java_client.proxy.Helpers; -import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; From 4b4a400ed2031bfa6a7095274eeca60090fe8085 Mon Sep 17 00:00:00 2001 From: Auto81 <48491431+Auto81@users.noreply.github.com> Date: Mon, 20 Jan 2025 11:36:28 +0000 Subject: [PATCH 06/11] Update CombinedWidgetTest.java re align formatting to original --- .../tests/combined/CombinedWidgetTest.java | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java index 563625c45..1327623a9 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java @@ -35,24 +35,24 @@ public class CombinedWidgetTest { */ public static Stream data() { return Stream.of( - Arguments.of(new AppWithCombinedWidgets(), - new AbstractStubWebDriver.StubAndroidDriver(), DefaultAndroidWidget.class), - Arguments.of(new AppWithCombinedWidgets(), - new AbstractStubWebDriver.StubIOSXCUITDriver(), DefaultIosXCUITWidget.class), - Arguments.of(new AppWithCombinedWidgets(), - new AbstractStubWebDriver.StubBrowserDriver(), DefaultFindByWidget.class), - Arguments.of(new AppWithCombinedWidgets(), - new AbstractStubWebDriver.StubAndroidBrowserOrWebViewDriver(), DefaultFindByWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubAndroidDriver(), DefaultAndroidWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubIOSXCUITDriver(), DefaultStubWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubWindowsDriver(), DefaultStubWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubBrowserDriver(), DefaultFindByWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubAndroidBrowserOrWebViewDriver(), DefaultFindByWidget.class) + Arguments.of(new AppWithCombinedWidgets(), + new AbstractStubWebDriver.StubAndroidDriver(), DefaultAndroidWidget.class), + Arguments.of(new AppWithCombinedWidgets(), + new AbstractStubWebDriver.StubIOSXCUITDriver(), DefaultIosXCUITWidget.class), + Arguments.of(new AppWithCombinedWidgets(), + new AbstractStubWebDriver.StubBrowserDriver(), DefaultFindByWidget.class), + Arguments.of(new AppWithCombinedWidgets(), + new AbstractStubWebDriver.StubAndroidBrowserOrWebViewDriver(), DefaultFindByWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubAndroidDriver(), DefaultAndroidWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubIOSXCUITDriver(), DefaultStubWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubWindowsDriver(), DefaultStubWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubBrowserDriver(), DefaultFindByWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubAndroidBrowserOrWebViewDriver(), DefaultFindByWidget.class) ); } From 8313002e3535380e283babce10ca9dd3394ecc47 Mon Sep 17 00:00:00 2001 From: Auto81 <48491431+Auto81@users.noreply.github.com> Date: Mon, 20 Jan 2025 11:58:20 +0000 Subject: [PATCH 07/11] Update Helpers.java --- src/main/java/io/appium/java_client/proxy/Helpers.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/io/appium/java_client/proxy/Helpers.java b/src/main/java/io/appium/java_client/proxy/Helpers.java index c05a0cc23..2261bc01c 100644 --- a/src/main/java/io/appium/java_client/proxy/Helpers.java +++ b/src/main/java/io/appium/java_client/proxy/Helpers.java @@ -41,9 +41,6 @@ import static java.util.Objects.requireNonNull; import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; -/** - * The type Helpers. - */ public class Helpers { public static final Set OBJECT_METHOD_NAMES = Stream.of(Object.class.getMethods()) .map(Method::getName) From 9a8c1bf559e693559770c7b45ffee415126361e8 Mon Sep 17 00:00:00 2001 From: Auto81 <48491431+Auto81@users.noreply.github.com> Date: Mon, 20 Jan 2025 16:06:08 +0000 Subject: [PATCH 08/11] Update Helpers.java --- .../io/appium/java_client/proxy/Helpers.java | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/main/java/io/appium/java_client/proxy/Helpers.java b/src/main/java/io/appium/java_client/proxy/Helpers.java index 2261bc01c..7224d763d 100644 --- a/src/main/java/io/appium/java_client/proxy/Helpers.java +++ b/src/main/java/io/appium/java_client/proxy/Helpers.java @@ -16,10 +16,7 @@ package io.appium.java_client.proxy; -import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; -import java.util.Map; -import java.util.WeakHashMap; import lombok.Value; import net.bytebuddy.ByteBuddy; import net.bytebuddy.description.method.MethodDescription; @@ -34,7 +31,9 @@ import java.lang.reflect.Method; import java.util.Collection; import java.util.Collections; +import java.util.Map; import java.util.Set; +import java.util.WeakHashMap; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -51,18 +50,8 @@ public class Helpers { // the performance and to avoid extensive memory usage for our case, where // the amount of instrumented proxy classes we create is low in comparison to the amount // of proxy instances. - private static final Map> CACHED_PROXY_CLASSES = Collections.synchronizedMap(new WeakHashMap<>()); - - /** - * Gets CACHED_PROXY_CLASSES size. - * Used for cache clear up tests {@see io.appium.java_client.pagefactory_tests.widget.tests.combined.CombinedWidgetTest}. - * - * @return the cached proxy classes size - */ - @VisibleForTesting - public static int getCachedProxyClassesSize() { - return CACHED_PROXY_CLASSES.size(); - } + private static final Map> CACHED_PROXY_CLASSES = + Collections.synchronizedMap(new WeakHashMap<>()); private Helpers() { } From 1299d225594cda4f1d27f2d7a9f5bb7ef67c1eda Mon Sep 17 00:00:00 2001 From: Auto81 <48491431+Auto81@users.noreply.github.com> Date: Mon, 20 Jan 2025 16:06:50 +0000 Subject: [PATCH 09/11] Update CombinedWidgetTest.java --- .../tests/combined/CombinedWidgetTest.java | 52 ++++++++++++------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java index 1327623a9..25eac865f 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java @@ -6,15 +6,16 @@ import io.appium.java_client.pagefactory_tests.widget.tests.AbstractStubWebDriver; import io.appium.java_client.pagefactory_tests.widget.tests.DefaultStubWidget; import io.appium.java_client.pagefactory_tests.widget.tests.android.DefaultAndroidWidget; -import io.appium.java_client.proxy.Helpers; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.stream.Stream; import static java.util.stream.Collectors.toList; @@ -35,24 +36,24 @@ public class CombinedWidgetTest { */ public static Stream data() { return Stream.of( - Arguments.of(new AppWithCombinedWidgets(), - new AbstractStubWebDriver.StubAndroidDriver(), DefaultAndroidWidget.class), - Arguments.of(new AppWithCombinedWidgets(), - new AbstractStubWebDriver.StubIOSXCUITDriver(), DefaultIosXCUITWidget.class), - Arguments.of(new AppWithCombinedWidgets(), - new AbstractStubWebDriver.StubBrowserDriver(), DefaultFindByWidget.class), - Arguments.of(new AppWithCombinedWidgets(), - new AbstractStubWebDriver.StubAndroidBrowserOrWebViewDriver(), DefaultFindByWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubAndroidDriver(), DefaultAndroidWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubIOSXCUITDriver(), DefaultStubWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubWindowsDriver(), DefaultStubWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubBrowserDriver(), DefaultFindByWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubAndroidBrowserOrWebViewDriver(), DefaultFindByWidget.class) + Arguments.of(new AppWithCombinedWidgets(), + new AbstractStubWebDriver.StubAndroidDriver(), DefaultAndroidWidget.class), + Arguments.of(new AppWithCombinedWidgets(), + new AbstractStubWebDriver.StubIOSXCUITDriver(), DefaultIosXCUITWidget.class), + Arguments.of(new AppWithCombinedWidgets(), + new AbstractStubWebDriver.StubBrowserDriver(), DefaultFindByWidget.class), + Arguments.of(new AppWithCombinedWidgets(), + new AbstractStubWebDriver.StubAndroidBrowserOrWebViewDriver(), DefaultFindByWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubAndroidDriver(), DefaultAndroidWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubIOSXCUITDriver(), DefaultStubWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubWindowsDriver(), DefaultStubWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubBrowserDriver(), DefaultFindByWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubAndroidBrowserOrWebViewDriver(), DefaultFindByWidget.class) ); } @@ -178,8 +179,19 @@ private void assertProxyClassCacheGrowth() { int thresholdSize = 50; assertThat( "Proxy Class Cache threshold is " + thresholdSize, - Helpers.getCachedProxyClassesSize(), + getCachedProxyClassesSize(), lessThan(thresholdSize) ); } + + private int getCachedProxyClassesSize() { + try { + Field cpc = Class.forName("io.appium.java_client.proxy.Helpers").getDeclaredField("CACHED_PROXY_CLASSES"); + cpc.setAccessible(true); + Map cachedProxyClasses = (Map) cpc.get(null); + return cachedProxyClasses.size(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } } From 070d7c23bb6c01df016f68bd8476317f1b9fa974 Mon Sep 17 00:00:00 2001 From: Auto81 <48491431+Auto81@users.noreply.github.com> Date: Mon, 20 Jan 2025 16:10:17 +0000 Subject: [PATCH 10/11] Update CombinedWidgetTest.java --- .../tests/combined/CombinedWidgetTest.java | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java index 25eac865f..7243ceaa7 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java @@ -36,24 +36,24 @@ public class CombinedWidgetTest { */ public static Stream data() { return Stream.of( - Arguments.of(new AppWithCombinedWidgets(), - new AbstractStubWebDriver.StubAndroidDriver(), DefaultAndroidWidget.class), - Arguments.of(new AppWithCombinedWidgets(), - new AbstractStubWebDriver.StubIOSXCUITDriver(), DefaultIosXCUITWidget.class), - Arguments.of(new AppWithCombinedWidgets(), - new AbstractStubWebDriver.StubBrowserDriver(), DefaultFindByWidget.class), - Arguments.of(new AppWithCombinedWidgets(), - new AbstractStubWebDriver.StubAndroidBrowserOrWebViewDriver(), DefaultFindByWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubAndroidDriver(), DefaultAndroidWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubIOSXCUITDriver(), DefaultStubWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubWindowsDriver(), DefaultStubWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubBrowserDriver(), DefaultFindByWidget.class), - Arguments.of(new AppWithPartiallyCombinedWidgets(), - new AbstractStubWebDriver.StubAndroidBrowserOrWebViewDriver(), DefaultFindByWidget.class) + Arguments.of(new AppWithCombinedWidgets(), + new AbstractStubWebDriver.StubAndroidDriver(), DefaultAndroidWidget.class), + Arguments.of(new AppWithCombinedWidgets(), + new AbstractStubWebDriver.StubIOSXCUITDriver(), DefaultIosXCUITWidget.class), + Arguments.of(new AppWithCombinedWidgets(), + new AbstractStubWebDriver.StubBrowserDriver(), DefaultFindByWidget.class), + Arguments.of(new AppWithCombinedWidgets(), + new AbstractStubWebDriver.StubAndroidBrowserOrWebViewDriver(), DefaultFindByWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubAndroidDriver(), DefaultAndroidWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubIOSXCUITDriver(), DefaultStubWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubWindowsDriver(), DefaultStubWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubBrowserDriver(), DefaultFindByWidget.class), + Arguments.of(new AppWithPartiallyCombinedWidgets(), + new AbstractStubWebDriver.StubAndroidBrowserOrWebViewDriver(), DefaultFindByWidget.class) ); } From 189419bfd60c438fb76fa9d9a6ef3a825aaf6033 Mon Sep 17 00:00:00 2001 From: Auto81 <48491431+Auto81@users.noreply.github.com> Date: Mon, 20 Jan 2025 16:57:39 +0000 Subject: [PATCH 11/11] Update CombinedWidgetTest.java --- .../widget/tests/combined/CombinedWidgetTest.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java index 7243ceaa7..26e0d2f74 100644 --- a/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java +++ b/src/test/java/io/appium/java_client/pagefactory_tests/widget/tests/combined/CombinedWidgetTest.java @@ -29,6 +29,12 @@ @SuppressWarnings({"unchecked", "unused"}) public class CombinedWidgetTest { + /** + * Based on how many Proxy Classes are created during this test class, + * this number is used to determine if the cache is being purged correctly between tests. + */ + private static final int THRESHOLD_SIZE = 50; + /** * Test data generation. * @@ -176,11 +182,10 @@ public List getWidgets() { */ private void assertProxyClassCacheGrowth() { System.gc(); //Trying to force a collection for more accurate check numbers - int thresholdSize = 50; assertThat( - "Proxy Class Cache threshold is " + thresholdSize, + "Proxy Class Cache threshold is " + THRESHOLD_SIZE, getCachedProxyClassesSize(), - lessThan(thresholdSize) + lessThan(THRESHOLD_SIZE) ); } @@ -190,7 +195,7 @@ private int getCachedProxyClassesSize() { cpc.setAccessible(true); Map cachedProxyClasses = (Map) cpc.get(null); return cachedProxyClasses.size(); - } catch (Exception e) { + } catch (NoSuchFieldException | ClassNotFoundException | IllegalAccessException e) { throw new RuntimeException(e); } }