Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package aquality.selenium.core.application;

import aquality.selenium.core.configurations.*;
import aquality.selenium.core.localization.*;
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;
Expand All @@ -13,7 +14,7 @@
* Describes all dependencies which is registered for the project.
*/
public class AqualityModule<T extends IApplication> extends AbstractModule
implements ILocalizationModule {
implements ILocalizationModule, IUtilitiesModule {

private final Provider<T> applicationProvider;

Expand All @@ -27,26 +28,14 @@ public AqualityModule (Provider<T> applicationProvider) {
@Override
protected void configure() {
bind(IApplication.class).toProvider(applicationProvider);
bind(ISettingsFile.class).toInstance(getSettings());
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);
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);
}
}
Original file line number Diff line number Diff line change
@@ -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> T doWithRetry(Supplier<T> function) {
int retryAttemptsLeft = retryConfiguration.getNumber();
Optional<T> 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);
}

protected boolean isExceptionHandled(Exception exception) {
return getHandledExceptions().contains(exception.getClass());
}
}
Original file line number Diff line number Diff line change
@@ -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 <T> Return type of function.
* @return Result of the function.
*/
<T> T doWithRetry(Supplier<T> function);

/**
* Exceptions to be ignored during action retrying.
* @return By the default implementation, {@link StaleElementReferenceException} and {@link InvalidElementStateException} are handled.
*/
default List<Class<? extends Exception>> getHandledExceptions() {
return Arrays.asList(StaleElementReferenceException.class, InvalidElementStateException.class);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package aquality.selenium.core.utilities;

/**
* Provides implementations for utilities module.
*/
public interface IUtilitiesModule {

/**
* @return implementation of {@link IElementActionRetrier}.
*/
default Class<? extends IElementActionRetrier> 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 getInstanceOfSettingsFile() {
String settingsProfile = System.getProperty("profile") == null ? "settings.json" : "settings." + System.getProperty("profile") + ".json";
return new JsonSettingsFile(settingsProfile);
}
}
41 changes: 41 additions & 0 deletions src/test/java/tests/configurations/ConfigurationTests.java
Original file line number Diff line number Diff line change
@@ -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");
}
}

This file was deleted.

18 changes: 9 additions & 9 deletions src/test/java/tests/configurations/EnvConfigurationTests.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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() {
Expand All @@ -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");
}

Expand All @@ -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");
}

Expand Down
16 changes: 0 additions & 16 deletions src/test/java/tests/configurations/LoggerConfigurationTests.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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));
}
}
18 changes: 0 additions & 18 deletions src/test/java/tests/configurations/RetryConfigurationTests.java

This file was deleted.

19 changes: 0 additions & 19 deletions src/test/java/tests/configurations/TimeoutConfigurationTests.java

This file was deleted.

2 changes: 1 addition & 1 deletion src/test/java/tests/logger/LoggerTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/test/java/tests/utilities/CustomSettingsFileTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ private class CustomModule extends AqualityModule<ChromeApplication> {
}

@Override
protected ISettingsFile getSettings() {
public ISettingsFile getInstanceOfSettingsFile() {
return new CustomSettingsFile();
}
}
Expand Down
Loading