package TestingSystem.DVM; import Common.Utils.CommonUtils; import _VisualDVM.Global; import Common_old.Utils.Utils; import GlobalData.Tasks.TaskState; import ProjectData.Files.ProjectFile; import ProjectData.LanguageName; import Repository.Server.ServerCode; import TestingSystem.Common.TasksPackageState; import TestingSystem.Common.TestingPlanner; import TestingSystem.DVM.DVMPackage.DVMPackage; import TestingSystem.DVM.DVMTasks.DVMCompilationTask; import TestingSystem.DVM.DVMTasks.DVMTask; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.FileFilter; import java.nio.charset.Charset; import java.nio.file.Paths; import java.util.LinkedHashMap; import java.util.List; import java.util.Vector; public abstract class DVMTestingPlanner extends TestingPlanner { public DVMTestingPlanner(String[] args) { super(args); } LinkedHashMap getTestsFromJson() { LinkedHashMap res = new LinkedHashMap<>(); for (DVMCompilationTask task : testingPackage.package_json.compilationTasks) { if (!res.containsKey(task.test_id)) { res.put(task.test_id, Paths.get(Global.TestsDirectory.getAbsolutePath(), String.valueOf(task.test_id)).toFile()); } } return res; } static LinkedHashMap> getTestPrograms(File test) { LinkedHashMap> res = new LinkedHashMap<>(); //-- res.put(LanguageName.fortran, new Vector<>()); res.put(LanguageName.c, new Vector<>()); res.put(LanguageName.cpp, new Vector<>()); //-- File[] files = test.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isFile(); } }); if (files != null) { for (File file : files) { ProjectFile projectFile = new ProjectFile(new File(file.getName())); if (projectFile.isNotExcludedProgram()) res.get(projectFile.languageName).add(projectFile); } } return res; } static void generateForLanguage(String dvm_drv, LanguageName language, Vector language_programs, Vector titles, Vector objects, Vector bodies, String flags) { if (!language_programs.isEmpty()) { String LANG_ = language.toString().toUpperCase() + "_"; Vector module_objects = new Vector<>(); String module_body = ""; int i = 1; for (ProjectFile program : language_programs) { //-- String object = CommonUtils.DQuotes(language + "_" + i + ".o"); module_objects.add(object); module_body += object + ":\n" + "\t" + String.join(" ", Utils.MFVar(LANG_ + "COMMAND"), Utils.MFVar(LANG_ + "FLAGS"), program.getStyleOptions(), "-c", program.getQSourceName(), "-o", object + "\n\n"); ++i; } titles.add(String.join("\n", LANG_ + "COMMAND=" + CommonUtils.DQuotes(dvm_drv) + " " + language.getDVMCompile(), LANG_ + "FLAGS=" + flags, LANG_ + "OBJECTS=" + String.join(" ", module_objects), "")); objects.add(Utils.MFVar(LANG_ + "OBJECTS")); bodies.add(module_body); } } static String generateMakefile(File test, LanguageName test_language, String dvm_drv, String flags) { //----->> LinkedHashMap> programs = getTestPrograms(test); Vector titles = new Vector<>(); Vector objects = new Vector<>(); Vector bodies = new Vector<>(); String binary = CommonUtils.DQuotes("0"); //----->> for (LanguageName languageName : programs.keySet()) { generateForLanguage(dvm_drv, languageName, programs.get(languageName), titles, objects, bodies, flags); } //----->> return String.join("\n", "LINK_COMMAND=" + CommonUtils.DQuotes(dvm_drv) + " " + test_language.getDVMLink(), "LINK_FLAGS=" + flags + "\n", String.join("\n", titles), "all: " + binary, binary + " : " + String.join(" ", objects), "\t" + Utils.MFVar("LINK_COMMAND") + " " + Utils.MFVar("LINK_FLAGS") + " " + String.join(" ", objects) + " -o " + binary, String.join(" ", bodies)); } public void getTasksInfo(List tasks, String file_name) throws Exception { LinkedHashMap sorted_tasks = new LinkedHashMap<>(); for (DVMTask task : tasks) sorted_tasks.put(task.id, task); //-- File info_file = Paths.get(packageLocalWorkspace.getAbsolutePath(), "results", file_name).toFile(); List lines = FileUtils.readLines(info_file, Charset.defaultCharset()); for (String packed : lines) { if (!packed.isEmpty()) { String[] data = packed.split(" "); int id = Integer.parseInt(data[0]); TaskState state = TaskState.valueOf(data[1]); double time = Double.parseDouble(data[2]); //-- DVMTask task = sorted_tasks.get(id); task.state = state; task.Time = state.equals(TaskState.AbortedByTimeout) ? (task.maxtime + 1) : time; } } } @Override protected void Print(String message) { try { if (isPrintOn()) { System.out.println(message); Global.Log.Print(message); } } catch (Exception ex) { ex.printStackTrace(); } } @Override protected ServerCode getActivePackagesCode() { return ServerCode.GetFirstActiveDVMPackageForMachineURL; } @Override protected ServerCode getCheckIfNeedsKillCode() { return ServerCode.DVMPackageNeedsKill; } @Override protected TasksPackageState getStateAfterStart() { return TasksPackageState.CompilationWorkspacesCreation; } @Override protected void ServerConnectionError(ServerCode code_in, String logText) throws Exception { Finalize("Не удалось выполнить команду " + code_in + " на сервере тестирования\n" + logText); } protected abstract boolean CheckModules() throws Exception; @Override public void perform() throws Exception { Print("Проверка сервера..."); String currentServerName = (String) ServerCommand(ServerCode.GetServerName); Print("имя текущего сервера " + CommonUtils.Brackets(currentServerName)); Print("имя сервера, создавшего нить " + CommonUtils.Brackets(serverName)); if (!serverName.equals(currentServerName)) { Finalize("Несоответствующий сервер"); } Print("Запрос активных пакетов для машины " + CommonUtils.Brackets(machine.getURL())); testingPackage = null; Vector activePackages = (Vector) ServerCommand(getActivePackagesCode(), machine.getURL(), null); if (activePackages.isEmpty()) Finalize("Не найдено активных пакетов для машины " + CommonUtils.Brackets(machine.getURL())); for (DVMPackage activePackage : activePackages) PerformPackage(activePackage); } }