155 lines
7.4 KiB
Java
155 lines
7.4 KiB
Java
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<DVMPackage> {
|
||
public DVMTestingPlanner(String[] args) {
|
||
super(args);
|
||
}
|
||
LinkedHashMap<Integer, File> getTestsFromJson() {
|
||
LinkedHashMap<Integer, File> 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<LanguageName, Vector<ProjectFile>> getTestPrograms(File test) {
|
||
LinkedHashMap<LanguageName, Vector<ProjectFile>> 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<ProjectFile> language_programs, Vector<String> titles, Vector<String> objects, Vector<String> bodies, String flags) {
|
||
if (!language_programs.isEmpty()) {
|
||
String LANG_ = language.toString().toUpperCase() + "_";
|
||
Vector<String> 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<LanguageName, Vector<ProjectFile>> programs = getTestPrograms(test);
|
||
Vector<String> titles = new Vector<>();
|
||
Vector<String> objects = new Vector<>();
|
||
Vector<String> 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<? extends DVMTask> tasks, String file_name) throws Exception {
|
||
LinkedHashMap<Integer, DVMTask> 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<String> 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<DVMPackage> activePackages = (Vector<DVMPackage>) ServerCommand(getActivePackagesCode(), machine.getURL(), null);
|
||
if (activePackages.isEmpty())
|
||
Finalize("Не найдено активных пакетов для машины " + CommonUtils.Brackets(machine.getURL()));
|
||
for (DVMPackage activePackage : activePackages)
|
||
PerformPackage(activePackage);
|
||
}
|
||
}
|