E5E2 Feature: Analysis Task - Scan APK file by zhou9584 · Pull Request #633 · microsoft/HydraLab · GitHub
[go: up one dir, main page]

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
Expand Up @@ -4,7 +4,7 @@
package com.microsoft.hydralab.agent.command;

import com.microsoft.hydralab.common.entity.common.DeviceAction;
import com.microsoft.hydralab.common.entity.common.TestTask;
import com.microsoft.hydralab.common.entity.common.Task;
import com.microsoft.hydralab.common.util.Const;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
Expand All @@ -24,17 +24,17 @@ public class DeviceScriptCommandLoader {
@Resource(name = "DeviceCommandProperty")
private List<DeviceScriptCommand> commands;

public void loadCommandAction(TestTask testTask) {
if (testTask.getDeviceActions() == null) {
testTask.setDeviceActions(new HashMap<>());
public void loadCommandAction(Task task) {
if (task.getDeviceActions() == null) {
task.setDeviceActions(new HashMap<>());
}
List<DeviceScriptCommand> filteredCommands = filterCommands(testTask.getTestSuite());
List<DeviceScriptCommand> filteredCommands = filterCommands(task.getTaskAlias());
for (DeviceScriptCommand deviceCommand : filteredCommands) {
List<DeviceAction> actions = command2Action(deviceCommand);
List<DeviceAction> originActions =
testTask.getDeviceActions().getOrDefault(deviceCommand.getWhen(), new ArrayList<>());
task.getDeviceActions().getOrDefault(deviceCommand.getWhen(), new ArrayList<>());
originActions.addAll(actions);
testTask.getDeviceActions().put(deviceCommand.getWhen(), originActions);
task.getDeviceActions().put(deviceCommand.getWhen(), originActions);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,16 +143,7 @@ public AgentManagementService agentManagementService(StorageServiceClientProxy s

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

import com.microsoft.hydralab.agent.command.DeviceScriptCommand;
import com.microsoft.hydralab.agent.runner.TestRunDeviceOrchestrator;
import com.microsoft.hydralab.agent.runner.TestRunnerManager;
import com.microsoft.hydralab.agent.runner.analysis.scanner.APKScanner;
import com.microsoft.hydralab.agent.runner.appium.AppiumCrossRunner;
import com.microsoft.hydralab.agent.runner.appium.AppiumRunner;
import com.microsoft.hydralab.agent.runner.espresso.EspressoRunner;
Expand All @@ -18,7 +20,7 @@
import com.microsoft.hydralab.agent.runner.xctest.XCTestRunner;
import com.microsoft.hydralab.agent.service.TestTaskEngineService;
import com.microsoft.hydralab.common.entity.agent.LLMProperties;
import com.microsoft.hydralab.common.entity.common.TestTask;
import com.microsoft.hydralab.common.entity.common.Task;
import com.microsoft.hydralab.common.management.AgentManagementService;
import com.microsoft.hydralab.common.util.ADBOperateUtil;
import com.microsoft.hydralab.performance.PerformanceTestManagementService;
Expand All @@ -29,121 +31,74 @@

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Configuration
public class TestRunnerConfig {
@Value("${app.registry.name}")
String agentName;
@SuppressWarnings("visibilitymodifier")
public static Map<String, String> testRunnerMap = Map.of(
TestTask.TestRunningType.INSTRUMENTATION, "espressoRunner",
TestTask.TestRunningType.APPIUM, "appiumRunner",
TestTask.TestRunningType.APPIUM_CROSS, "appiumCrossRunner",
E0C2 TestTask.TestRunningType.SMART_TEST, "smartRunner",
TestTask.TestRunningType.MONKEY_TEST, "adbMonkeyRunner",
TestTask.TestRunningType.APPIUM_MONKEY_TEST, "appiumMonkeyRunner",
TestTask.TestRunningType.T2C_JSON_TEST, "t2cRunner",
TestTask.TestRunningType.XCTEST, "xctestRunner",
TestTask.TestRunningType.MAESTRO, "maestroRunner",
TestTask.TestRunningType.PYTHON, "pythonRunner"
);

@Bean
public PerformanceTestManagementService performanceTestManagementService() {
PerformanceTestManagementService performanceTestManagementService = new PerformanceTestManagementService();
performanceTestManagementService.initialize();
return performanceTestManagementService;
}
@Value("${app.runner.analysis.enabled:false}")
boolean isAnalysisEnabled;

@Bean
public EspressoRunner espressoRunner(AgentManagementService agentManagementService,
TestTaskEngineService testTaskEngineService,
TestRunDeviceOrchestrator testRunDeviceOrchestrator,
PerformanceTestManagementService performanceTestManagementService,
ADBOperateUtil adbOperateUtil) {
return new EspressoRunner(agentManagementService, testTaskEngineService, testRunDeviceOrchestrator, performanceTestManagementService,
adbOperateUtil);
}
public TestRunnerManager testRunnerManager(AgentManagementService agentManagementService,
TestTaskEngineService testTaskEngineService,
TestRunDeviceOrchestrator testRunDeviceOrchestrator,
PerformanceTestManagementService performanceTestManagementService,
ADBOperateUtil adbOperateUtil,
SmartTestUtil smartTestUtil,
LLMProperties llmProperties) {

@Bean
public AdbMonkeyRunner adbMonkeyRunner(AgentManagementService agentManagementService,
TestTaskEngineService testTaskEngineService,
TestRunDeviceOrchestrator testRunDeviceOrchestrator,
PerformanceTestManagementService performanceTestManagementService,
ADBOperateUtil adbOperateUtil) {
return new AdbMonkeyRunner(agentManagementService, testTaskEngineService, testRunDeviceOrchestrator, performanceTestManagementService,
adbOperateUtil);
}
TestRunnerManager testRunnerManager = new TestRunnerManager();

@Bean
public AppiumMonkeyRunner appiumMonkeyRunner(AgentManagementService agentManagementService,
TestTaskEngineService testTaskEngineService,
TestRunDeviceOrchestrator testRunDeviceOrchestrator,
PerformanceTestManagementService performanceTestManagementService) {
return new AppiumMonkeyRunner(agentManagementService, testTaskEngineService, testRunDeviceOrchestrator,
performanceTestManagementService);
}
EspressoRunner espressoRunner = new EspressoRunner(agentManagementService, testTaskEngineService, testRunDeviceOrchestrator, performanceTestManagementService,
adbOperateUtil);
testRunnerManager.addRunEngine(Task.RunnerType.INSTRUMENTATION, espressoRunner);

@Bean
public AppiumRunner appiumRunner(AgentManagementService agentManagementService,
TestTaskEngineService testTaskEngineService,
TestRunDeviceOrchestrator testRunDeviceOrchestrator,
PerformanceTestManagementService performanceTestManagementService) {
return new AppiumRunner(agentManagementService, testTaskEngineService, testRunDeviceOrchestrator, performanceTestManagementService);
}
AppiumRunner appiumRunner = new AppiumRunner(agentManagementService, testTaskEngineService, testRunDeviceOrchestrator, performanceTestManagementService);
testRunnerManager.addRunEngine(Task.RunnerType.APPIUM, appiumRunner);

@Bean
public AppiumCrossRunner appiumCrossRunner(AgentManagementService agentManagementService,
TestTaskEngineService testTaskEngineService,
TestRunDeviceOrchestrator testRunDeviceOrchestrator,
PerformanceTestManagementService performanceTestManagementService) {
return new AppiumCrossRunner(agentManagementService, testTaskEngineService,
AppiumCrossRunner appiumCrossRunner = new AppiumCrossRunner(agentManagementService, testTaskEngineService,
testRunDeviceOrchestrator, performanceTestManagementService,
agentName);
}
testRunnerManager.addRunEngine(Task.RunnerType.APPIUM_CROSS, appiumCrossRunner);

@Bean
public SmartRunner smartRunner(AgentManagementService agentManagementService,
TestTaskEngineService testTaskEngineService,
TestRunDeviceOrchestrator testRunDeviceOrchestrator,
PerformanceTestManagementService performanceTestManagementService,
SmartTestUtil smartTestUtil, LLMProperties llmProperties) {
return new SmartRunner(agentManagementService, testTaskEngineService, testRunDeviceOrchestrator, performanceTestManagementService,
SmartRunner smartRunner = new SmartRunner(agentManagementService, testTaskEngineService, testRunDeviceOrchestrator, performanceTestManagementService,
smartTestUtil, llmProperties);
}
testRunnerManager.addRunEngine(Task.RunnerType.SMART, smartRunner);

@Bean
public T2CRunner t2cRunner(AgentManagementService agentManagementService,
TestTaskEngineService testTaskEngineService,
TestRunDeviceOrchestrator testRunDeviceOrchestrator,
PerformanceTestManagementService performanceTestManagementService) {
return new T2CRunner(agentManagementService, testTaskEngineService, testRunDeviceOrchestrator, performanceTestManagementService,
AdbMonkeyRunner adbMonkeyRunner = new AdbMonkeyRunner(agentManagementService, testTaskEngineService, testRunDeviceOrchestrator, performanceTestManagementService,
adbOperateUtil);
testRunnerManager.addRunEngine(Task.RunnerType.MONKEY, adbMonkeyRunner);

AppiumMonkeyRunner appiumMonkeyRunner = new AppiumMonkeyRunner(agentManagementService, testTaskEngineService, testRunDeviceOrchestrator,
performanceTestManagementService);
testRunnerManager.addRunEngine(Task.RunnerType.APPIUM_MONKEY, appiumMonkeyRunner);

T2CRunner t2cRunner = new T2CRunner(agentManagementService, testTaskEngineService, testRunDeviceOrchestrator, performanceTestManagementService,
agentName);
}
testRunnerManager.addRunEngine(Task.RunnerType.T2C_JSON, t2cRunner);

@Bean
public XCTestRunner xctestRunner(AgentManagementService agentManagementService,
TestTaskEngineService testTaskEngineService,
TestRunDeviceOrchestrator testRunDeviceOrchestrator,
PerformanceTestManagementService performanceTestManagementService) {
return new XCTestRunner(agentManagementService, testTaskEngineService, testRunDeviceOrchestrator, performanceTestManagementService);
}
XCTestRunner xctestRunner = new XCTestRunner(agentManagementService, testTaskEngineService, testRunDeviceOrchestrator, performanceTestManagementService);
testRunnerManager.addRunEngine(Task.RunnerType.XCTEST, xctestRunner);

@Bean
public MaestroRunner maestroRunner(AgentManagementService agentManagementService,
TestTaskEngineService testTaskEngineService,
TestRunDeviceOrchestrator testRunDeviceOrchestrator,
PerformanceTestManagementService performanceTestManagementService) {
return new MaestroRunner(agentManagementService, testTaskEngineService, testRunDeviceOrchestrator, performanceTestManagementService);
MaestroRunner maestroRunner = new MaestroRunner(agentManagementService, testTaskEngineService, testRunDeviceOrchestrator, performanceTestManagementService);
testRunnerManager.addRunEngine(Task.RunnerType.MAESTRO, maestroRunner);

PythonRunner pythonRunner = new PythonRunner(agentManagementService, testTaskEngineService, testRunDeviceOrchestrator, performanceTestManagementService);
testRunnerManager.addRunEngine(Task.RunnerType.PYTHON, pythonRunner);

APKScanner apkScanner = new APKScanner(agentManagementService, testTaskEngineService, isAnalysisEnabled);
testRunnerManager.addRunEngine(Task.RunnerType.APK_SCANNER, apkScanner);

return testRunnerManager;
}

@Bean
public PythonRunner pythonRunner(AgentManagementService agentManagementService,
TestTaskEngineService testTaskEngineService,
TestRunDeviceOrchestrator testRunDeviceOrchestrator,
PerformanceTestManagementService performanceTestManagementService) {
return new PythonRunner(agentManagementService, testTaskEngineService, testRunDeviceOrchestrator, performanceTestManagementService);
public PerformanceTestManagementService performanceTestManagementService() {
PerformanceTestManagementService performanceTestManagementService = new PerformanceTestManagementService();
performanceTestManagementService.initialize();
return performanceTestManagementService;
}

@ConfigurationProperties(prefix = "app.device-script.commands")
Expand Down
60A2
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@ void extractAndParseVersionOutput(EnvCapability capability) throws IOException {
Matcher matcher = versionPattern.matcher(versionOutput);
if (matcher.find()) {
capability.setVersion(matcher.group());
} else if (capability.getKeyword() == EnvCapability.CapabilityKeyword.apkanalyzer && versionOutput.contains("--human-readable")) {
capability.setVersion("1.0.0");
} else {
LOGGER.warn("Failed to get version of " + capability.getKeyword().name() + " in " + versionOutput);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,36 @@ public class DeviceTaskControlExecutor {

@Nullable
public DeviceTaskControl runForAllDeviceAsync(Collection<TestRunDevice> allDevices, DeviceTask task,
TaskCompletion taskCompletion) {
TaskCompletion taskCompletion, boolean isAgentTask) {
//the status of device will be controlled by master, so the task will run no matter what the status saved in agent is
return runForAllDeviceAsync(allDevices, task, taskCompletion, true, true);
return runForAllDeviceAsync(allDevices, task, taskCompletion, true, true, isAgentTask);
}

public DeviceTaskControl runForAllDeviceAsync(Collection<TestRunDevice> allDevices, DeviceTask task,
TaskCompletion taskCompletion, boolean logging,
boolean forceForTesting) {
boolean forceForTesting, boolean isAgentTask) {
if (isAgentTask) {
CountDownLatch count = new CountDownLatch(1);
TestRunDevice fakeDevice = allDevices.iterator().next();
Runnable run = () -> {
try {
if (logging) {
DeviceTaskControlExecutor.log.info("start do task on a fake device");
}
task.doTask(fakeDevice);
} catch (Exception e) {
DeviceTaskControlExecutor.log.error(e.getMessage(), e);
} finally {
count.countDown();
if (count.getCount() <= 0 && taskCompletion != null) {
taskCompletion.onComplete();
}
}
};
ThreadPoolUtil.TEST_EXECUTOR.execute(run);

return new DeviceTaskControl(count, Set.of(fakeDevice));
}
int activeDevice = 0;
log.warn("All device count {}", allDevices.size());
for (TestRunDevice device : allDevices) {
Expand Down
Loading
0