Skip to content

Commit

Permalink
Scan and register the function availabilities of agent. (#427)
Browse files Browse the repository at this point in the history
* Register the functionAvailabilities of agent

* Add test cases

* provide getmethod

* Add DependsOn

* Update EnvCapability.java

* Update EnvCapabilityDiscoveryServiceTest.java

* rename parameter

* add static variables to save version

* update puml

* add javadoc
  • Loading branch information
zhou9584 authored May 5, 2023
1 parent 0c6e9d9 commit 36fd6b9
Show file tree
Hide file tree
Showing 28 changed files with 353 additions and 16 deletions.
6 changes: 3 additions & 3 deletions agent/doc/UML/agent_device_management_design.puml
Original file line number Diff line number Diff line change
Expand Up @@ -173,8 +173,8 @@ class DeviceDriver{

TestRunner -r-> AgentManagementService
DeviceDriver -r-> AgentManagementService
TestRunner --> EnvCapabilityRequirement
DeviceDriver --> EnvCapabilityRequirement
TestRunner *--> EnvCapabilityRequirement
DeviceDriver *--> EnvCapabilityRequirement

class EnvCapabilityRequirement{
+private boolean isReady
Expand All @@ -192,7 +192,7 @@ class AgentFunctionAvailability{
+boolean enabled
+boolean available
}
AgentManagementService -->AgentFunctionAvailability
AgentManagementService *-->AgentFunctionAvailability
AgentFunctionAvailability ..> AgentFunctionType
class AgentUser{
List<AgentFunctionAvailability> functionAvailabilities;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;

import javax.annotation.Resource;
import java.io.File;
Expand Down Expand Up @@ -84,7 +85,8 @@ public EnvCapabilityDiscoveryService envCapabilityDiscoveryService() throws IOEx

@Bean
public AgentManagementService agentManagementService(StorageServiceClientProxy storageServiceClientProxy,
DeviceStatusListenerManager deviceStatusListenerManager) {
DeviceStatusListenerManager deviceStatusListenerManager,
EnvCapabilityDiscoveryService envCapabilityDiscoveryService) {
AgentManagementService agentManagementService = new AgentManagementService();
File testBaseDir = new File(appOptions.getTestCaseResultLocation());
if (!testBaseDir.exists()) {
Expand Down Expand Up @@ -117,10 +119,14 @@ public AgentManagementService agentManagementService(StorageServiceClientProxy s
agentManagementService.setDeviceFolderUrlPrefix(AppOptions.DEVICE_STORAGE_MAPPING_REL_PATH);
agentManagementService.setDeviceStoragePath(appOptions.getDeviceStorageLocation());

agentManagementService.setEnvInfo(envCapabilityDiscoveryService.getEnvInfo());

return agentManagementService;
}

// TODO: refactor test runner to remove DependsOn
@Bean
@DependsOn({"espressoRunner", "appiumRunner", "appiumCrossRunner", "smartRunner", "adbMonkeyRunner", "appiumMonkeyRunner", "t2cRunner", "xctestRunner"})
public AgentWebSocketClient agentWebSocketClient(AgentWebSocketClientService agentWebSocketClientService)
throws Exception {
String wsUrl = String.format("ws://%s/agent/connect", registryServer);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

package com.microsoft.hydralab.agent.config;

import com.microsoft.hydralab.common.entity.agent.AgentFunctionAvailability;
import com.microsoft.hydralab.common.management.AgentManagementService;
import com.microsoft.hydralab.common.management.AppiumServerManager;
import com.microsoft.hydralab.common.management.device.DeviceType;
Expand Down Expand Up @@ -40,16 +41,26 @@ public class DeviceDriverConfig {
@Bean
public DeviceDriverManager deviceDriverManager(AgentManagementService agentManagementService, AppiumServerManager appiumServerManager, ADBOperateUtil adbOperateUtil) {
DeviceDriverManager deviceDriverManager = new DeviceDriverManager();

AndroidDeviceDriver androidDeviceDriver = new AndroidDeviceDriver(agentManagementService, appiumServerManager, adbOperateUtil);
agentManagementService.registerFunctionAvailability(AndroidDeviceDriver.class.getName(), AgentFunctionAvailability.AgentFunctionType.DEVICE_DRIVER, enableAndroid,
androidDeviceDriver.getEnvCapabilityRequirements());

IOSDeviceDriver iosDeviceDriver = new IOSDeviceDriver(agentManagementService, appiumServerManager);
agentManagementService.registerFunctionAvailability(IOSDeviceDriver.class.getName(), AgentFunctionAvailability.AgentFunctionType.DEVICE_DRIVER, enableIos,
iosDeviceDriver.getEnvCapabilityRequirements());

WindowsDeviceDriver windowsDeviceDriver = new WindowsDeviceDriver(agentManagementService, appiumServerManager);
agentManagementService.registerFunctionAvailability(WindowsDeviceDriver.class.getName(), AgentFunctionAvailability.AgentFunctionType.DEVICE_DRIVER, enableWindows,
windowsDeviceDriver.getEnvCapabilityRequirements());

if (enableAndroid) {
AndroidDeviceDriver androidDeviceDriver = new AndroidDeviceDriver(agentManagementService, appiumServerManager, adbOperateUtil);
deviceDriverManager.addDeviceDriver(DeviceType.ANDROID, androidDeviceDriver);
}
if (enableIos) {
IOSDeviceDriver iosDeviceDriver = new IOSDeviceDriver(agentManagementService, appiumServerManager);
deviceDriverManager.addDeviceDriver(DeviceType.IOS, iosDeviceDriver);
}
if (enableWindows) {
WindowsDeviceDriver windowsDeviceDriver = new WindowsDeviceDriver(agentManagementService, appiumServerManager);
deviceDriverManager.addDeviceDriver(DeviceType.WINDOWS, windowsDeviceDriver);
}
return deviceDriverManager;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.microsoft.hydralab.agent.environment;

import com.microsoft.hydralab.common.entity.agent.EnvCapability;
import com.microsoft.hydralab.common.entity.agent.EnvInfo;
import org.slf4j.Logger;

import java.io.IOException;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.microsoft.hydralab.agent.environment;

import com.microsoft.hydralab.common.entity.agent.EnvCapability;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
Expand Down Expand Up @@ -69,7 +70,7 @@ private void scanCapabilityVersion(List<EnvCapability> capabilities) throws IOEx
}

private void extractAndParseVersionOutput(EnvCapability capability) throws IOException {
Process process = Runtime.getRuntime().exec(new String[]{capability.getFile().getAbsolutePath(), capability.getKeyword().fetchVersionParam});
Process process = Runtime.getRuntime().exec(new String[]{capability.getFile().getAbsolutePath(), capability.getKeyword().getFetchVersionParam()});
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8));
BufferedReader error = new BufferedReader(new InputStreamReader(process.getErrorStream(), StandardCharsets.UTF_8))) {
// combine this in case that some output is provided through stdout and some through stderr
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
package com.microsoft.hydralab.agent.runner;

import cn.hutool.core.lang.Assert;
import com.microsoft.hydralab.common.entity.agent.AgentFunctionAvailability;
import com.microsoft.hydralab.common.entity.agent.EnvCapabilityRequirement;
import com.microsoft.hydralab.common.entity.common.DeviceAction;
import com.microsoft.hydralab.common.entity.common.TestReport;
import com.microsoft.hydralab.common.entity.common.TestResult;
Expand Down Expand Up @@ -44,8 +46,15 @@ public TestRunner(AgentManagementService agentManagementService, TestTaskRunCall
this.testTaskRunCallback = testTaskRunCallback;
this.performanceTestManagementService = performanceTestManagementService;
this.testRunDeviceOrchestrator = testRunDeviceOrchestrator;
init();
}

void init() {
agentManagementService.registerFunctionAvailability(getClass().getName(), AgentFunctionAvailability.AgentFunctionType.TEST_RUNNER, true, getEnvCapabilityRequirements());
}

protected abstract List<EnvCapabilityRequirement> getEnvCapabilityRequirements();

@Override
public TestReport run(TestTask testTask, TestRunDevice testRunDevice) {
checkTestTaskCancel(testTask);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,30 @@

import com.microsoft.hydralab.agent.runner.TestRunDeviceOrchestrator;
import com.microsoft.hydralab.agent.runner.TestTaskRunCallback;
import com.microsoft.hydralab.common.entity.agent.EnvCapability;
import com.microsoft.hydralab.common.entity.agent.EnvCapabilityRequirement;
import com.microsoft.hydralab.common.management.AgentManagementService;
import com.microsoft.hydralab.performance.PerformanceTestManagementService;

import java.util.List;

public class AppiumCrossRunner extends AppiumRunner {
String agentName;
private static final int MAJOR_APPIUM_VERSION = 1;
private static final int MINOR_APPIUM_VERSION = -1;
private static final int MAJOR_FFMPEG_VERSION = 4;
private static final int MINOR_FFMPEG_VERSION = -1;

public AppiumCrossRunner(AgentManagementService agentManagementService, TestTaskRunCallback testTaskRunCallback,
TestRunDeviceOrchestrator testRunDeviceOrchestrator,
PerformanceTestManagementService performanceTestManagementService, String agentName) {
super(agentManagementService, testTaskRunCallback, testRunDeviceOrchestrator, performanceTestManagementService);
this.agentName = agentName;
}

@Override
protected List<EnvCapabilityRequirement> getEnvCapabilityRequirements() {
return List.of(new EnvCapabilityRequirement(EnvCapability.CapabilityKeyword.appium, MAJOR_APPIUM_VERSION, MINOR_APPIUM_VERSION),
new EnvCapabilityRequirement(EnvCapability.CapabilityKeyword.ffmpeg, MAJOR_FFMPEG_VERSION, MINOR_FFMPEG_VERSION));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import com.microsoft.hydralab.agent.runner.TestTaskRunCallback;
import com.microsoft.hydralab.appium.AppiumParam;
import com.microsoft.hydralab.appium.ThreadParam;
import com.microsoft.hydralab.common.entity.agent.EnvCapability;
import com.microsoft.hydralab.common.entity.agent.EnvCapabilityRequirement;
import com.microsoft.hydralab.common.entity.common.TestRun;
import com.microsoft.hydralab.common.entity.common.TestRunDevice;
import com.microsoft.hydralab.common.entity.common.TestTask;
Expand All @@ -29,18 +31,26 @@
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass;

public class AppiumRunner extends TestRunner {
private static final int MAJOR_APPIUM_VERSION = 1;
private static final int MINOR_APPIUM_VERSION = -1;

public AppiumRunner(AgentManagementService agentManagementService, TestTaskRunCallback testTaskRunCallback,
TestRunDeviceOrchestrator testRunDeviceOrchestrator,
PerformanceTestManagementService performanceTestManagementService) {
super(agentManagementService, testTaskRunCallback, testRunDeviceOrchestrator, performanceTestManagementService);
}

@Override
protected List<EnvCapabilityRequirement> getEnvCapabilityRequirements() {
return List.of(new EnvCapabilityRequirement(EnvCapability.CapabilityKeyword.appium, MAJOR_APPIUM_VERSION, MINOR_APPIUM_VERSION));
}

@Override
protected void run(TestRunDevice testRunDevice, TestTask testTask, TestRun testRun) throws Exception {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import com.microsoft.hydralab.agent.runner.TestRunDeviceOrchestrator;
import com.microsoft.hydralab.agent.runner.TestRunner;
import com.microsoft.hydralab.agent.runner.TestTaskRunCallback;
import com.microsoft.hydralab.common.entity.agent.EnvCapability;
import com.microsoft.hydralab.common.entity.agent.EnvCapabilityRequirement;
import com.microsoft.hydralab.common.entity.common.DeviceInfo;
import com.microsoft.hydralab.common.entity.common.TestRun;
import com.microsoft.hydralab.common.entity.common.TestRunDevice;
Expand All @@ -23,9 +25,12 @@

import java.io.File;
import java.util.Collections;
import java.util.List;
import java.util.Map;

public class EspressoRunner extends TestRunner {
private static final int MAJOR_ADB_VERSION = 1;
private static final int MINOR_ADB_VERSION = -1;
final ADBOperateUtil adbOperateUtil;

public EspressoRunner(AgentManagementService agentManagementService, TestTaskRunCallback testTaskRunCallback,
Expand All @@ -35,6 +40,11 @@ public EspressoRunner(AgentManagementService agentManagementService, TestTaskRun
this.adbOperateUtil = adbOperateUtil;
}

@Override
protected List<EnvCapabilityRequirement> getEnvCapabilityRequirements() {
return List.of(new EnvCapabilityRequirement(EnvCapability.CapabilityKeyword.adb, MAJOR_ADB_VERSION, MINOR_ADB_VERSION));
}

@Override
protected void run(TestRunDevice testRunDevice, TestTask testTask, TestRun testRun) throws Exception {
InstrumentationResultParser instrumentationResultParser = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import com.microsoft.hydralab.agent.runner.TestRunDeviceOrchestrator;
import com.microsoft.hydralab.agent.runner.TestRunner;
import com.microsoft.hydralab.agent.runner.TestTaskRunCallback;
import com.microsoft.hydralab.common.entity.agent.EnvCapability;
import com.microsoft.hydralab.common.entity.agent.EnvCapabilityRequirement;
import com.microsoft.hydralab.common.entity.common.AndroidTestUnit;
import com.microsoft.hydralab.common.entity.common.TestRun;
import com.microsoft.hydralab.common.entity.common.TestRunDevice;
Expand All @@ -20,18 +22,20 @@
import org.slf4j.LoggerFactory;

import java.io.File;
import java.util.List;
import java.util.Map;

public class AdbMonkeyRunner extends TestRunner {
private static final String TEST_RUN_NAME = "ADB monkey test";
@SuppressWarnings("constantname")
static final Logger classLogger = LoggerFactory.getLogger(AdbMonkeyRunner.class);
private static final String TEST_RUN_NAME = "ADB monkey test";
private static final int MAJOR_ADB_VERSION = 1;
private static final int MINOR_ADB_VERSION = -1;
final ADBOperateUtil adbOperateUtil;
private long recordingStartTimeMillis;
private int index;
private String pkgName;
private AndroidTestUnit ongoingMonkeyTest;

private TestRunDevice testRunDevice;
private Logger logger;

Expand All @@ -43,6 +47,11 @@ public AdbMonkeyRunner(AgentManagementService agentManagementService, TestTaskRu
this.adbOperateUtil = adbOperateUtil;
}

@Override
protected List<EnvCapabilityRequirement> getEnvCapabilityRequirements() {
return List.of(new EnvCapabilityRequirement(EnvCapability.CapabilityKeyword.adb, MAJOR_ADB_VERSION, MINOR_ADB_VERSION));
}

@Override
protected void run(TestRunDevice testRunDevice, TestTask testTask, TestRun testRun) throws Exception {
this.testRunDevice = testRunDevice;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import com.microsoft.hydralab.agent.runner.TestRunDeviceOrchestrator;
import com.microsoft.hydralab.agent.runner.TestRunner;
import com.microsoft.hydralab.agent.runner.TestTaskRunCallback;
import com.microsoft.hydralab.common.entity.agent.EnvCapability;
import com.microsoft.hydralab.common.entity.agent.EnvCapabilityRequirement;
import com.microsoft.hydralab.common.entity.agent.SmartTestParam;
import com.microsoft.hydralab.common.entity.common.AndroidTestUnit;
import com.microsoft.hydralab.common.entity.common.TestRun;
Expand All @@ -20,14 +22,18 @@
import org.slf4j.Logger;

import java.io.File;
import java.util.List;

public class SmartRunner extends TestRunner {
private static final int MAJOR_APPIUM_VERSION = 1;
private static final int MINOR_APPIUM_VERSION = -1;
private static final int MAJOR_PYTHON_VERSION = 3;
private static final int MINOR_PYTHON_VERSION = 8;
private final SmartTestUtil smartTestUtil;
private long recordingStartTimeMillis;
private int index;
private String pkgName;
private SmartTestParam smartTestParam;

private TestRunDevice testRunDevice;
private Logger logger;

Expand All @@ -39,6 +45,12 @@ public SmartRunner(AgentManagementService agentManagementService, TestTaskRunCal
this.smartTestUtil = smartTestUtil;
}

@Override
protected List<EnvCapabilityRequirement> getEnvCapabilityRequirements() {
return List.of(new EnvCapabilityRequirement(EnvCapability.CapabilityKeyword.appium, MAJOR_APPIUM_VERSION, MINOR_APPIUM_VERSION),
new EnvCapabilityRequirement(EnvCapability.CapabilityKeyword.python, MAJOR_PYTHON_VERSION, MINOR_PYTHON_VERSION));
}

@Override
protected void run(TestRunDevice testRunDevice, TestTask testTask, TestRun testRun) throws Exception {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import com.microsoft.hydralab.agent.runner.TestRunDeviceOrchestrator;
import com.microsoft.hydralab.agent.runner.TestTaskRunCallback;
import com.microsoft.hydralab.agent.runner.appium.AppiumRunner;
import com.microsoft.hydralab.common.entity.agent.EnvCapability;
import com.microsoft.hydralab.common.entity.agent.EnvCapabilityRequirement;
import com.microsoft.hydralab.common.entity.common.AndroidTestUnit;
import com.microsoft.hydralab.common.entity.common.DeviceInfo;
import com.microsoft.hydralab.common.entity.common.TestRun;
Expand Down Expand Up @@ -35,11 +37,16 @@
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class T2CRunner extends AppiumRunner {
private String pkgName;
private static final int MAJOR_APPIUM_VERSION = 1;
private static final int MINOR_APPIUM_VERSION = -1;
private static final int MAJOR_FFMPEG_VERSION = 4;
private static final int MINOR_FFMPEG_VERSION = -1;
String agentName;
private String pkgName;
private int currentIndex = 0;

public T2CRunner(AgentManagementService agentManagementService, TestTaskRunCallback testTaskRunCallback,
Expand All @@ -49,6 +56,12 @@ public T2CRunner(AgentManagementService agentManagementService, TestTaskRunCallb
this.agentName = agentName;
}

@Override
protected List<EnvCapabilityRequirement> getEnvCapabilityRequirements() {
return List.of(new EnvCapabilityRequirement(EnvCapability.CapabilityKeyword.appium, MAJOR_APPIUM_VERSION, MINOR_APPIUM_VERSION),
new EnvCapabilityRequirement(EnvCapability.CapabilityKeyword.ffmpeg, MAJOR_FFMPEG_VERSION, MINOR_FFMPEG_VERSION));
}

@Override
protected File runAndGetGif(File initialJsonFile, String unusedSuiteName, TestRunDevice testRunDevice, TestTask testTask,
TestRun testRun, File deviceTestResultFolder, Logger logger) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import com.microsoft.hydralab.agent.runner.TestRunDeviceOrchestrator;
import com.microsoft.hydralab.agent.runner.TestRunner;
import com.microsoft.hydralab.agent.runner.TestTaskRunCallback;
import com.microsoft.hydralab.common.entity.agent.EnvCapability;
import com.microsoft.hydralab.common.entity.agent.EnvCapabilityRequirement;
import com.microsoft.hydralab.common.entity.common.AndroidTestUnit;
import com.microsoft.hydralab.common.entity.common.TestRun;
import com.microsoft.hydralab.common.entity.common.TestRunDevice;
Expand All @@ -23,6 +25,10 @@
import java.util.Map;

public class XCTestRunner extends TestRunner {
private static final int MAJOR_APPIUM_VERSION = 1;
private static final int MINOR_APPIUM_VERSION = -1;
private static final int MAJOR_TIDEVICE_VERSION = 0;
private static final int MINOR_TIDEVICE_VERSION = 10;
private static String folderPath = "";
private Logger logger;
private long recordingStartTimeMillis;
Expand All @@ -32,6 +38,12 @@ public XCTestRunner(AgentManagementService agentManagementService, TestTaskRunCa
super(agentManagementService, testTaskRunCallback, testRunDeviceOrchestrator, performanceTestManagementService);
}

@Override
protected List<EnvCapabilityRequirement> getEnvCapabilityRequirements() {
return List.of(new EnvCapabilityRequirement(EnvCapability.CapabilityKeyword.appium, MAJOR_APPIUM_VERSION, MINOR_APPIUM_VERSION),
new EnvCapabilityRequirement(EnvCapability.CapabilityKeyword.tidevice, MAJOR_TIDEVICE_VERSION, MINOR_TIDEVICE_VERSION));
}

@Override
protected void run(TestRunDevice testRunDevice, TestTask testTask, TestRun testRun) throws Exception {
initializeTest(testRunDevice, testTask, testRun);
Expand Down
Loading

0 comments on commit 36fd6b9

Please sign in to comment.