stack service and trigger service

This commit is contained in:
IDONTSUDO 2023-09-11 19:49:45 +03:00
parent 1ed6449ac6
commit cba12be4b1
16 changed files with 784 additions and 177 deletions

View file

@ -1,96 +0,0 @@
import { delay } from "../src/core/helper/delay.js";
import { EXEC_TYPE } from "../src/core/model/exec_error_model.js";
import { ExecutorResult } from "../src/core/model/executor_result.js";
import { ExecutorProgramService } from "../src/core/services/executor_program_service.js";
import { TestCore } from "./core/test_core.js";
import { resultTest as resultTest, __dirname } from "./test.js";
import { Worker } from "node:cluster";
export class ExecutorProgramServiceTest extends ExecutorProgramService {
timeCancel = 1000;
public test = async () => {
await this.resultsTests();
await this.longTimeCancelTest()
await this.logWriteAndEventEndTestTypeExec()
await this.logWriteAndEventEndTypeSpawn()
};
private async logWriteAndEventEndTypeSpawn(){
const executorProgramService = await new ExecutorProgramService(__dirname + '/')
executorProgramService.call(EXEC_TYPE.SPAWN, 'node',['./mocks/log_code.js'])
const test = TestCore.instance
let testIsOk = false
let logEvent = false
executorProgramService.on((e) =>{
if(e.isSuccess()) {
const executorResult = e.value as ExecutorResult
if(logEvent == false){
logEvent = executorResult.data != null && executorResult.data != undefined
}
testIsOk = executorResult.event == 'END' && logEvent
}
})
await delay(8000)
test.assert(testIsOk,'ExecutorProgramService EXEC_TYPE.SPAWN end event and log write')
}
private async logWriteAndEventEndTestTypeExec(){
const executorProgramService = await new ExecutorProgramService(__dirname)
executorProgramService.call(EXEC_TYPE.EXEC, 'node ./test/mocks/log_code.js' )
const test = TestCore.instance
executorProgramService.on((e) =>{
if(e.isSuccess()) {
const executorResult = e.value as ExecutorResult
test.assert(executorResult.data != undefined && executorResult.event == 'END','ExecutorProgramService EXEC_TYPE.EXEC end event and log write')
}
})
await delay(7000)
}
private async longTimeCancelTest(){
const executorProgramService = await new ExecutorProgramService('',1000)
executorProgramService.call(EXEC_TYPE.EXEC, 'node ./test/mocks/long_code.js' )
await delay(1500)
const worker = executorProgramService.worker as Worker
const test = TestCore.instance
test.assert(worker.isDead(),'ExecutorProgramService long time cancel')
}
private resultsTests = async () => {
await resultTest(
new ExecutorProgramService(__dirname),
[EXEC_TYPE.EXEC, "node ./mocks/error.js"],
"ExecutorProgramService EXEC_TYPE.EXEC on Result.error",
false,
2000
);
await delay(400)
await resultTest(
new ExecutorProgramService(__dirname),
[EXEC_TYPE.EXEC, "ls"],
"ExecutorProgramService EXEC_TYPE.EXEC on Result.ok",
true
);
await resultTest(
new ExecutorProgramService(__dirname),
[EXEC_TYPE.SPAWN, "ls"],
"ExecutorProgramService EXEC_TYPE.SPAWN on Result.ok",
true
);
await resultTest(
new ExecutorProgramService(__dirname),
[EXEC_TYPE.SPAWN, "python3 ./mocks/s.js"],
"ExecutorProgramService EXEC_TYPE.SPAWN on Result.error",
false,
2000
);
await resultTest(
new ExecutorProgramService(__dirname),
[EXEC_TYPE.SPAWN, "ls"],
"ExecutorProgramService EXEC_TYPE.SPAWN on Result.ok",
true,
2000
);
};
}

View file

