Skip to content

Commit 9403835

Browse files
committed
fix sample tests for Windows, fix global setup.
rename ApplicationPlatform to PlatformName for consistency
1 parent f12a4c2 commit 9403835

28 files changed

+843
-79
lines changed

src/main/java/aquality/appium/application/Application.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import aquality.appium.configuration.ITimeoutConfiguration;
55
import aquality.appium.logger.Logger;
66
import io.appium.java_client.AppiumDriver;
7+
import org.openqa.selenium.remote.service.DriverService;
78

89
public class Application {
910

@@ -12,8 +13,10 @@ public class Application {
1213
private final ITimeoutConfiguration timeouts;
1314
private Long timeoutImpl;
1415
private final AppiumDriver appiumDriver;
16+
private final DriverService driverService;
1517

1618
public Application(AppiumDriver appiumDriver, IConfiguration configuration) {
19+
this.driverService = null;
1720
this.appiumDriver = appiumDriver;
1821
this.configuration = configuration;
1922
this.timeouts = configuration.getTimeoutConfiguration();
@@ -26,19 +29,46 @@ public Application(AppiumDriver appiumDriver, IConfiguration configuration) {
2629
*/
2730
}
2831

32+
public Application(DriverService driverService, AppiumDriver appiumDriver, IConfiguration configuration) {
33+
this.driverService = driverService;
34+
this.appiumDriver = appiumDriver;
35+
this.configuration = configuration;
36+
this.timeouts = configuration.getTimeoutConfiguration();
37+
this.timeoutImpl = timeouts.getImplicit();
38+
}
39+
2940
/**
3041
* Provides AppiumDriver instance for current application session
31-
* @return web driver instance
42+
* @return driver instance
3243
*/
3344
public AppiumDriver getDriver() {
3445
return appiumDriver;
3546
}
3647

48+
/**
49+
* Provides current AppiumDriver service instance (would be null if driver is not local)
50+
* @return driver service instance
51+
*/
52+
public DriverService getDriverService() {
53+
return driverService;
54+
}
55+
3756
/**
3857
* Returns name of current platform
3958
* @return name
4059
*/
4160
public final PlatformName getPlatformName() {
4261
return configuration.getApplicationProfile().getPlatformName();
4362
}
63+
64+
public void quit() {
65+
// todo: logger.info(getLocManager().getValue("loc.browser.driver.quit"));
66+
if (getDriver() != null) {
67+
getDriver().quit();
68+
}
69+
70+
if (getDriverService() != null) {
71+
getDriverService().stop();
72+
}
73+
}
4474
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package aquality.appium.application;
2+
3+
import aquality.appium.configuration.IConfiguration;
4+
import aquality.appium.localization.LocalizationManager;
5+
import aquality.appium.logger.Logger;
6+
import io.appium.java_client.AppiumDriver;
7+
import io.appium.java_client.android.AndroidDriver;
8+
import io.appium.java_client.ios.IOSDriver;
9+
import io.appium.java_client.windows.WindowsDriver;
10+
import org.openqa.selenium.Capabilities;
11+
12+
import java.net.URL;
13+
14+
abstract class ApplicationFactory implements IApplicationFactory {
15+
16+
IllegalArgumentException getLoggedWrongPlatformNameException() {
17+
// todo: String message = getLocManager().getValue("loc.browser.name.wrong");
18+
String message = "Platform name is not supported";
19+
IllegalArgumentException exception = new IllegalArgumentException(message);
20+
Logger.getInstance().fatal(message, exception);
21+
return exception;
22+
}
23+
24+
AppiumDriver getDriver(URL serviceUrl, IConfiguration configuration) {
25+
PlatformName platformName = configuration.getApplicationProfile().getPlatformName();
26+
Capabilities capabilities = configuration.getApplicationProfile().getDriverSettings().getCapabilities();
27+
AppiumDriver driver;
28+
switch (platformName) {
29+
case ANDROID:
30+
driver = new AndroidDriver<>(serviceUrl, capabilities);
31+
break;
32+
case IOS:
33+
driver = new IOSDriver<>(serviceUrl, capabilities);
34+
break;
35+
case WINDOWS:
36+
driver = new WindowsDriver<>(serviceUrl, capabilities);
37+
break;
38+
default:
39+
throw getLoggedWrongPlatformNameException();
40+
}
41+
return driver;
42+
}
43+
44+
void logApplicationIsReady(PlatformName platformName) {
45+
Logger.getInstance().info(getLocManager().getValue("loc.browser.ready"), platformName.toString());
46+
}
47+
48+
private LocalizationManager getLocManager(){
49+
return LocalizationManager.getInstance();
50+
}
51+
}

src/main/java/aquality/appium/application/ApplicationManager.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package aquality.appium.application;
22

3+
import aquality.appium.configuration.Configuration;
34
import aquality.appium.configuration.IConfiguration;
45

56
public class ApplicationManager {
@@ -18,13 +19,11 @@ public static Application getApplication(){
1819
}
1920

2021
public static void setDefaultFactory(){
21-
/*
22-
todo: to be implemented
2322
IConfiguration configuration = Configuration.getInstance();
2423
IApplicationFactory applicationFactory = Configuration.getInstance().getApplicationProfile().isRemote()
2524
? new RemoteApplicationFactory(configuration) : new LocalApplicationFactory(configuration);
2625

27-
setFactory(applicationFactory);*/
26+
setFactory(applicationFactory);
2827
}
2928

3029
public static void setFactory(IApplicationFactory applicationFactory){
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package aquality.appium.application;
2+
3+
import aquality.appium.configuration.IConfiguration;
4+
import io.appium.java_client.AppiumDriver;
5+
import io.appium.java_client.service.local.AppiumDriverLocalService;
6+
7+
public class LocalApplicationFactory extends ApplicationFactory {
8+
private final IConfiguration configuration;
9+
10+
public LocalApplicationFactory(IConfiguration configuration){
11+
this.configuration = configuration;
12+
}
13+
14+
@Override
15+
public Application getApplication() {
16+
PlatformName platformName = configuration.getApplicationProfile().getPlatformName();
17+
AppiumDriverLocalService service = AppiumDriverLocalService.buildDefaultService();
18+
service.start();
19+
AppiumDriver driver = getDriver(service.getUrl(), configuration);
20+
logApplicationIsReady(platformName);
21+
return new Application(service, driver, configuration);
22+
}
23+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package aquality.appium.application;
2+
3+
import aquality.appium.configuration.IApplicationProfile;
4+
import aquality.appium.configuration.IConfiguration;
5+
import aquality.appium.localization.LocalizationManager;
6+
import aquality.appium.logger.Logger;
7+
import io.appium.java_client.AppiumDriver;
8+
import org.openqa.selenium.remote.LocalFileDetector;
9+
10+
public class RemoteApplicationFactory extends ApplicationFactory {
11+
12+
private final IConfiguration configuration;
13+
14+
public RemoteApplicationFactory(IConfiguration configuration){
15+
this.configuration = configuration;
16+
}
17+
18+
@Override
19+
public Application getApplication() {
20+
PlatformName platformName = configuration.getApplicationProfile().getPlatformName();
21+
IApplicationProfile applicationProfile = configuration.getApplicationProfile();
22+
Logger.getInstance().info(LocalizationManager.getInstance().getValue("loc.browser.grid"));
23+
AppiumDriver driver = getDriver(applicationProfile.getRemoteConnectionUrl(), configuration);
24+
driver.setFileDetector(new LocalFileDetector());
25+
logApplicationIsReady(platformName);
26+
return new Application(driver, configuration);
27+
}
28+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package aquality.appium.configuration;
2+
3+
import aquality.appium.application.PlatformName;
4+
import aquality.appium.configuration.driversettings.AndroidSettings;
5+
import aquality.appium.configuration.driversettings.IDriverSettings;
6+
import aquality.appium.configuration.driversettings.IOSSettings;
7+
import aquality.appium.configuration.driversettings.WindowsSettings;
8+
import aquality.appium.utils.JsonFile;
9+
import org.openqa.selenium.InvalidArgumentException;
10+
11+
import java.net.MalformedURLException;
12+
import java.net.URL;
13+
14+
public class ApplicationProfile implements IApplicationProfile {
15+
16+
private final JsonFile settingsFile;
17+
18+
public ApplicationProfile(JsonFile settingsFile) {
19+
this.settingsFile = settingsFile;
20+
}
21+
22+
@Override
23+
public PlatformName getPlatformName() {
24+
return PlatformName.valueOf(String.valueOf(settingsFile.getValue("/platformName")).toUpperCase());
25+
}
26+
27+
@Override
28+
public boolean isRemote() {
29+
return (Boolean) settingsFile.getValue("/isRemote");
30+
}
31+
32+
@Override
33+
public boolean isElementHighlightEnabled() {
34+
// todo: define is it compatible/needed
35+
return (Boolean) (settingsFile.getValue("/isElementHighlightEnabled"));
36+
}
37+
38+
@Override
39+
public IDriverSettings getDriverSettings() {
40+
IDriverSettings driverSettings;
41+
switch (getPlatformName()){
42+
case ANDROID:
43+
driverSettings = new AndroidSettings(settingsFile);
44+
break;
45+
case IOS:
46+
driverSettings = new IOSSettings(settingsFile);
47+
break;
48+
case WINDOWS:
49+
driverSettings = new WindowsSettings(settingsFile);
50+
break;
51+
default:
52+
throw new IllegalArgumentException("There are no assigned behaviour for retrieving driver driversettings for platform " + getPlatformName());
53+
}
54+
return driverSettings;
55+
}
56+
57+
@Override
58+
public URL getRemoteConnectionUrl() {
59+
String key = "remoteConnectionUrl";
60+
try {
61+
return new URL(String.valueOf(settingsFile.getValue("/" + key)));
62+
} catch (MalformedURLException e) {
63+
throw new InvalidArgumentException(String.format("Key %1$s was not found in file %2$s", key, settingsFile.getFileCanonicalPath()));
64+
}
65+
}
66+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package aquality.appium.configuration;
2+
3+
import aquality.appium.utils.JsonFile;
4+
5+
import java.io.IOException;
6+
import java.io.UncheckedIOException;
7+
8+
public class Configuration implements IConfiguration{
9+
10+
private static ThreadLocal<Configuration> instance = ThreadLocal.withInitial(Configuration::new);
11+
private final ITimeoutConfiguration timeoutConfiguration;
12+
private final IRetryConfiguration retryConfiguration;
13+
private final IApplicationProfile applicationProfile;
14+
private final ILoggerConfiguration loggerConfiguration;
15+
16+
private Configuration() {
17+
JsonFile settings = getSettings();
18+
timeoutConfiguration = new TimeoutConfiguration(settings);
19+
retryConfiguration = new RetryConfiguration(settings);
20+
applicationProfile = new ApplicationProfile(settings);
21+
loggerConfiguration = new LoggerConfiguration(settings);
22+
}
23+
24+
public static Configuration getInstance() {
25+
return instance.get();
26+
}
27+
28+
@Override
29+
public IApplicationProfile getApplicationProfile() {
30+
return applicationProfile;
31+
}
32+
33+
@Override
34+
public ITimeoutConfiguration getTimeoutConfiguration() {
35+
return timeoutConfiguration;
36+
}
37+
38+
@Override
39+
public IRetryConfiguration getRetryConfiguration() {
40+
return retryConfiguration;
41+
}
42+
43+
@Override
44+
public ILoggerConfiguration getLoggerConfiguration() {
45+
return loggerConfiguration;
46+
}
47+
48+
private JsonFile getSettings() {
49+
String settingsProfile = System.getProperty("profile") == null ? "settings.json" : "settings." + System.getProperty("profile") + ".json";
50+
try{
51+
return new JsonFile(settingsProfile);
52+
}catch (IOException e){
53+
throw new UncheckedIOException(String.format("Browser profile assigned in file %1$s was not found in the root of resources directory", settingsProfile), e);
54+
}
55+
}
56+
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package aquality.appium.configuration;
22

3+
import aquality.appium.localization.SupportedLanguage;
4+
35
public interface ILoggerConfiguration {
46

5-
//todo: SupportedLanguage getLanguage();
7+
SupportedLanguage getLanguage();
68
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package aquality.appium.configuration;
2+
3+
import aquality.appium.localization.SupportedLanguage;
4+
import aquality.appium.utils.JsonFile;
5+
6+
public class LoggerConfiguration implements ILoggerConfiguration{
7+
8+
private final JsonFile settingsFile;
9+
10+
public LoggerConfiguration(JsonFile settingsFile){
11+
this.settingsFile = settingsFile;
12+
}
13+
14+
@Override
15+
public SupportedLanguage getLanguage() {
16+
return SupportedLanguage.valueOf(settingsFile.getValue("/logger/language").toString().toUpperCase());
17+
}
18+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package aquality.appium.configuration;
2+
3+
import aquality.appium.utils.JsonFile;
4+
5+
public class RetryConfiguration implements IRetryConfiguration {
6+
private final int number;
7+
private final long pollingInterval;
8+
9+
10+
public RetryConfiguration(JsonFile settingsFile) {
11+
this.number = Integer.parseInt(settingsFile.getValue("/retry/number").toString());
12+
this.pollingInterval = Long.parseLong(settingsFile.getValue("/retry/pollingInterval").toString());
13+
}
14+
15+
@Override
16+
public int getNumber() {
17+
return number;
18+
}
19+
20+
@Override
21+
public long getPollingInterval() {
22+
return pollingInterval;
23+
}
24+
}

0 commit comments

Comments
 (0)