stack service and trigger service
This commit is contained in:
parent
1ed6449ac6
commit
cba12be4b1
16 changed files with 784 additions and 177 deletions
|
@ -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
|
||||
);
|
||||
};
|
||||
}
|
110
server/test/features/executor_program_service_test.ts
Normal file
110
server/test/features/executor_program_service_test.ts
Normal 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
|
||||
);
|
||||
};
|
||||
}
|
|
@ -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() {
|
114
server/test/features/stack_service_test.ts
Normal file
114
server/test/features/stack_service_test.ts
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
137
server/test/features/trigger_service_test.ts
Normal file
137
server/test/features/trigger_service_test.ts
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue