Files
VisualSapfor/src/Visual_DVM_2021/Passes/All/StartSapforTests.java

296 lines
13 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package Visual_DVM_2021.Passes.All;
import Common.Current;
import Common.Global;
import Common.GlobalProperties;
import Common.UI.UI;
import Common.Utils.Utils;
import GlobalData.Settings.SettingName;
import ProjectData.LanguageName;
import Repository.Server.ServerCode;
import Repository.Server.ServerExchangeUnit_2021;
import SapforTestingSystem.Json.SapforPackage_json;
import SapforTestingSystem.Json.SapforScenario_json;
import SapforTestingSystem.SapforConfiguration.SapforConfiguration;
import SapforTestingSystem.SapforConfiguration.SapforConfigurationInterface;
import SapforTestingSystem.SapforConfigurationCommand.SapforConfigurationCommand;
import SapforTestingSystem.SapforScenario.SapforScenario;
import SapforTestingSystem.SapforTasksPackage.SapforTasksPackage;
import TestingSystem.Group.Group;
import TestingSystem.Test.Test;
import TestingSystem.Test.TestInterface;
import Visual_DVM_2021.Passes.PassCode_2021;
import Visual_DVM_2021.Passes.PassException;
import Visual_DVM_2021.Passes.Pass_2021;
import Visual_DVM_2021.Passes.TestingSystemPass;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.nio.file.Paths;
import java.util.LinkedHashMap;
import java.util.Vector;
import java.util.stream.Collectors;
public class StartSapforTests extends Pass_2021<SapforScenario> {
protected int allTasksCount = 0;
//--
protected LinkedHashMap<String, Vector<String>> groupsTests = null;
//--
protected LinkedHashMap<String, Test> allTests = null;
protected Vector<String> testsNames_lower = null; //все тесты что участвуют здесь
protected Vector<LanguageName> groupsLanguages = null;
protected File sapfor = null;
//---
@Override
public String getIconPath() {
return "/icons/Start.png";
}
@Override
public String getButtonText() {
return "";
}
@Override
protected boolean needsAnimation() {
return true;
}
//--
protected boolean checkTestName(Test test) {
String name = test.description.toLowerCase();
if (testsNames_lower.contains(name)) {
Log.Writeln_("В пакет не могут входить тесты с одинаковыми именами (без учета регистра):" + test.description.toLowerCase());
return false;
}
testsNames_lower.add(name);
return true;
}
protected boolean getGroupTests(String groupId) {
Vector<String> groupTests = new Vector<>();
Vector<String> selectedGroupTests = new Vector<>();
//---
for (Test test : Global.testingServer.db.tests.Data.values()) {
if (test.group_id.equals(groupId)) {
groupTests.add(test.id);
if (test.isSelected())
selectedGroupTests.add(test.id);
}
}
if (!groupTests.isEmpty() && !selectedGroupTests.isEmpty())
groupTests = selectedGroupTests;
//---
if (groupTests.isEmpty()) {
Log.Writeln_("Пустая группа тестов: " + groupId);
return false;
}
//--
for (String testId : groupTests) {
Test test = Global.testingServer.db.tests.get(testId);
if (!checkTestName(test))
return false;
else
allTests.put(test.description, test);
}
//--
groupsTests.put(groupId, groupTests);
//--
return true;
}
public boolean getConfigurationCommands(SapforConfiguration sapforConfiguration) {
//1. получить список всех команд.
Vector<PassCode_2021> codes = new Vector<>();
int v = 0;
for (SapforConfigurationCommand command : Global.testingServer.db.sapforConfigurationCommands.Data.values()) {
if (command.sapforconfiguration_id.equals(sapforConfiguration.id)) {
codes.add(command.passCode);
if (command.passCode.equals(PassCode_2021.CreateParallelVariants))
v++;
}
}
//--
if (codes.size() == 0) {
Log.Writeln_("Пустая конфигурация:" + sapforConfiguration.id);
return false;
}
//--
if (v > 2) {
Log.Writeln_("Неверная конфигурация:" + sapforConfiguration.id + ": построение параллельных вариантов возможно единожды.");
return false;
}
//--
if ((v == 1) && codes.size() > 1) {
if (!codes.lastElement().equals(PassCode_2021.CreateParallelVariants)) {
Log.Writeln_("Неверная конфигурация:" + sapforConfiguration.id + ": построение параллельных вариантов может быть только завершающей командой!");
return false;
}
}
return true;
}
@Override
protected boolean canStart(Object... args) throws Exception {
//--
allTasksCount = 0;
target = null;
//--
groupsTests = new LinkedHashMap<>();
//--->>
testsNames_lower = new Vector<>();
allTests = new LinkedHashMap<>();
groupsLanguages = new Vector<>();
//проверка стартовых условий.
//--->>
if (Global.testingServer.db.sapforConfigurations.getCheckedCount() == 0) {
Log.Writeln_("Не отмечено ни одной конфигурации SAPFOR.");
return false;
}
//-
for (SapforConfiguration configuration : Global.testingServer.db.sapforConfigurations.getCheckedItems()) {
if (!getConfigurationCommands(configuration))
return false;
}
//--
if (Global.testingServer.db.groups.getCheckedCount() == 0) {
Log.Writeln_("Не отмечено ни одной группы тестов");
return false;
}
//--
for (Group group : Global.testingServer.db.groups.getCheckedItems()) {
//---
if (!groupsLanguages.contains(group.language))
groupsLanguages.add(group.language);
//-
if (groupsLanguages.get(0) != LanguageName.fortran) {
Log.Writeln_("Поддерживается пакетный режим только для языка Fortran!");
return false;
}
if (groupsLanguages.size() > 1) {
Log.Writeln_("Запуск тестов на разных языках в рамках одного пакета запрещен!");
return false;
}
//---
if (!getGroupTests(group.id))
return false;
}
//--
for (int i = 0; i < Global.testingServer.db.sapforConfigurations.getCheckedCount(); ++i) {
for (Vector<String> tests : groupsTests.values())
allTasksCount += tests.size();
}
//--
return (UI.Question("Будет запущено:\n"
+ allTasksCount + " задач\n" +
"Продолжить")) && new TestingSystemPass() {
@Override
public String getDescription() {
return "Синхронизация тестов";
}
@Override
protected boolean needsAnimation() {
return true;
}
@Override
protected void ServerAction() throws Exception {
for (Test test : allTests.values()) {
ShowMessage1("загрузка " + test.description);
Command(new ServerExchangeUnit_2021(ServerCode.DownloadTest, test.id));
response.Unpack(TestInterface.getArchive(test));
}
}
}.Do();
}
@Override
protected void body() throws Exception {
//---
ShowMessage1("Распаковка тестов...");
//сразу в задачи распаковывать нельзя, потому что копируются под ид,а не дескриптион.
for (Test test : allTests.values()) {
ShowMessage2(test.description);
File testDst = new File(Global.TestsDirectory, test.id);
Utils.delete_with_check(testDst);
passes.get(PassCode_2021.UnzipFolderPass).Do(
TestInterface.getArchive(test).getAbsolutePath(),
Global.TestsDirectory.getAbsolutePath(), false
);
}
target = new SapforScenario();
target.sapfor_version = String.valueOf(Current.getSapfor().version);
target.tasksCount = allTasksCount;
Global.db.Insert(target);
//--->>>
File scenarioWorkspace = Paths.get(Global.db.settings.get(SettingName.Workspace).Value, String.valueOf(target.id)).toFile();
Utils.CheckAndCleanDirectory(scenarioWorkspace);
target.workspace = scenarioWorkspace.getAbsolutePath();
target.testsNames = String.join(";", testsNames_lower);
sapfor = new File(target.workspace, Utils.getDateName("SAPFOR_F") + (Global.isWindows ? ".exe" : "")); //развилка на линукс
ShowMessage2("Копирование SAPFOR");
FileUtils.copyFile(Current.getSapfor().getFile(), sapfor);
if (!sapfor.setExecutable(true))
throw new PassException("Не удалось сделать файл " + sapfor.getName() + " исполняемым!");
ShowMessage2("Копирование визуализатора");
File visualiser = new File(target.workspace, "VisualSapfor.jar");
FileUtils.copyFile(Global.visualiser.getFile(), visualiser);
ShowMessage2("Создание настроек");
GlobalProperties properties = new GlobalProperties();
properties.Mode = Current.Mode.Scenario;
properties.threadsNum = 4;
properties.threadsTimeout = 2000;
//----
Utils.jsonToFile(properties, new File(target.workspace, "properties"));
//----
File scenarioFile = new File(target.workspace, "scenario.txt");
SapforScenario_json scenario_json = new SapforScenario_json();
scenario_json.sapfor_drv = sapfor.getName();
scenario_json.tests.addAll(allTests.keySet());
//----
Global.db.Update(target);
ShowMessage1("Создание рабочих пространств...");
for (SapforConfiguration configuration : Global.testingServer.db.sapforConfigurations.getCheckedItems()) {
SapforTasksPackage sapforTasksPackage = new SapforTasksPackage();
Vector<PassCode_2021> codes = SapforConfigurationInterface.getPassCodes(configuration);
Vector<String> passesNames = codes.stream().map(PassCode_2021::getDescription).collect(Collectors.toCollection(Vector::new));
//--
sapforTasksPackage.sapforscenario_id = target.id;
sapforTasksPackage.sapforconfiguration_id = configuration.id;
sapforTasksPackage.flags = SapforConfigurationInterface.getFlags(configuration);
sapforTasksPackage.passesNames = String.join(";", passesNames);
//--
Global.db.Insert(sapforTasksPackage);
sapforTasksPackage.workspace = Paths.get(
Global.db.settings.get(SettingName.Workspace).Value,
String.valueOf(target.id),
String.valueOf(sapforTasksPackage.id)
).toFile().getAbsolutePath();
//---
Utils.CheckAndCleanDirectory(new File(sapforTasksPackage.workspace));
//---
for (Vector<String> testIds : groupsTests.values()) {
for (String testId : testIds) {
Test test = Global.testingServer.db.tests.get(testId);
ShowMessage2(test.description);
//--
File taskWorkspace = new File(sapforTasksPackage.workspace, test.description);
Utils.CheckAndCleanDirectory(taskWorkspace);
//--
Utils.copyDirectory(new File(Global.TestsDirectory, test.id), taskWorkspace);
}
}
Global.db.Update(sapforTasksPackage);
//--->>
SapforPackage_json package_json = new SapforPackage_json();
package_json.id = String.valueOf(sapforTasksPackage.id);
package_json.flags = sapforTasksPackage.flags;
package_json.codes.addAll(codes);
//--->>
scenario_json.packages.add(package_json);
}
//--
Utils.jsonToFile(scenario_json, scenarioFile);
//--
Utils.startScript_(scenarioWorkspace, scenarioWorkspace, "start", "java -jar VisualSapfor.jar");
}
@Override
protected void showFinish() throws Exception {
Global.db.sapforScenarios.ShowUI(target.getPK());
}
@Override
protected void showDone() throws Exception {
Global.db.sapforScenarios.ShowUI();
}
}