@ -0,0 +1,110 @@
import { delay } from "../../src/core/helper/delay.js";
import { EXEC_TYPE } from "../../src/core/model/exec_error_model.js";
import { ExecutorResult } from "../../src/core/model/executor_result.js";
import { ExecutorProgramService } from "../../src/core/services/executor_program_service.js";
import { TestCore } from "../core/test_core.js";
import { resultTest as resultTest, dirname__ } from "../test.js";
import { Worker } from "node:cluster";
export class ExecutorProgramServiceTest extends ExecutorProgramService {
timeCancel = 1000;
public test = async () => {
await this.resultsTests();
await this.longTimeCancelTest();
await this.logWriteAndEventEndTestTypeExec();
await this.logWriteAndEventEndTypeSpawn();
};
private async logWriteAndEventEndTypeSpawn() {
const executorProgramService = await new ExecutorProgramService(
dirname__ + "/"
);
executorProgramService.call(EXEC_TYPE.SPAWN, "node", [
"./mocks/log_code.js",
]);
const test = TestCore.instance;
let testIsOk = false;
let logEvent = false;
executorProgramService.on((e) => {
if (e.isSuccess()) {
const executorResult = e.value as ExecutorResult;
if (logEvent == false) {
logEvent =
executorResult.data != null && executorResult.data != undefined;
}
testIsOk = executorResult.event == "END" && logEvent;
}
});
await delay(8000);
test.assert(
testIsOk,
"ExecutorProgramService EXEC_TYPE.SPAWN end event and log write"
);
}
private async logWriteAndEventEndTestTypeExec() {
const executorProgramService = await new ExecutorProgramService(dirname__);
executorProgramService.call(
EXEC_TYPE.EXEC,
"node ./test/mocks/log_code.js"
);
const test = TestCore.instance;
executorProgramService.on((e) => {
if (e.isSuccess()) {
const executorResult = e.value as ExecutorResult;
test.assert(
executorResult.data != undefined && executorResult.event == "END",
"ExecutorProgramService EXEC_TYPE.EXEC end event and log write"
);
}
});
await delay(7000);
}
private async longTimeCancelTest() {
const executorProgramService = await new ExecutorProgramService("", 1000);
executorProgramService.call(
EXEC_TYPE.EXEC,
"node ./test/mocks/long_code.js"
);
await delay(1500);
const worker = executorProgramService.worker as Worker;
const test = TestCore.instance;
test.assert(worker.isDead(), "ExecutorProgramService long time cancel");
}
private resultsTests = async () => {
await resultTest(
new ExecutorProgramService(dirname__),
[EXEC_TYPE.EXEC, "node ./mocks/error.js"],
"ExecutorProgramService EXEC_TYPE.EXEC on Result.error",
false,
4000
);
await delay(400);
await resultTest(
new ExecutorProgramService(dirname__),
[EXEC_TYPE.EXEC, "ls"],
"ExecutorProgramService EXEC_TYPE.EXEC on Result.ok",
true
);
await resultTest(
new ExecutorProgramService(dirname__),
[EXEC_TYPE.SPAWN, "ls"],
"ExecutorProgramService EXEC_TYPE.SPAWN on Result.ok",
true
);
await resultTest(
new ExecutorProgramService(dirname__),
[EXEC_TYPE.SPAWN, "python3 ./mocks/s.js"],
"ExecutorProgramService EXEC_TYPE.SPAWN on Result.error",
false,
2000
);
await resultTest(
new ExecutorProgramService(dirname__),
[EXEC_TYPE.SPAWN, "ls"],
"ExecutorProgramService EXEC_TYPE.SPAWN on Result.ok",
true,
2000
);
};
}

View file

