From 4d94f90f50f56c297cff7045bb6bb11f84465415 Mon Sep 17 00:00:00 2001 From: Sergey Knysh Date: Fri, 31 Jan 2020 12:30:31 +0300 Subject: [PATCH 1/4] #9 added ElementActionRetrier + tests added IUtilitiesModule --- .../core/application/AqualityModule.java | 23 +-- .../core/utilities/ElementActionRetrier.java | 54 ++++++ .../core/utilities/IElementActionRetrier.java | 36 ++++ .../core/utilities/IUtilitiesModule.java | 27 +++ .../utilities/CustomSettingsFileTests.java | 2 +- .../utilities/ElementActionRetrierTests.java | 158 ++++++++++++++++++ src/test/resources/TestSuite.xml | 1 + 7 files changed, 283 insertions(+), 18 deletions(-) create mode 100644 src/main/java/aquality/selenium/core/utilities/ElementActionRetrier.java create mode 100644 src/main/java/aquality/selenium/core/utilities/IElementActionRetrier.java create mode 100644 src/main/java/aquality/selenium/core/utilities/IUtilitiesModule.java create mode 100644 src/test/java/tests/utilities/ElementActionRetrierTests.java diff --git a/src/main/java/aquality/selenium/core/application/AqualityModule.java b/src/main/java/aquality/selenium/core/application/AqualityModule.java index 2e44633..80f07e6 100644 --- a/src/main/java/aquality/selenium/core/application/AqualityModule.java +++ b/src/main/java/aquality/selenium/core/application/AqualityModule.java @@ -1,9 +1,10 @@ package aquality.selenium.core.application; +import aquality.selenium.core.configurations.*; import aquality.selenium.core.logging.Logger; +import aquality.selenium.core.utilities.IElementActionRetrier; import aquality.selenium.core.utilities.ISettingsFile; -import aquality.selenium.core.utilities.JsonSettingsFile; -import aquality.selenium.core.configurations.*; +import aquality.selenium.core.utilities.IUtilitiesModule; import com.google.inject.AbstractModule; import com.google.inject.Provider; import com.google.inject.Singleton; @@ -11,7 +12,7 @@ /** * Describes all dependencies which is registered for the project. */ -public class AqualityModule extends AbstractModule { +public class AqualityModule extends AbstractModule implements IUtilitiesModule { private final Provider applicationProvider; @@ -25,24 +26,12 @@ public AqualityModule (Provider applicationProvider) { @Override protected void configure() { bind(IApplication.class).toProvider(applicationProvider); - bind(ISettingsFile.class).toInstance(getSettings()); + bind(ISettingsFile.class).toInstance(getSettingsFileImplementation()); bind(Logger.class).toInstance(Logger.getInstance()); bind(ILoggerConfiguration.class).to(LoggerConfiguration.class).in(Singleton.class); bind(ITimeoutConfiguration.class).to(TimeoutConfiguration.class).in(Singleton.class); bind(IRetryConfiguration.class).to(RetryConfiguration.class).in(Singleton.class); bind(IElementCacheConfiguration.class).to(ElementCacheConfiguration.class).in(Singleton.class); - } - - /** - * Provides default {@link ISettingsFile}. with settings. - * Default value is settings.json. - * You are able to override this path, by setting environment variable 'profile'. - * In this case, settings file will be settings.{profile}.json. - * - * @return An instance of settings. - */ - protected ISettingsFile getSettings() { - String settingsProfile = System.getProperty("profile") == null ? "settings.json" : "settings." + System.getProperty("profile") + ".json"; - return new JsonSettingsFile(settingsProfile); + bind(IElementActionRetrier.class).to(getElementActionRetrierImplementation()).in(Singleton.class); } } diff --git a/src/main/java/aquality/selenium/core/utilities/ElementActionRetrier.java b/src/main/java/aquality/selenium/core/utilities/ElementActionRetrier.java new file mode 100644 index 0000000..51d4b7d --- /dev/null +++ b/src/main/java/aquality/selenium/core/utilities/ElementActionRetrier.java @@ -0,0 +1,54 @@ +package aquality.selenium.core.utilities; + +import aquality.selenium.core.configurations.IRetryConfiguration; +import com.google.inject.Inject; + +import java.util.Optional; +import java.util.function.Supplier; + +public class ElementActionRetrier implements IElementActionRetrier { + + private IRetryConfiguration retryConfiguration; + + @Inject + public ElementActionRetrier(IRetryConfiguration retryConfiguration) { + this.retryConfiguration = retryConfiguration; + } + + @Override + public void doWithRetry(Runnable runnable) { + Supplier supplier = () -> { + runnable.run(); + return true; + }; + doWithRetry(supplier); + } + + @Override + public T doWithRetry(Supplier function) { + int retryAttemptsLeft = retryConfiguration.getNumber(); + Optional result = Optional.empty(); + while (retryAttemptsLeft >= 0) { + try { + result = Optional.of(function.get()); + break; + } catch (Exception exception) { + if (isExceptionHandled(exception) && retryAttemptsLeft != 0) { + try { + Thread.sleep(retryConfiguration.getPollingInterval()); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + retryAttemptsLeft--; + } else { + throw exception; + } + } + } + return result.orElse(null); + } + + private boolean isExceptionHandled(Exception exception) { + return getHandledExceptions().contains(exception.getClass()); + } +} diff --git a/src/main/java/aquality/selenium/core/utilities/IElementActionRetrier.java b/src/main/java/aquality/selenium/core/utilities/IElementActionRetrier.java new file mode 100644 index 0000000..c747230 --- /dev/null +++ b/src/main/java/aquality/selenium/core/utilities/IElementActionRetrier.java @@ -0,0 +1,36 @@ +package aquality.selenium.core.utilities; + +import org.openqa.selenium.InvalidElementStateException; +import org.openqa.selenium.StaleElementReferenceException; + +import java.util.Arrays; +import java.util.List; +import java.util.function.Supplier; + +/** + * Retries an action or function when {@link #getHandledExceptions()} occurs. + */ +public interface IElementActionRetrier { + + /** + * Retries the action when the handled exception {@link #getHandledExceptions()} occurs. + * @param runnable Action to be applied. + */ + void doWithRetry(Runnable runnable); + + /** + * Retries the function when the handled exception {@link #getHandledExceptions()} occurs. + * @param function Function to be applied. + * @param Return type of function. + * @return Result of the function. + */ + T doWithRetry(Supplier function); + + /** + * Exceptions to be ignored during action retrying. + * @return By the default implementation, {@link StaleElementReferenceException} and {@link InvalidElementStateException} are handled. + */ + default List> getHandledExceptions() { + return Arrays.asList(StaleElementReferenceException.class, InvalidElementStateException.class); + } +} diff --git a/src/main/java/aquality/selenium/core/utilities/IUtilitiesModule.java b/src/main/java/aquality/selenium/core/utilities/IUtilitiesModule.java new file mode 100644 index 0000000..b7e2b34 --- /dev/null +++ b/src/main/java/aquality/selenium/core/utilities/IUtilitiesModule.java @@ -0,0 +1,27 @@ +package aquality.selenium.core.utilities; + +/** + * Provides implementations for utilities module. + */ +public interface IUtilitiesModule { + + /** + * @return implementation of {@link IElementActionRetrier}. + */ + default Class getElementActionRetrierImplementation() { + return ElementActionRetrier.class; + } + + /** + * Provides default {@link ISettingsFile} with settings. + * Default value is settings.json. + * You are able to override this path, by setting environment variable 'profile'. + * In this case, settings file will be settings.{profile}.json. + * + * @return An instance of settings. + */ + default ISettingsFile getSettingsFileImplementation() { + String settingsProfile = System.getProperty("profile") == null ? "settings.json" : "settings." + System.getProperty("profile") + ".json"; + return new JsonSettingsFile(settingsProfile); + } +} diff --git a/src/test/java/tests/utilities/CustomSettingsFileTests.java b/src/test/java/tests/utilities/CustomSettingsFileTests.java index 69b0c23..e846d10 100644 --- a/src/test/java/tests/utilities/CustomSettingsFileTests.java +++ b/src/test/java/tests/utilities/CustomSettingsFileTests.java @@ -34,7 +34,7 @@ private class CustomModule extends AqualityModule { } @Override - protected ISettingsFile getSettings() { + public ISettingsFile getSettingsFileImplementation() { return new CustomSettingsFile(); } } diff --git a/src/test/java/tests/utilities/ElementActionRetrierTests.java b/src/test/java/tests/utilities/ElementActionRetrierTests.java new file mode 100644 index 0000000..ab374a5 --- /dev/null +++ b/src/test/java/tests/utilities/ElementActionRetrierTests.java @@ -0,0 +1,158 @@ +package tests.utilities; + +import aquality.selenium.core.configurations.IRetryConfiguration; +import aquality.selenium.core.logging.Logger; +import aquality.selenium.core.utilities.ElementActionRetrier; +import org.openqa.selenium.InvalidArgumentException; +import org.openqa.selenium.InvalidElementStateException; +import org.openqa.selenium.StaleElementReferenceException; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import tests.application.browser.AqualityServices; + +import java.util.Date; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +public class ElementActionRetrierTests { + + private static final IRetryConfiguration RETRY_CONFIGURATION = AqualityServices.getServiceProvider().getInstance(IRetryConfiguration.class); + private static final Logger LOGGER = AqualityServices.getServiceProvider().getInstance(Logger.class); + private static final int RETRIES_COUNT = RETRY_CONFIGURATION.getNumber(); + private static final long POLLING_INTERVAL = RETRY_CONFIGURATION.getPollingInterval(); + private static final ElementActionRetrier ELEMENT_ACTION_RETRIER = new ElementActionRetrier(RETRY_CONFIGURATION); + + @DataProvider + private Object[][] handledExceptions() { + return new Object[][]{ + {new StaleElementReferenceException("")}, + {new InvalidElementStateException("")} + }; + } + + @Test + public void testRetrierShouldWorkOnceIfMethodSucceeded() { + checkRetrierShouldWorkOnceIfMethodSucceeded(() -> ELEMENT_ACTION_RETRIER.doWithRetry(() -> LOGGER.info(""))); + } + + @Test + public void testRetrierShouldWorkOnceIfMethodSucceededWithReturnValue() { + checkRetrierShouldWorkOnceIfMethodSucceeded(() -> ELEMENT_ACTION_RETRIER.doWithRetry(() -> true)); + } + + private void checkRetrierShouldWorkOnceIfMethodSucceeded(Runnable retryFunction) { + Date startTime = new Date(); + retryFunction.run(); + long duration = new Date().getTime() - startTime.getTime(); + assertTrue(duration < POLLING_INTERVAL, + String.format("Duration '%s' should be less that pollingInterval '%s'", duration, POLLING_INTERVAL)); + } + + @Test(dataProvider = "handledExceptions") + public void testRetrierShouldWaitPollingTimeBetweenMethodsCall(RuntimeException handledException) { + AtomicBoolean isThrowException = new AtomicBoolean(true); + checkRetrierShouldWaitPollingTimeBetweenMethodsCall(() -> + ELEMENT_ACTION_RETRIER.doWithRetry(() -> { + if (isThrowException.get()) { + isThrowException.set(false); + throw handledException; + } + })); + } + + @Test(dataProvider = "handledExceptions") + public void testRetrierShouldWaitPollingTimeBetweenMethodsCallWithReturnValue(RuntimeException handledException) { + AtomicBoolean isThrowException = new AtomicBoolean(true); + checkRetrierShouldWaitPollingTimeBetweenMethodsCall(() -> + ELEMENT_ACTION_RETRIER.doWithRetry(() -> { + if (isThrowException.get()) { + isThrowException.set(false); + throw handledException; + } + + return new Object(); + })); + } + + private void checkRetrierShouldWaitPollingTimeBetweenMethodsCall(Runnable retryFunction) { + Date startTime = new Date(); + retryFunction.run(); + long duration = new Date().getTime() - startTime.getTime(); + assertTrue(duration >= POLLING_INTERVAL, String.format("duration '%s' should be more than polling interval '%s'", duration, POLLING_INTERVAL)); + assertTrue(duration <= 2 * POLLING_INTERVAL, String.format("duration '%s' less than doubled polling interval '%s'", duration, POLLING_INTERVAL)); + } + + @Test(expectedExceptions = InvalidArgumentException.class) + public void testRetrierShouldThrowUnhandledException() { + ELEMENT_ACTION_RETRIER.doWithRetry(() -> { + throwInvalidArgumentException(); + return new Object(); + }); + } + + @Test(expectedExceptions = InvalidArgumentException.class) + public void testRetrierShouldThrowUnhandledException1() { + ELEMENT_ACTION_RETRIER.doWithRetry(this::throwInvalidArgumentException); + } + + private void throwInvalidArgumentException() { + throw new InvalidArgumentException(""); + } + + @Test(dataProvider = "handledExceptions") + public void testRetrierShouldWorkCorrectTimes(RuntimeException handledException) { + AtomicInteger actualAttempts = new AtomicInteger(0); + checkRetrierShouldWorkCorrectTimes(handledException, actualAttempts, () -> + ELEMENT_ACTION_RETRIER.doWithRetry(() -> { + LOGGER.info("current attempt is " + actualAttempts.incrementAndGet()); + throwHandledArgumentException(handledException); + })); + } + + private void throwHandledArgumentException(RuntimeException handledException) { + throw handledException; + } + + @Test(dataProvider = "handledExceptions") + public void testRetrierShouldWorkCorrectTimesWithReturnValue(RuntimeException handledException) { + AtomicInteger actualAttempts = new AtomicInteger(0); + checkRetrierShouldWorkCorrectTimes(handledException, actualAttempts, () -> + ELEMENT_ACTION_RETRIER.doWithRetry(() -> { + LOGGER.info("current attempt is " + actualAttempts.incrementAndGet()); + throw handledException; + })); + } + + private void checkRetrierShouldWorkCorrectTimes(RuntimeException handledException, AtomicInteger actualAttempts, Runnable retryFunction) { + try { + retryFunction.run(); + } catch (RuntimeException e) { + assertTrue(handledException.getClass().isInstance(e)); + } + assertEquals(actualAttempts.get(), RETRIES_COUNT + 1, "actual attempts count is not match to expected"); + } + + @Test + public void testRetrierShouldReturnValue() { + Object obj = new Object(); + assertEquals(ELEMENT_ACTION_RETRIER.doWithRetry(() -> obj), obj, "Retrier should return value"); + } + + @Test(dataProvider = "handledExceptions", timeOut = 10000) + public void testRetrierShouldNotThrowExceptionOnInterruption(RuntimeException handledException) throws InterruptedException { + AtomicBoolean isRetrierPaused = new AtomicBoolean(false); + Thread thread = new Thread(() -> ELEMENT_ACTION_RETRIER.doWithRetry(() -> { + isRetrierPaused.set(true); + throw handledException; + })); + thread.start(); + while (!isRetrierPaused.get()) { + Thread.sleep(POLLING_INTERVAL / 10); + } + Thread.sleep(POLLING_INTERVAL / 3); + thread.interrupt(); + } +} diff --git a/src/test/resources/TestSuite.xml b/src/test/resources/TestSuite.xml index d464978..e263280 100644 --- a/src/test/resources/TestSuite.xml +++ b/src/test/resources/TestSuite.xml @@ -10,6 +10,7 @@ + From 210b79dddf4d47cd114907961d1449cc74301b06 Mon Sep 17 00:00:00 2001 From: Sergey Knysh Date: Fri, 31 Jan 2020 13:12:21 +0300 Subject: [PATCH 2/4] #9 removed using of DI in tests combined configuration tests in one class --- .../configurations/ConfigurationTests.java | 41 +++++++++++++++++++ .../ElementCacheConfigurationTests.java | 16 -------- .../configurations/EnvConfigurationTests.java | 18 ++++---- .../LoggerConfigurationTests.java | 16 -------- .../ProfileConfigurationTests.java | 5 ++- .../RetryConfigurationTests.java | 18 -------- .../TimeoutConfigurationTests.java | 19 --------- src/test/java/tests/logger/LoggerTests.java | 2 +- src/test/resources/TestSuite.xml | 5 +-- 9 files changed, 55 insertions(+), 85 deletions(-) create mode 100644 src/test/java/tests/configurations/ConfigurationTests.java delete mode 100644 src/test/java/tests/configurations/ElementCacheConfigurationTests.java delete mode 100644 src/test/java/tests/configurations/LoggerConfigurationTests.java delete mode 100644 src/test/java/tests/configurations/RetryConfigurationTests.java delete mode 100644 src/test/java/tests/configurations/TimeoutConfigurationTests.java diff --git a/src/test/java/tests/configurations/ConfigurationTests.java b/src/test/java/tests/configurations/ConfigurationTests.java new file mode 100644 index 0000000..a259ced --- /dev/null +++ b/src/test/java/tests/configurations/ConfigurationTests.java @@ -0,0 +1,41 @@ +package tests.configurations; + +import aquality.selenium.core.configurations.*; +import aquality.selenium.core.utilities.ISettingsFile; +import org.testng.annotations.Test; +import tests.application.CustomAqualityServices; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; + +public class ConfigurationTests { + private static final ISettingsFile settingsFile = CustomAqualityServices.getServiceProvider().getInstance(ISettingsFile.class); + + @Test + public void testShouldBePossibleCheckIsEnableElementCache() { + boolean isEnable = new ElementCacheConfiguration(settingsFile).isEnabled(); + assertFalse(isEnable, "Element cache is disabled by default"); + } + + @Test + public void testShouldBePossibleToGetLanguage() { + String language = new LoggerConfiguration(settingsFile).getLanguage(); + assertEquals(language, "en", "Current language should be got from logger configuration"); + } + + @Test + public void testShouldBePossibleToGetRetryConfiguration() { + RetryConfiguration retryConfiguration = new RetryConfiguration(settingsFile); + assertEquals(retryConfiguration.getNumber(), 2, "Number of retry attempts timeout should be got"); + assertEquals(retryConfiguration.getPollingInterval(), 300, "Polling interval of retrier should be got"); + } + + @Test + public void testShouldBePossibleToGetTimeoutConfiguration() { + TimeoutConfiguration timeoutConfiguration = new TimeoutConfiguration(settingsFile); + assertEquals(timeoutConfiguration.getCommand(), 60, "Command timeout should be got"); + assertEquals(timeoutConfiguration.getCondition(), 30, "Condition timeout should be got"); + assertEquals(timeoutConfiguration.getImplicit(), 0, "Implicit timeout should be got"); + assertEquals(timeoutConfiguration.getPollingInterval(), 300, "Polling interval should be got"); + } +} diff --git a/src/test/java/tests/configurations/ElementCacheConfigurationTests.java b/src/test/java/tests/configurations/ElementCacheConfigurationTests.java deleted file mode 100644 index f5735bd..0000000 --- a/src/test/java/tests/configurations/ElementCacheConfigurationTests.java +++ /dev/null @@ -1,16 +0,0 @@ -package tests.configurations; - -import aquality.selenium.core.configurations.IElementCacheConfiguration; -import org.testng.annotations.Test; -import tests.application.CustomAqualityServices; - -import static org.testng.Assert.assertFalse; - -public class ElementCacheConfigurationTests { - - @Test - public void testShouldBePossibleCheckIsEnableElementCache() { - boolean isEnable = CustomAqualityServices.getServiceProvider().getInstance(IElementCacheConfiguration.class).isEnabled(); - assertFalse(isEnable, "Element cache is disabled by default"); - } -} diff --git a/src/test/java/tests/configurations/EnvConfigurationTests.java b/src/test/java/tests/configurations/EnvConfigurationTests.java index 5f3d9e8..1fadfdb 100644 --- a/src/test/java/tests/configurations/EnvConfigurationTests.java +++ b/src/test/java/tests/configurations/EnvConfigurationTests.java @@ -1,10 +1,8 @@ package tests.configurations; import aquality.selenium.core.application.AqualityModule; -import aquality.selenium.core.configurations.IElementCacheConfiguration; -import aquality.selenium.core.configurations.ILoggerConfiguration; -import aquality.selenium.core.configurations.IRetryConfiguration; -import aquality.selenium.core.configurations.ITimeoutConfiguration; +import aquality.selenium.core.configurations.*; +import aquality.selenium.core.utilities.ISettingsFile; import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; @@ -25,6 +23,7 @@ public class EnvConfigurationTests extends BaseProfileTest { private static final String CONDITION_TIMEOUT_KEY = "timeouts.timeoutCondition"; private static final String NEW_INT_VALUE = "10000"; private static final String RETRY_NUMBER_KEY = "retry.number"; + private ISettingsFile settingsFile; @BeforeMethod public void before() { @@ -33,29 +32,30 @@ public void before() { System.setProperty(RETRY_NUMBER_KEY, NEW_INT_VALUE); System.setProperty(ELEMENT_CACHE, NEW_BOOL_VALUE); CustomAqualityServices.initInjector(new TestModule(CustomAqualityServices::getApplication)); + settingsFile = CustomAqualityServices.getServiceProvider().getInstance(ISettingsFile.class); } @Test public void testShouldBePossibleToOverrideLanguageWithEnvVariable() { - String language = CustomAqualityServices.getServiceProvider().getInstance(ILoggerConfiguration.class).getLanguage(); + String language = new LoggerConfiguration(settingsFile).getLanguage(); assertEquals(language, "ru", "Current language should be overridden with env variable"); } @Test public void testShouldBePossibleToOverrideTimeoutWithEnvVariable() { - long conditionTimeout = CustomAqualityServices.getServiceProvider().getInstance(ITimeoutConfiguration.class).getCondition(); + long conditionTimeout = new TimeoutConfiguration(settingsFile).getCondition(); assertEquals(conditionTimeout, Long.parseLong(NEW_INT_VALUE), "Condition timeout should be overridden with env variable"); } @Test public void testShouldBePossibleToOverrideRetryConfigurationWithEnvVariable() { - int retryNumber = CustomAqualityServices.getServiceProvider().getInstance(IRetryConfiguration.class).getNumber(); + int retryNumber = new RetryConfiguration(settingsFile).getNumber(); assertEquals(retryNumber, Long.parseLong(NEW_INT_VALUE), "Number of retry attempts should be overridden with env variable"); } @Test public void testShouldBePossibleToOverrideElementCacheStateWithEnvVariable() { - boolean isEnabled = CustomAqualityServices.getServiceProvider().getInstance(IElementCacheConfiguration.class).isEnabled(); + boolean isEnabled = new ElementCacheConfiguration(settingsFile).isEnabled(); assertTrue(isEnabled, "Element cache state should be overridden with env variable"); } @@ -76,7 +76,7 @@ public void testShouldGetDefaultLanguageIfConfigurationIsAbsent() { System.setProperty(PROFILE_KEY, "empty"); System.clearProperty(LANGUAGE_KEY); CustomAqualityServices.initInjector(new TestModule(CustomAqualityServices::getApplication)); - String language = CustomAqualityServices.getServiceProvider().getInstance(ILoggerConfiguration.class).getLanguage(); + String language = new LoggerConfiguration(settingsFile).getLanguage(); assertEquals(language, DEFAULT_LANGUAGE, "Current language should be got from logger configuration"); } diff --git a/src/test/java/tests/configurations/LoggerConfigurationTests.java b/src/test/java/tests/configurations/LoggerConfigurationTests.java deleted file mode 100644 index de673d2..0000000 --- a/src/test/java/tests/configurations/LoggerConfigurationTests.java +++ /dev/null @@ -1,16 +0,0 @@ -package tests.configurations; - -import aquality.selenium.core.configurations.ILoggerConfiguration; -import org.testng.annotations.Test; -import tests.application.CustomAqualityServices; - -import static org.testng.Assert.assertEquals; - -public class LoggerConfigurationTests { - - @Test - public void testShouldBePossibleToGetLanguage() { - String language = CustomAqualityServices.getServiceProvider().getInstance(ILoggerConfiguration.class).getLanguage(); - assertEquals(language, "en", "Current language should be got from logger configuration"); - } -} diff --git a/src/test/java/tests/configurations/ProfileConfigurationTests.java b/src/test/java/tests/configurations/ProfileConfigurationTests.java index 4819c0c..44122d3 100644 --- a/src/test/java/tests/configurations/ProfileConfigurationTests.java +++ b/src/test/java/tests/configurations/ProfileConfigurationTests.java @@ -1,7 +1,8 @@ package tests.configurations; import aquality.selenium.core.application.AqualityModule; -import aquality.selenium.core.configurations.ILoggerConfiguration; +import aquality.selenium.core.configurations.LoggerConfiguration; +import aquality.selenium.core.utilities.ISettingsFile; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import tests.application.CustomAqualityServices; @@ -20,7 +21,7 @@ public void before() { @Test public void testShouldBePossibleToGetLanguageFromNewSettingsFile() { - String language = CustomAqualityServices.getServiceProvider().getInstance(ILoggerConfiguration.class).getLanguage(); + String language = new LoggerConfiguration(CustomAqualityServices.getServiceProvider().getInstance(ISettingsFile.class)).getLanguage(); assertEquals(language, "ru", String.format("Current language should be got from %s profile", PROFILE)); } } diff --git a/src/test/java/tests/configurations/RetryConfigurationTests.java b/src/test/java/tests/configurations/RetryConfigurationTests.java deleted file mode 100644 index 4e05212..0000000 --- a/src/test/java/tests/configurations/RetryConfigurationTests.java +++ /dev/null @@ -1,18 +0,0 @@ -package tests.configurations; - -import aquality.selenium.core.configurations.IRetryConfiguration; -import aquality.selenium.core.configurations.ITimeoutConfiguration; -import org.testng.annotations.Test; -import tests.application.CustomAqualityServices; - -import static org.testng.Assert.assertEquals; - -public class RetryConfigurationTests { - - @Test - public void testShouldBePossibleToGetRetryConfiguration() { - IRetryConfiguration retryConfiguration = CustomAqualityServices.getServiceProvider().getInstance(IRetryConfiguration.class); - assertEquals(retryConfiguration.getNumber(), 2, "Number of retry attempts timeout should be got"); - assertEquals(retryConfiguration.getPollingInterval(), 300, "Polling interval of retrier should be got"); - } -} diff --git a/src/test/java/tests/configurations/TimeoutConfigurationTests.java b/src/test/java/tests/configurations/TimeoutConfigurationTests.java deleted file mode 100644 index 9b2f84a..0000000 --- a/src/test/java/tests/configurations/TimeoutConfigurationTests.java +++ /dev/null @@ -1,19 +0,0 @@ -package tests.configurations; - -import aquality.selenium.core.configurations.ITimeoutConfiguration; -import org.testng.annotations.Test; -import tests.application.CustomAqualityServices; - -import static org.testng.Assert.assertEquals; - -public class TimeoutConfigurationTests { - - @Test - public void testShouldBePossibleToGetTimeoutConfiguration() { - ITimeoutConfiguration timeoutConfiguration = CustomAqualityServices.getServiceProvider().getInstance(ITimeoutConfiguration.class); - assertEquals(timeoutConfiguration.getCommand(), 60, "Command timeout should be got"); - assertEquals(timeoutConfiguration.getCondition(), 30, "Condition timeout should be got"); - assertEquals(timeoutConfiguration.getImplicit(), 0, "Implicit timeout should be got"); - assertEquals(timeoutConfiguration.getPollingInterval(), 300, "Polling interval should be got"); - } -} diff --git a/src/test/java/tests/logger/LoggerTests.java b/src/test/java/tests/logger/LoggerTests.java index adc3ca1..55a4260 100644 --- a/src/test/java/tests/logger/LoggerTests.java +++ b/src/test/java/tests/logger/LoggerTests.java @@ -22,7 +22,7 @@ public class LoggerTests { private static final String TEST_MESSAGE = "test message"; private static final String TEST_EXCEPTION_TEXT = "test exception"; private static final String LOG_4_J_FIELD_NAME = "log4J"; - private Logger logger = CustomAqualityServices.getServiceProvider().getInstance(Logger.class); + private Logger logger = Logger.getInstance(); private org.apache.log4j.Logger log4j; private Appender appender; private File appenderFile; diff --git a/src/test/resources/TestSuite.xml b/src/test/resources/TestSuite.xml index e263280..db0a10c 100644 --- a/src/test/resources/TestSuite.xml +++ b/src/test/resources/TestSuite.xml @@ -6,10 +6,7 @@ - - - - + From 6d99d94c9d76fdf47663c6b7db1053a8b66ffc47 Mon Sep 17 00:00:00 2001 From: Sergey Knysh Date: Mon, 3 Feb 2020 15:05:04 +0300 Subject: [PATCH 3/4] #9 fixed comments --- .../aquality/selenium/core/application/AqualityModule.java | 2 +- .../selenium/core/utilities/ElementActionRetrier.java | 2 +- .../aquality/selenium/core/utilities/IUtilitiesModule.java | 2 +- src/test/java/tests/utilities/CustomSettingsFileTests.java | 2 +- .../java/tests/utilities/ElementActionRetrierTests.java | 6 +----- 5 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/aquality/selenium/core/application/AqualityModule.java b/src/main/java/aquality/selenium/core/application/AqualityModule.java index 80f07e6..dcc5d86 100644 --- a/src/main/java/aquality/selenium/core/application/AqualityModule.java +++ b/src/main/java/aquality/selenium/core/application/AqualityModule.java @@ -26,7 +26,7 @@ public AqualityModule (Provider applicationProvider) { @Override protected void configure() { bind(IApplication.class).toProvider(applicationProvider); - bind(ISettingsFile.class).toInstance(getSettingsFileImplementation()); + bind(ISettingsFile.class).toInstance(getInstanceOfSettingsFile()); bind(Logger.class).toInstance(Logger.getInstance()); bind(ILoggerConfiguration.class).to(LoggerConfiguration.class).in(Singleton.class); bind(ITimeoutConfiguration.class).to(TimeoutConfiguration.class).in(Singleton.class); diff --git a/src/main/java/aquality/selenium/core/utilities/ElementActionRetrier.java b/src/main/java/aquality/selenium/core/utilities/ElementActionRetrier.java index 51d4b7d..f8ac474 100644 --- a/src/main/java/aquality/selenium/core/utilities/ElementActionRetrier.java +++ b/src/main/java/aquality/selenium/core/utilities/ElementActionRetrier.java @@ -48,7 +48,7 @@ public T doWithRetry(Supplier function) { return result.orElse(null); } - private boolean isExceptionHandled(Exception exception) { + protected boolean isExceptionHandled(Exception exception) { return getHandledExceptions().contains(exception.getClass()); } } diff --git a/src/main/java/aquality/selenium/core/utilities/IUtilitiesModule.java b/src/main/java/aquality/selenium/core/utilities/IUtilitiesModule.java index b7e2b34..80687c8 100644 --- a/src/main/java/aquality/selenium/core/utilities/IUtilitiesModule.java +++ b/src/main/java/aquality/selenium/core/utilities/IUtilitiesModule.java @@ -20,7 +20,7 @@ default Class getElementActionRetrierImplementa * * @return An instance of settings. */ - default ISettingsFile getSettingsFileImplementation() { + default ISettingsFile getInstanceOfSettingsFile() { String settingsProfile = System.getProperty("profile") == null ? "settings.json" : "settings." + System.getProperty("profile") + ".json"; return new JsonSettingsFile(settingsProfile); } diff --git a/src/test/java/tests/utilities/CustomSettingsFileTests.java b/src/test/java/tests/utilities/CustomSettingsFileTests.java index e846d10..943100a 100644 --- a/src/test/java/tests/utilities/CustomSettingsFileTests.java +++ b/src/test/java/tests/utilities/CustomSettingsFileTests.java @@ -34,7 +34,7 @@ private class CustomModule extends AqualityModule { } @Override - public ISettingsFile getSettingsFileImplementation() { + public ISettingsFile getInstanceOfSettingsFile() { return new CustomSettingsFile(); } } diff --git a/src/test/java/tests/utilities/ElementActionRetrierTests.java b/src/test/java/tests/utilities/ElementActionRetrierTests.java index ab374a5..8ee0010 100644 --- a/src/test/java/tests/utilities/ElementActionRetrierTests.java +++ b/src/test/java/tests/utilities/ElementActionRetrierTests.java @@ -108,14 +108,10 @@ public void testRetrierShouldWorkCorrectTimes(RuntimeException handledException) checkRetrierShouldWorkCorrectTimes(handledException, actualAttempts, () -> ELEMENT_ACTION_RETRIER.doWithRetry(() -> { LOGGER.info("current attempt is " + actualAttempts.incrementAndGet()); - throwHandledArgumentException(handledException); + throw handledException; })); } - private void throwHandledArgumentException(RuntimeException handledException) { - throw handledException; - } - @Test(dataProvider = "handledExceptions") public void testRetrierShouldWorkCorrectTimesWithReturnValue(RuntimeException handledException) { AtomicInteger actualAttempts = new AtomicInteger(0); From d0e6b09b1823506c35161efff59e5523d592938e Mon Sep 17 00:00:00 2001 From: Sergey Knysh Date: Mon, 3 Feb 2020 15:09:44 +0300 Subject: [PATCH 4/4] merge with master --- .../core/application/AqualityModule.java | 18 ++---------------- src/test/resources/TestSuite.xml | 5 +---- 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/src/main/java/aquality/selenium/core/application/AqualityModule.java b/src/main/java/aquality/selenium/core/application/AqualityModule.java index e05b00d..c2f67d8 100644 --- a/src/main/java/aquality/selenium/core/application/AqualityModule.java +++ b/src/main/java/aquality/selenium/core/application/AqualityModule.java @@ -14,8 +14,7 @@ * Describes all dependencies which is registered for the project. */ public class AqualityModule extends AbstractModule - implements ILocalizationModule { -public class AqualityModule extends AbstractModule implements IUtilitiesModule { + implements ILocalizationModule, IUtilitiesModule { private final Provider applicationProvider; @@ -35,21 +34,8 @@ protected void configure() { bind(ITimeoutConfiguration.class).to(TimeoutConfiguration.class).in(Singleton.class); bind(IRetryConfiguration.class).to(RetryConfiguration.class).in(Singleton.class); bind(IElementCacheConfiguration.class).to(ElementCacheConfiguration.class).in(Singleton.class); + bind(IElementActionRetrier.class).to(getElementActionRetrierImplementation()).in(Singleton.class); bind(ILocalizationManager.class).to(getLocalizationManagerImplementation()).in(Singleton.class); bind(ILocalizedLogger.class).to(getLocalizedLoggerImplementation()).in(Singleton.class); } - - /** - * Provides default {@link ISettingsFile}. with settings. - * Default value is settings.json. - * You are able to override this path, by setting environment variable 'profile'. - * In this case, settings file will be settings.{profile}.json. - * - * @return An instance of settings. - */ - protected ISettingsFile getSettings() { - String settingsProfile = System.getProperty("profile") == null ? "settings.json" : "settings." + System.getProperty("profile") + ".json"; - return new JsonSettingsFile(settingsProfile); - bind(IElementActionRetrier.class).to(getElementActionRetrierImplementation()).in(Singleton.class); - } } diff --git a/src/test/resources/TestSuite.xml b/src/test/resources/TestSuite.xml index a1d5b29..6a2875a 100644 --- a/src/test/resources/TestSuite.xml +++ b/src/test/resources/TestSuite.xml @@ -6,10 +6,7 @@ - - - - +