@ -1,11 +1,11 @@
import { delay } from "../src/core/helper/delay.js";
import { EventsFileChanger } from "../src/core/model/meta_data_file_manager_model.js";
import { FilesChangeNotifierService } from "../src/core/services/files_change_notifier_service.js";
import { assert, __dirname } from "./test.js";
import * as fs from "fs";
import { FilesChangeNotifierService } from "../../src/core/services/files_change_notifier_service.js";
import { EventsFileChanger } from "../../src/core/model/meta_data_file_manager_model.js";
import { assert, dirname__ } from "../test.js";
import { delay } from "../../src/core/helper/delay.js";
export class FilesChangerTest extends FilesChangeNotifierService {
directory = __dirname + "/context/";
directory = dirname__ + "/context/";
data = () => {
return "This is a file containing a collection";
};
@ -68,14 +68,14 @@ export class FilesChangerTest extends FilesChangeNotifierService {
this.directory = "";
const result = this.call();
assert(result.isFailure(), "Not exists directory");
this.directory = __dirname + "/context/";
this.directory = dirname__ + "/context/";
}
public async test() {
await this.createFile();
await this.updateFile()
await this.initFile()
await this.deleteFile()
await this.notExistsDirectory()
await this.updateFile();
await this.initFile();
await this.deleteFile();
await this.notExistsDirectory();
await this.testClear();
}
public testClear() {

View file

@ -0,0 +1,114 @@
import { rmSync } from "fs";
import * as fs from "fs";
import {
IssueType,
StackGenerateType,
TriggerType,
} from "../../src/core/model/process_model.js";
import { EXEC_TYPE } from "../../src/core/model/exec_error_model.js";
import { StackService } from "../../src/core/services/stack_service.js";
import { delay } from "../../src/core/helper/delay.js";
import { assert, dirname__ } from "../test.js";
abstract class IStackServiceTest {
abstract test(): Promise<boolean>;
}
export function readDirRecursive(path: string, filesToDir: string[] = []) {
const files = fs.readdirSync(path);
files.forEach((file) => {
let filePath = "";
if (path[path.length - 1] !== "/") {
filePath = `${path}/${file}`;
} else {
filePath = `${path}${file}`;
}
const stats = fs.statSync(filePath);
if (stats.isDirectory()) {
readDirRecursive(filePath, filesToDir);
} else {
filesToDir.push(file);
}
});
return filesToDir;
}
class SimpleTestStackServiceTest
extends StackService
implements IStackServiceTest
{
constructor() {
super(
[
{
process: {
type: EXEC_TYPE.EXEC,
command: `nix run gitlab:robossembler/nix-robossembler-overlay#test-script '{
"filesMeta":[
{"type":"folder","name":"example", "path": null,"rewrite":true}
],
"path":"$PATH"
}'`,
isGenerating: true,
isLocaleCode: false,
issueType: IssueType.WARNING,
},
trigger: {
type: TriggerType.FILE,
value: ["context"],
},
env: null,
stackGenerateType: StackGenerateType.SINGLETON,
},
{
process: {
type: EXEC_TYPE.EXEC,
command: `nix run gitlab:robossembler/nix-robossembler-overlay#test-script '{
"filesMeta":[
{"type":"file","name":"1.txt", "path":"example","rewrite":true}
],
"path":"$PATH"
}'`,
isGenerating: true,
isLocaleCode: false,
issueType: IssueType.WARNING,
},
trigger: {
type: TriggerType.FILE,
value: ["1.txt"],
},
env: null,
stackGenerateType: StackGenerateType.SINGLETON,
},
],
dirname__ + "/context/"
);
}
async test(): Promise<boolean> {
await this.call();
const testResult = readDirRecursive(this.path).equals(
["1.txt", "test.txt"],
true
);
await delay(100);
rmSync(this.path + "example/", { recursive: true });
return testResult;
}
}
export class StackServiceTest {
dirName: string;
constructor(dirName: string) {
this.dirName = dirName;
}
public async test() {
const tests = [new SimpleTestStackServiceTest()];
for await (const el of tests) {
assert((await el.test()) === true, el.constructor.name);
await delay(3000);
}
}
}

View file

@ -0,0 +1,137 @@
import {
EventsFileChanger,
MetaDataFileManagerModel,
} from "../../src/core/model/meta_data_file_manager_model.js";
import { TriggerType } from "../../src/core/model/process_model.js";
import { TriggerService } from "../../src/core/services/trigger_service.js";
import { assert } from "../test.js";
abstract class TriggerTest {
abstract test(): Promise<boolean>;
}
class TriggerServiceFileOkTest extends TriggerService implements TriggerTest {
constructor() {
super(
{
type: TriggerType.FILE,
value: ["context"],
},
{
"/context/": new MetaDataFileManagerModel(
"",
"",
EventsFileChanger.create
),
},
""
);
}
async test(): Promise<boolean> {
const r = await this.call();
return r.isSuccess();
}
}
class TriggerServiceFileErrorTest
extends TriggerService
implements TriggerTest
{
constructor() {
super(
{
type: TriggerType.FILE,
value: ["123"],
},
{
"/ctx/": new MetaDataFileManagerModel("", "", EventsFileChanger.create),
"/context/": new MetaDataFileManagerModel(
"",
"",
EventsFileChanger.create
),
},
""
);
}
async test(): Promise<boolean> {
const r = await this.call();
return r.isFailure();
}
}
class TriggerServiceProcessOkTest
extends TriggerService
implements TriggerTest
{
constructor() {
super(
{
type: TriggerType.PROCESS,
value: [
`function main(){
return true
}
main()`,
],
},
{
"/context/": new MetaDataFileManagerModel(
"",
"",
EventsFileChanger.create
),
},
""
);
}
async test(): Promise<boolean> {
const r = await this.call();
return r.isSuccess();
}
}
class TriggerServiceProcessErrorTest
extends TriggerService
implements TriggerTest
{
constructor() {
super(
{
type: TriggerType.PROCESS,
value: [
`function main(){
return true
}
`,
],
},
{
"/context/": new MetaDataFileManagerModel(
"",
"",
EventsFileChanger.create
),
},
""
);
}
async test(): Promise<boolean> {
const r = await this.call();
return r.isFailure();
}
}
export class TriggerServiceTest {
public async test() {
const tests: TriggerTest[] = [
new TriggerServiceFileOkTest(),
new TriggerServiceFileErrorTest(),
new TriggerServiceProcessOkTest(),
new TriggerServiceProcessErrorTest(),
];
for await (const el of tests) {
assert((await el.test()) === true, el.constructor.name);
}
}
}

View file

@ -2,46 +2,29 @@ import locator from "../src/core/di/register_di.js";
import { UnitTestEnv } from "../src/core/di/env.js";
import { fileURLToPath } from "url";
import { dirname } from "path";
import { ExecutorProgramServiceTest } from "./executor_program_service_test.js";
import { FilesChangerTest } from "./files_change_notifier_service_test.js";
import { ExecutorProgramServiceTest } from "./features/executor_program_service_test.js";
import { FilesChangerTest } from "./features/files_change_notifier_service_test.js";
import { TestCore } from "./core/test_core.js";
import "reflect-metadata";
import { CalculationProcess, IssueType, ProcessMetaData, ProcessType, TriggerType } from "../src/core/model/process_model.js";
import { StackServiceTest } from "./features/stack_service_test.js";
import { TriggerServiceTest } from "./features/trigger_service_test.js";
const testCore = TestCore.instance;
const __filename: string = fileURLToPath(import.meta.url);
export const __dirname: string = dirname(__filename);
export const dirname__: string = dirname(__filename);
export const assert = testCore.assert;
export const resultTest = testCore.resultTest;
const env = new UnitTestEnv(__dirname);
const env = new UnitTestEnv(dirname__);
locator(env);
const main = async () => {
await new ExecutorProgramServiceTest(__dirname).test();
await new FilesChangerTest(__dirname).test()
await new ExecutorProgramServiceTest(dirname__).test();
await new FilesChangerTest(dirname__).test();
await new StackServiceTest(dirname__ + "/context/").test();
await new TriggerServiceTest().test();
await testCore.testResult();
};
main();
// const logProcess:ProcessMetaData = {
// process: {
// type: ProcessType.EXEC,
// command: `nix-shell -p 'python39.withPackages(ps: with ps; [ ])' --run 'python3 p.py 1'`,
// isGenerating: false,
// isLocaleCode: false,
// issueType: IssueType.WARNING,
// timeout: 10000000,
// },
// trigger: {
// type: TriggerType.PROCESS,
// value: 'code',
// },
// env: null,
// }
// const calculationProcess = new CalculationProcess([])
main();