testeranto 0.219.13 → 0.219.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/testeranto.ts +1 -1
- package/dist/common/allTestsUtils.js +0 -17
- package/dist/common/package.json +0 -3
- package/dist/common/scripts/build-example.js +0 -105
- package/dist/common/src/Init.js +0 -38
- package/dist/common/src/Types.js +0 -63
- package/dist/common/src/esbuildConfigs/consoleDetectorPlugin.js +0 -38
- package/dist/common/src/esbuildConfigs/eslint-formatter-testeranto.js +0 -21
- package/dist/common/src/esbuildConfigs/featuresPlugin.js +0 -39
- package/dist/common/src/esbuildConfigs/index.js +0 -22
- package/dist/common/src/esbuildConfigs/inputFilesPlugin.js +0 -30
- package/dist/common/src/esbuildConfigs/nativeImportDetectorPlugin.js +0 -24
- package/dist/common/src/esbuildConfigs/rebuildPlugin.js +0 -19
- package/dist/common/src/init-docs.js +0 -9
- package/dist/common/src/lib/tiposkripto/BaseGiven.js +0 -96
- package/dist/common/src/lib/tiposkripto/BaseSuite.js +0 -134
- package/dist/common/src/lib/tiposkripto/BaseThen.js +0 -65
- package/dist/common/src/lib/tiposkripto/BaseTiposkripto.js +0 -193
- package/dist/common/src/lib/tiposkripto/BaseWhen.js +0 -46
- package/dist/common/src/lib/tiposkripto/CoreTypes.js +0 -2
- package/dist/common/src/lib/tiposkripto/Node.js +0 -40
- package/dist/common/src/lib/tiposkripto/Tiposkripto.js +0 -49
- package/dist/common/src/lib/tiposkripto/Types.js +0 -2
- package/dist/common/src/lib/tiposkripto/Web.js +0 -70
- package/dist/common/src/lib/tiposkripto/abstractBase.test/MockGiven.js +0 -22
- package/dist/common/src/lib/tiposkripto/abstractBase.test/MockThen.js +0 -16
- package/dist/common/src/lib/tiposkripto/abstractBase.test/MockWhen.js +0 -18
- package/dist/common/src/lib/tiposkripto/abstractBase.test/adapter.js +0 -24
- package/dist/common/src/lib/tiposkripto/abstractBase.test/implementation.js +0 -38
- package/dist/common/src/lib/tiposkripto/abstractBase.test/index.js +0 -17
- package/dist/common/src/lib/tiposkripto/abstractBase.test/specification.js +0 -19
- package/dist/common/src/lib/tiposkripto/abstractBase.test/types.js +0 -2
- package/dist/common/src/lib/tiposkripto/index.js +0 -29
- package/dist/common/src/runtimes.js +0 -4
- package/dist/common/src/server/aider/configParser.js +0 -124
- package/dist/common/src/server/aider/docker.js +0 -30
- package/dist/common/src/server/getRunnables.js +0 -36
- package/dist/common/src/server/htmlTemplate.js +0 -44
- package/dist/common/src/server/nodeVersion.js +0 -5
- package/dist/common/src/server/runtimes/common.js +0 -136
- package/dist/common/src/server/runtimes/golang/docker.js +0 -62
- package/dist/common/src/server/runtimes/java/docker.js +0 -46
- package/dist/common/src/server/runtimes/node/docker.js +0 -42
- package/dist/common/src/server/runtimes/node/esbuild.js +0 -40
- package/dist/common/src/server/runtimes/node/node.js +0 -75
- package/dist/common/src/server/runtimes/python/docker.js +0 -31
- package/dist/common/src/server/runtimes/ruby/docker.js +0 -34
- package/dist/common/src/server/runtimes/rust/docker.js +0 -35
- package/dist/common/src/server/runtimes/web/docker.js +0 -42
- package/dist/common/src/server/runtimes/web/esbuild.js +0 -29
- package/dist/common/src/server/runtimes/web/hoist.js +0 -16
- package/dist/common/src/server/runtimes/web/web.js +0 -157
- package/dist/common/src/server/serverClasees/Server.js +0 -47
- package/dist/common/src/server/serverClasees/Server_Base.js +0 -18
- package/dist/common/src/server/serverClasees/Server_Docker.js +0 -904
- package/dist/common/src/server/serverClasees/Server_FS.js +0 -119
- package/dist/common/src/server/serverClasees/Server_HTTP.js +0 -189
- package/dist/common/src/server/serverClasees/Server_WS.js +0 -262
- package/dist/common/src/server/serverManagers/DockerManager.js +0 -28
- package/dist/common/src/server/serverManagers/HttpManager.js +0 -114
- package/dist/common/src/server/serverManagers/WsManager.js +0 -230
- package/dist/common/src/server/serverManagers/fs.js +0 -32
- package/dist/common/src/server/serverManagers/tcp.js +0 -51
- package/dist/common/src/server/types.js +0 -2
- package/dist/common/src/testeranto.js +0 -75
- package/dist/common/src/vscode/TerminalManager.js +0 -129
- package/dist/common/src/vscode/TestTreeItem.js +0 -77
- package/dist/common/src/vscode/extension.js +0 -185
- package/dist/common/src/vscode/providers/FeaturesTreeDataProvider.js +0 -445
- package/dist/common/src/vscode/providers/FileTreeDataProvider.js +0 -190
- package/dist/common/src/vscode/providers/ProcessesTreeDataProvider.js +0 -270
- package/dist/common/src/vscode/providers/ResultsTreeDataProvider.js +0 -87
- package/dist/common/src/vscode/providers/TestTreeDataProvider.js +0 -309
- package/dist/common/src/vscode/types.js +0 -9
- package/dist/common/testeranto/runtimes/node/node.js +0 -7
- package/dist/common/testeranto/runtimes/web/web.js +0 -6
- package/dist/common/testeranto/testeranto.js +0 -70
- package/dist/common/tsconfig.common.tsbuildinfo +0 -1
- package/dist/module/allTestsUtils.js +0 -13
- package/dist/module/package.json +0 -3
- package/dist/module/scripts/build-example.js +0 -100
- package/dist/module/src/Init.js +0 -33
- package/dist/module/src/Types.js +0 -62
- package/dist/module/src/esbuildConfigs/consoleDetectorPlugin.js +0 -32
- package/dist/module/src/esbuildConfigs/eslint-formatter-testeranto.js +0 -18
- package/dist/module/src/esbuildConfigs/featuresPlugin.js +0 -34
- package/dist/module/src/esbuildConfigs/index.js +0 -20
- package/dist/module/src/esbuildConfigs/inputFilesPlugin.js +0 -25
- package/dist/module/src/esbuildConfigs/nativeImportDetectorPlugin.js +0 -21
- package/dist/module/src/esbuildConfigs/rebuildPlugin.js +0 -14
- package/dist/module/src/init-docs.js +0 -4
- package/dist/module/src/lib/tiposkripto/BaseGiven.js +0 -92
- package/dist/module/src/lib/tiposkripto/BaseSuite.js +0 -130
- package/dist/module/src/lib/tiposkripto/BaseThen.js +0 -61
- package/dist/module/src/lib/tiposkripto/BaseTiposkripto.js +0 -190
- package/dist/module/src/lib/tiposkripto/BaseWhen.js +0 -42
- package/dist/module/src/lib/tiposkripto/CoreTypes.js +0 -1
- package/dist/module/src/lib/tiposkripto/Node.js +0 -33
- package/dist/module/src/lib/tiposkripto/Tiposkripto.js +0 -14
- package/dist/module/src/lib/tiposkripto/Types.js +0 -1
- package/dist/module/src/lib/tiposkripto/Web.js +0 -63
- package/dist/module/src/lib/tiposkripto/abstractBase.test/MockGiven.js +0 -18
- package/dist/module/src/lib/tiposkripto/abstractBase.test/MockThen.js +0 -12
- package/dist/module/src/lib/tiposkripto/abstractBase.test/MockWhen.js +0 -14
- package/dist/module/src/lib/tiposkripto/abstractBase.test/adapter.js +0 -21
- package/dist/module/src/lib/tiposkripto/abstractBase.test/implementation.js +0 -35
- package/dist/module/src/lib/tiposkripto/abstractBase.test/index.js +0 -12
- package/dist/module/src/lib/tiposkripto/abstractBase.test/specification.js +0 -15
- package/dist/module/src/lib/tiposkripto/abstractBase.test/types.js +0 -1
- package/dist/module/src/lib/tiposkripto/index.js +0 -24
- package/dist/module/src/runtimes.js +0 -1
- package/dist/module/src/server/aider/configParser.js +0 -116
- package/dist/module/src/server/aider/docker.js +0 -28
- package/dist/module/src/server/getRunnables.js +0 -29
- package/dist/module/src/server/htmlTemplate.js +0 -40
- package/dist/module/src/server/nodeVersion.js +0 -2
- package/dist/module/src/server/runtimes/common.js +0 -127
- package/dist/module/src/server/runtimes/golang/docker.js +0 -55
- package/dist/module/src/server/runtimes/java/docker.js +0 -40
- package/dist/module/src/server/runtimes/node/docker.js +0 -36
- package/dist/module/src/server/runtimes/node/esbuild.js +0 -35
- package/dist/module/src/server/runtimes/node/node.js +0 -37
- package/dist/module/src/server/runtimes/python/docker.js +0 -25
- package/dist/module/src/server/runtimes/ruby/docker.js +0 -28
- package/dist/module/src/server/runtimes/rust/docker.js +0 -29
- package/dist/module/src/server/runtimes/web/docker.js +0 -36
- package/dist/module/src/server/runtimes/web/esbuild.js +0 -24
- package/dist/module/src/server/runtimes/web/hoist.js +0 -11
- package/dist/module/src/server/runtimes/web/web.js +0 -119
- package/dist/module/src/server/serverClasees/Server.js +0 -40
- package/dist/module/src/server/serverClasees/Server_Base.js +0 -14
- package/dist/module/src/server/serverClasees/Server_Docker.js +0 -897
- package/dist/module/src/server/serverClasees/Server_FS.js +0 -119
- package/dist/module/src/server/serverClasees/Server_HTTP.js +0 -182
- package/dist/module/src/server/serverClasees/Server_WS.js +0 -258
- package/dist/module/src/server/serverManagers/DockerManager.js +0 -28
- package/dist/module/src/server/serverManagers/HttpManager.js +0 -110
- package/dist/module/src/server/serverManagers/WsManager.js +0 -226
- package/dist/module/src/server/serverManagers/fs.js +0 -32
- package/dist/module/src/server/serverManagers/tcp.js +0 -47
- package/dist/module/src/server/types.js +0 -1
- package/dist/module/src/testeranto.js +0 -40
- package/dist/module/src/vscode/TerminalManager.js +0 -92
- package/dist/module/src/vscode/TestTreeItem.js +0 -40
- package/dist/module/src/vscode/extension.js +0 -148
- package/dist/module/src/vscode/providers/FeaturesTreeDataProvider.js +0 -408
- package/dist/module/src/vscode/providers/FileTreeDataProvider.js +0 -153
- package/dist/module/src/vscode/providers/ProcessesTreeDataProvider.js +0 -233
- package/dist/module/src/vscode/providers/ResultsTreeDataProvider.js +0 -50
- package/dist/module/src/vscode/providers/TestTreeDataProvider.js +0 -272
- package/dist/module/src/vscode/types.js +0 -6
- package/dist/module/testeranto/runtimes/node/node.js +0 -5
- package/dist/module/testeranto/runtimes/web/web.js +0 -4
- package/dist/module/testeranto/testeranto.js +0 -68
- package/dist/module/tsconfig.module.tsbuildinfo +0 -1
- package/dist/prebuild/chunk-QLT7PNPK.mjs +0 -162
- package/dist/prebuild/esbuildConfigs/eslint-formatter-testeranto.mjs +0 -20
- package/dist/prebuild/init-docs.mjs +0 -56
- package/dist/prebuild/server/runtimes/node/node.mjs +0 -80
- package/dist/prebuild/server/runtimes/web/hoist.mjs +0 -12
- package/dist/prebuild/server/runtimes/web/web.mjs +0 -162
- package/dist/prebuild/testeranto-6SAYRVSE.mjs +0 -72
- package/dist/prebuild/testeranto.mjs +0 -1692
- package/dist/types/src/Init.d.ts +0 -2
- package/dist/types/src/Types.d.ts +0 -87
- package/dist/types/src/esbuildConfigs/consoleDetectorPlugin.d.ts +0 -2
- package/dist/types/src/esbuildConfigs/eslint-formatter-testeranto.d.ts +0 -2
- package/dist/types/src/esbuildConfigs/featuresPlugin.d.ts +0 -5
- package/dist/types/src/esbuildConfigs/index.d.ts +0 -3
- package/dist/types/src/esbuildConfigs/inputFilesPlugin.d.ts +0 -7
- package/dist/types/src/esbuildConfigs/nativeImportDetectorPlugin.d.ts +0 -2
- package/dist/types/src/esbuildConfigs/rebuildPlugin.d.ts +0 -6
- package/dist/types/src/init-docs.d.ts +0 -1
- package/dist/types/src/lib/tiposkripto/BaseGiven.d.ts +0 -42
- package/dist/types/src/lib/tiposkripto/BaseSuite.d.ts +0 -46
- package/dist/types/src/lib/tiposkripto/BaseThen.d.ts +0 -28
- package/dist/types/src/lib/tiposkripto/BaseTiposkripto.d.ts +0 -35
- package/dist/types/src/lib/tiposkripto/BaseWhen.d.ts +0 -27
- package/dist/types/src/lib/tiposkripto/CoreTypes.d.ts +0 -51
- package/dist/types/src/lib/tiposkripto/Node.d.ts +0 -9
- package/dist/types/src/lib/tiposkripto/Tiposkripto.d.ts +0 -5
- package/dist/types/src/lib/tiposkripto/Types.d.ts +0 -9
- package/dist/types/src/lib/tiposkripto/Web.d.ts +0 -9
- package/dist/types/src/lib/tiposkripto/abstractBase.test/MockGiven.d.ts +0 -9
- package/dist/types/src/lib/tiposkripto/abstractBase.test/MockThen.d.ts +0 -6
- package/dist/types/src/lib/tiposkripto/abstractBase.test/MockWhen.d.ts +0 -6
- package/dist/types/src/lib/tiposkripto/abstractBase.test/adapter.d.ts +0 -3
- package/dist/types/src/lib/tiposkripto/abstractBase.test/implementation.d.ts +0 -3
- package/dist/types/src/lib/tiposkripto/abstractBase.test/index.d.ts +0 -28
- package/dist/types/src/lib/tiposkripto/abstractBase.test/specification.d.ts +0 -3
- package/dist/types/src/lib/tiposkripto/abstractBase.test/types.d.ts +0 -39
- package/dist/types/src/lib/tiposkripto/index.d.ts +0 -56
- package/dist/types/src/runtimes.d.ts +0 -2
- package/dist/types/src/server/aider/configParser.d.ts +0 -11
- package/dist/types/src/server/aider/docker.d.ts +0 -2
- package/dist/types/src/server/getRunnables.d.ts +0 -3
- package/dist/types/src/server/htmlTemplate.d.ts +0 -2
- package/dist/types/src/server/nodeVersion.d.ts +0 -2
- package/dist/types/src/server/runtimes/common.d.ts +0 -12
- package/dist/types/src/server/runtimes/golang/docker.d.ts +0 -5
- package/dist/types/src/server/runtimes/java/docker.d.ts +0 -14
- package/dist/types/src/server/runtimes/node/docker.d.ts +0 -14
- package/dist/types/src/server/runtimes/node/esbuild.d.ts +0 -4
- package/dist/types/src/server/runtimes/node/node.d.ts +0 -1
- package/dist/types/src/server/runtimes/python/docker.d.ts +0 -14
- package/dist/types/src/server/runtimes/ruby/docker.d.ts +0 -14
- package/dist/types/src/server/runtimes/rust/docker.d.ts +0 -14
- package/dist/types/src/server/runtimes/web/docker.d.ts +0 -15
- package/dist/types/src/server/runtimes/web/esbuild.d.ts +0 -4
- package/dist/types/src/server/runtimes/web/hoist.d.ts +0 -1
- package/dist/types/src/server/runtimes/web/web.d.ts +0 -1
- package/dist/types/src/server/serverClasees/Server.d.ts +0 -8
- package/dist/types/src/server/serverClasees/Server_Base.d.ts +0 -9
- package/dist/types/src/server/serverClasees/Server_Docker.d.ts +0 -81
- package/dist/types/src/server/serverClasees/Server_FS.d.ts +0 -0
- package/dist/types/src/server/serverClasees/Server_HTTP.d.ts +0 -20
- package/dist/types/src/server/serverClasees/Server_WS.d.ts +0 -23
- package/dist/types/src/server/serverManagers/DockerManager.d.ts +0 -0
- package/dist/types/src/server/serverManagers/HttpManager.d.ts +0 -9
- package/dist/types/src/server/serverManagers/WsManager.d.ts +0 -10
- package/dist/types/src/server/serverManagers/fs.d.ts +0 -0
- package/dist/types/src/server/serverManagers/tcp.d.ts +0 -27
- package/dist/types/src/server/types.d.ts +0 -68
- package/dist/types/src/testeranto.d.ts +0 -1
- package/dist/types/src/vscode/TerminalManager.d.ts +0 -18
- package/dist/types/src/vscode/TestTreeItem.d.ts +0 -13
- package/dist/types/src/vscode/extension.d.ts +0 -3
- package/dist/types/src/vscode/providers/FeaturesTreeDataProvider.d.ts +0 -17
- package/dist/types/src/vscode/providers/FileTreeDataProvider.d.ts +0 -13
- package/dist/types/src/vscode/providers/ProcessesTreeDataProvider.d.ts +0 -23
- package/dist/types/src/vscode/providers/ResultsTreeDataProvider.d.ts +0 -10
- package/dist/types/src/vscode/providers/TestTreeDataProvider.d.ts +0 -16
- package/dist/types/src/vscode/types.d.ts +0 -14
- package/dist/types/testeranto/testeranto.d.ts +0 -3
- package/dist/types/tsconfig.types.tsbuildinfo +0 -1
- package/dist/vscode/extension.mjs +0 -5116
|
@@ -1,904 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.Server_Docker = void 0;
|
|
7
|
-
const ansi_colors_1 = __importDefault(require("ansi-colors"));
|
|
8
|
-
const child_process_1 = require("child_process");
|
|
9
|
-
const fs_1 = __importDefault(require("fs"));
|
|
10
|
-
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
11
|
-
const path_1 = __importDefault(require("path"));
|
|
12
|
-
const util_1 = require("util");
|
|
13
|
-
const runtimes_1 = require("../../runtimes");
|
|
14
|
-
const docker_1 = require("../runtimes/golang/docker");
|
|
15
|
-
const docker_2 = require("../runtimes/java/docker");
|
|
16
|
-
const docker_3 = require("../runtimes/node/docker");
|
|
17
|
-
const docker_4 = require("../runtimes/python/docker");
|
|
18
|
-
const docker_5 = require("../runtimes/ruby/docker");
|
|
19
|
-
const docker_6 = require("../runtimes/rust/docker");
|
|
20
|
-
const docker_7 = require("../runtimes/web/docker");
|
|
21
|
-
const Server_WS_1 = require("./Server_WS");
|
|
22
|
-
class Server_Docker extends Server_WS_1.Server_WS {
|
|
23
|
-
constructor(configs, mode) {
|
|
24
|
-
super(configs, mode);
|
|
25
|
-
this.logProcesses = new Map();
|
|
26
|
-
}
|
|
27
|
-
BaseCompose(services) {
|
|
28
|
-
return {
|
|
29
|
-
services,
|
|
30
|
-
volumes: {
|
|
31
|
-
node_modules: {
|
|
32
|
-
driver: "local",
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
networks: {
|
|
36
|
-
allTests_network: {
|
|
37
|
-
driver: "bridge",
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
staticTestDockerComposeFile(runtime, container_name, command) {
|
|
43
|
-
// Find the dockerfile path from configs
|
|
44
|
-
let dockerfilePath = '';
|
|
45
|
-
for (const [key, value] of Object.entries(this.configs.runtimes)) {
|
|
46
|
-
if (value.runtime === runtime) {
|
|
47
|
-
dockerfilePath = value.dockerfile;
|
|
48
|
-
break;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
// If no dockerfile found, use a default based on runtime
|
|
52
|
-
if (!dockerfilePath) {
|
|
53
|
-
throw (`[Docker] [staticTestDockerComposeFile] no dockerfile found for ${dockerfilePath}, ${Object.entries(this.configs)}`);
|
|
54
|
-
}
|
|
55
|
-
return {
|
|
56
|
-
build: {
|
|
57
|
-
context: process.cwd(),
|
|
58
|
-
dockerfile: dockerfilePath,
|
|
59
|
-
},
|
|
60
|
-
container_name,
|
|
61
|
-
environment: {
|
|
62
|
-
// NODE_ENV: "production",
|
|
63
|
-
// ...config.env,
|
|
64
|
-
},
|
|
65
|
-
working_dir: "/workspace",
|
|
66
|
-
command: command,
|
|
67
|
-
networks: ["allTests_network"],
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
;
|
|
71
|
-
bddTestDockerComposeFile(runtime, container_name, command) {
|
|
72
|
-
// Find the dockerfile path from configs
|
|
73
|
-
let dockerfilePath = '';
|
|
74
|
-
for (const [key, value] of Object.entries(this.configs.runtimes)) {
|
|
75
|
-
if (value.runtime === runtime) {
|
|
76
|
-
dockerfilePath = value.dockerfile;
|
|
77
|
-
break;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
// If no dockerfile found, use a default based on runtime
|
|
81
|
-
if (!dockerfilePath) {
|
|
82
|
-
throw (`[Docker] [bddTestDockerComposeFile] no dockerfile found for ${dockerfilePath}, ${Object.entries(this.configs)}`);
|
|
83
|
-
}
|
|
84
|
-
const service = {
|
|
85
|
-
build: {
|
|
86
|
-
context: process.cwd(),
|
|
87
|
-
dockerfile: dockerfilePath,
|
|
88
|
-
},
|
|
89
|
-
container_name,
|
|
90
|
-
environment: {
|
|
91
|
-
// NODE_ENV: "production",
|
|
92
|
-
// ...config.env,
|
|
93
|
-
},
|
|
94
|
-
working_dir: "/workspace",
|
|
95
|
-
volumes: [
|
|
96
|
-
`${process.cwd()}/src:/workspace/src`,
|
|
97
|
-
`${process.cwd()}/example:/workspace/example`,
|
|
98
|
-
`${process.cwd()}/dist:/workspace/dist`,
|
|
99
|
-
`${process.cwd()}/testeranto:/workspace/testeranto`,
|
|
100
|
-
],
|
|
101
|
-
command: command,
|
|
102
|
-
networks: ["allTests_network"],
|
|
103
|
-
};
|
|
104
|
-
return service;
|
|
105
|
-
}
|
|
106
|
-
;
|
|
107
|
-
aiderDockerComposeFile(container_name) {
|
|
108
|
-
return {
|
|
109
|
-
build: {
|
|
110
|
-
context: process.cwd(),
|
|
111
|
-
dockerfile: 'aider.Dockerfile',
|
|
112
|
-
},
|
|
113
|
-
container_name,
|
|
114
|
-
environment: {
|
|
115
|
-
// NODE_ENV: "production",
|
|
116
|
-
// ...config.env,
|
|
117
|
-
},
|
|
118
|
-
working_dir: "/workspace",
|
|
119
|
-
command: "aider",
|
|
120
|
-
networks: ["allTests_network"],
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
;
|
|
124
|
-
generateServices(
|
|
125
|
-
// config: IBuiltConfig,
|
|
126
|
-
) {
|
|
127
|
-
const services = {};
|
|
128
|
-
console.log("mark1");
|
|
129
|
-
// // Add browser service
|
|
130
|
-
// services['browser'] = {
|
|
131
|
-
// build:
|
|
132
|
-
// {
|
|
133
|
-
// context: `/Users/adam/Code/testeranto`,
|
|
134
|
-
// dockerfile: `src/server/runtimes/web/web.Dockerfile`
|
|
135
|
-
// },
|
|
136
|
-
// // image: 'browserless/chrome:latest',
|
|
137
|
-
// shm_size: '2gb',
|
|
138
|
-
// // environment: [ "DEFAULT_ARGS=--disable-dev-shm-usage"],
|
|
139
|
-
// container_name: 'browser-allTests',
|
|
140
|
-
// // environment: {
|
|
141
|
-
// // CONNECTION_TIMEOUT: '60000',
|
|
142
|
-
// // MAX_CONCURRENT_SESSIONS: '10',
|
|
143
|
-
// // ENABLE_CORS: 'true',
|
|
144
|
-
// // TOKEN: '',
|
|
145
|
-
// // DEFAULT_ARGS: '--disable-dev-shm-usage'
|
|
146
|
-
// // },
|
|
147
|
-
// ports: [
|
|
148
|
-
// '3000:3000',
|
|
149
|
-
// '9222:9222'
|
|
150
|
-
// ],
|
|
151
|
-
// networks: ["default"],
|
|
152
|
-
// };
|
|
153
|
-
const runTimeToCompose = {
|
|
154
|
-
'node': [docker_3.nodeDockerComposeFile, docker_3.nodeBuildCommand, docker_3.nodeBddCommand],
|
|
155
|
-
'web': [docker_7.webDockerComposeFile, docker_7.webBuildCommand, docker_7.webBddCommand],
|
|
156
|
-
'python': [docker_4.pythonDockerComposeFile, docker_4.pythonBuildCommand, docker_4.pythonBddCommand],
|
|
157
|
-
'golang': [docker_1.golangDockerComposeFile, docker_1.golangBuildCommand, docker_1.golangBddCommand],
|
|
158
|
-
'ruby': [docker_5.rubyDockerComposeFile, docker_5.rubyBuildCommand, docker_5.rubyBddCommand],
|
|
159
|
-
'rust': [docker_6.rustDockerComposeFile, docker_6.rustBuildCommand, docker_6.rustBddCommand],
|
|
160
|
-
"java": [docker_2.javaDockerComposeFile, docker_2.javaBuildCommand, docker_2.javaBddCommand]
|
|
161
|
-
};
|
|
162
|
-
// Iterate through each entry in the config Map
|
|
163
|
-
for (const [runtimeTestsName, runtimeTests] of Object.entries(this.configs.runtimes)) {
|
|
164
|
-
const runtime = runtimeTests.runtime;
|
|
165
|
-
const dockerfile = runtimeTests.dockerfile;
|
|
166
|
-
const buildOptions = runtimeTests.buildOptions;
|
|
167
|
-
const testsObj = runtimeTests.tests;
|
|
168
|
-
// loop over all suites which are of the right runtime
|
|
169
|
-
for (const [t, c] of Object.entries(this.configs.runtimes)) {
|
|
170
|
-
if (c.runtime === runtime) {
|
|
171
|
-
if (runtimes_1.RUN_TIMES.includes(runtime)) {
|
|
172
|
-
const buildCommand = runTimeToCompose[runtime][1](buildOptions, c.buildOptions, runtimeTestsName);
|
|
173
|
-
// Add builder service for this runtime
|
|
174
|
-
const builderServiceName = `${runtime}-builder`;
|
|
175
|
-
// Ensure dockerfile path is valid and exists
|
|
176
|
-
let dockerfilePath = dockerfile;
|
|
177
|
-
const fullDockerfilePath = path_1.default.join(process.cwd(), dockerfilePath);
|
|
178
|
-
if (!fs_1.default.existsSync(fullDockerfilePath)) {
|
|
179
|
-
throw (`[Server_Docker] Dockerfile not found at ${fullDockerfilePath}`);
|
|
180
|
-
}
|
|
181
|
-
services[builderServiceName] = {
|
|
182
|
-
build: {
|
|
183
|
-
context: process.cwd(),
|
|
184
|
-
dockerfile: dockerfilePath,
|
|
185
|
-
},
|
|
186
|
-
container_name: builderServiceName,
|
|
187
|
-
environment: {},
|
|
188
|
-
working_dir: "/workspace",
|
|
189
|
-
volumes: [
|
|
190
|
-
`${process.cwd()}/src:/workspace/src`,
|
|
191
|
-
`${process.cwd()}/example:/workspace/example`,
|
|
192
|
-
`${process.cwd()}/dist:/workspace/dist`,
|
|
193
|
-
`${process.cwd()}/testeranto:/workspace/testeranto`,
|
|
194
|
-
],
|
|
195
|
-
command: buildCommand,
|
|
196
|
-
networks: ["allTests_network"],
|
|
197
|
-
};
|
|
198
|
-
for (const tName of testsObj) {
|
|
199
|
-
// Clean the test name for use in container names
|
|
200
|
-
// Handle numeric test names (like '0') by converting to string
|
|
201
|
-
// const testNameStr = String(testName);
|
|
202
|
-
const cleanTestName = tName.toLowerCase()
|
|
203
|
-
.replaceAll("/", "_")
|
|
204
|
-
.replaceAll(".", "-")
|
|
205
|
-
.replace(/[^a-z0-9_-]/g, '');
|
|
206
|
-
// Generate UID using the runtimeTestsName (e.g., 'nodeTests') and clean test name
|
|
207
|
-
const uid = `${runtimeTestsName.toLowerCase()}-${cleanTestName}`;
|
|
208
|
-
// Add BDD service for this test
|
|
209
|
-
const bddCommandFunc = runTimeToCompose[runtime][2];
|
|
210
|
-
// TODO find filepath
|
|
211
|
-
// const filePath = "testeranto/bundles/allTests/ruby/example/Calculator.test.rb"
|
|
212
|
-
const filePath = `testeranto/bundles/allTests/${runtime}/${tName}`;
|
|
213
|
-
const command = bddCommandFunc(filePath);
|
|
214
|
-
console.log("wtf command", command);
|
|
215
|
-
services[`${uid}-bdd`] = this.bddTestDockerComposeFile(runtime, `${uid}-bdd`, command);
|
|
216
|
-
services[`${uid}-aider`] = this.aiderDockerComposeFile(`${uid}-aider`);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
else {
|
|
220
|
-
throw `unknown runtime ${runtime}`;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
// Ensure all services use the same network configuration
|
|
226
|
-
for (const serviceName in services) {
|
|
227
|
-
if (!services[serviceName].networks) {
|
|
228
|
-
services[serviceName].networks = ["allTests_network"];
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
return services;
|
|
232
|
-
}
|
|
233
|
-
autogenerateStamp(x) {
|
|
234
|
-
return `# This file is autogenerated. Do not edit it directly
|
|
235
|
-
${x}
|
|
236
|
-
`;
|
|
237
|
-
}
|
|
238
|
-
getUpCommand() {
|
|
239
|
-
return `docker compose up -d`;
|
|
240
|
-
}
|
|
241
|
-
getDownCommand() {
|
|
242
|
-
return `docker compose down -v --remove-orphans`;
|
|
243
|
-
}
|
|
244
|
-
getPsCommand() {
|
|
245
|
-
return `docker compose ps`;
|
|
246
|
-
}
|
|
247
|
-
getLogsCommand(serviceName, tail = 100) {
|
|
248
|
-
const base = `docker compose logs --no-color --tail=${tail}`;
|
|
249
|
-
return serviceName ? `${base} ${serviceName}` : base;
|
|
250
|
-
}
|
|
251
|
-
getConfigServicesCommand() {
|
|
252
|
-
return `docker compose config --services`;
|
|
253
|
-
}
|
|
254
|
-
getBuildCommand() {
|
|
255
|
-
return `docker compose build`;
|
|
256
|
-
}
|
|
257
|
-
getStartCommand() {
|
|
258
|
-
return `docker compose start`;
|
|
259
|
-
}
|
|
260
|
-
// private async waitForContainerExists(serviceName: string, maxAttempts: number = 30, delayMs: number = 1000): Promise<boolean> {
|
|
261
|
-
// for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
262
|
-
// try {
|
|
263
|
-
// const cmd = `docker compose -f "testeranto/docker-compose.yml" ps -q ${serviceName}`;
|
|
264
|
-
// const { execSync } = require('child_process');
|
|
265
|
-
// const containerId = execSync(cmd, {
|
|
266
|
-
// // cwd:this.dockerManager.cwd
|
|
267
|
-
// }).toString().trim();
|
|
268
|
-
// if (containerId && containerId.length > 0) {
|
|
269
|
-
// console.log(`[Server_Docker] Container for ${serviceName} exists with ID: ${containerId.substring(0, 12)}`);
|
|
270
|
-
// return true;
|
|
271
|
-
// }
|
|
272
|
-
// } catch (error) {
|
|
273
|
-
// // Container doesn't exist yet or command failed
|
|
274
|
-
// }
|
|
275
|
-
// if (attempt < maxAttempts) {
|
|
276
|
-
// await new Promise(resolve => setTimeout(resolve, delayMs));
|
|
277
|
-
// }
|
|
278
|
-
// }
|
|
279
|
-
// console.warn(`[Server_Docker] Container for ${serviceName} did not appear after ${maxAttempts} attempts`);
|
|
280
|
-
// return false;
|
|
281
|
-
// }
|
|
282
|
-
async startServiceLogging(serviceName, runtime) {
|
|
283
|
-
var _a, _b;
|
|
284
|
-
// Create report directory
|
|
285
|
-
const reportDir = path_1.default.join(process.cwd(), "testeranto", "reports", "allTests", "example", runtime);
|
|
286
|
-
try {
|
|
287
|
-
fs_1.default.mkdirSync(reportDir, { recursive: true });
|
|
288
|
-
}
|
|
289
|
-
catch (error) {
|
|
290
|
-
console.error(`[Server_Docker] Failed to create report directory ${reportDir}: ${error.message}`);
|
|
291
|
-
return;
|
|
292
|
-
}
|
|
293
|
-
const logFilePath = path_1.default.join(reportDir, `${serviceName}.log`);
|
|
294
|
-
const exitCodeFilePath = path_1.default.join(reportDir, `${serviceName}.exitcode`);
|
|
295
|
-
// Start a process to capture logs - use a more robust approach
|
|
296
|
-
// We'll use a shell script that handles waiting for the container
|
|
297
|
-
const logScript = `
|
|
298
|
-
# Wait for container to exist
|
|
299
|
-
for i in {1..30}; do
|
|
300
|
-
if docker compose -f "testeranto/docker-compose.yml" ps -q ${serviceName} > /dev/null 2>&1; then
|
|
301
|
-
break
|
|
302
|
-
fi
|
|
303
|
-
sleep 1
|
|
304
|
-
done
|
|
305
|
-
# Capture logs from the beginning
|
|
306
|
-
docker compose -f "testeranto/docker-compose.yml" logs --no-color -f ${serviceName}
|
|
307
|
-
`;
|
|
308
|
-
console.log(`[Server_Docker] Starting log capture for ${serviceName} to ${logFilePath}`);
|
|
309
|
-
const logStream = fs_1.default.createWriteStream(logFilePath, { flags: 'a' });
|
|
310
|
-
const timestamp = new Date().toISOString();
|
|
311
|
-
logStream.write(`=== Log started at ${timestamp} for service ${serviceName} ===\n\n`);
|
|
312
|
-
const child = (0, child_process_1.spawn)('bash', ['-c', logScript], {
|
|
313
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
314
|
-
// cwd: this.dockerManager.cwd
|
|
315
|
-
});
|
|
316
|
-
// Get container ID for tracking
|
|
317
|
-
let containerId = null;
|
|
318
|
-
try {
|
|
319
|
-
// Try to get container ID, but don't fail if we can't
|
|
320
|
-
const containerIdCmd = `docker compose -f "testeranto/docker-compose.yml" ps -q ${serviceName}`;
|
|
321
|
-
containerId = (0, child_process_1.execSync)(containerIdCmd, {
|
|
322
|
-
// cwd: this.dockerManager.cwd
|
|
323
|
-
}).toString().trim();
|
|
324
|
-
}
|
|
325
|
-
catch (error) {
|
|
326
|
-
console.warn(`[Server_Docker] Could not get container ID for ${serviceName}, will track by service name`);
|
|
327
|
-
}
|
|
328
|
-
(_a = child.stdout) === null || _a === void 0 ? void 0 : _a.on('data', (data) => {
|
|
329
|
-
logStream.write(data);
|
|
330
|
-
});
|
|
331
|
-
(_b = child.stderr) === null || _b === void 0 ? void 0 : _b.on('data', (data) => {
|
|
332
|
-
logStream.write(data);
|
|
333
|
-
});
|
|
334
|
-
child.on('error', (error) => {
|
|
335
|
-
console.error(`[Server_Docker] Log process error for ${serviceName}:`, error);
|
|
336
|
-
logStream.write(`\n=== Log process error: ${error.message} ===\n`);
|
|
337
|
-
logStream.end();
|
|
338
|
-
// Write error exit code
|
|
339
|
-
fs_1.default.writeFileSync(exitCodeFilePath, '-1');
|
|
340
|
-
});
|
|
341
|
-
child.on('close', (code) => {
|
|
342
|
-
const endTimestamp = new Date().toISOString();
|
|
343
|
-
logStream.write(`\n=== Log ended at ${endTimestamp}, process exited with code ${code} ===\n`);
|
|
344
|
-
logStream.end();
|
|
345
|
-
console.log(`[Server_Docker] Log process for ${serviceName} exited with code ${code}`);
|
|
346
|
-
// Write exit code to file
|
|
347
|
-
fs_1.default.writeFileSync(exitCodeFilePath, (code === null || code === void 0 ? void 0 : code.toString()) || '0');
|
|
348
|
-
// Also capture the actual container exit code
|
|
349
|
-
this.captureContainerExitCode(serviceName, reportDir);
|
|
350
|
-
if (containerId) {
|
|
351
|
-
this.logProcesses.delete(containerId);
|
|
352
|
-
}
|
|
353
|
-
else {
|
|
354
|
-
// Remove by service name if we couldn't get container ID
|
|
355
|
-
for (const [id, proc] of this.logProcesses.entries()) {
|
|
356
|
-
if (proc.serviceName === serviceName) {
|
|
357
|
-
this.logProcesses.delete(id);
|
|
358
|
-
break;
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
});
|
|
363
|
-
// Track the process
|
|
364
|
-
const trackingKey = containerId || serviceName;
|
|
365
|
-
this.logProcesses.set(trackingKey, { process: child, serviceName });
|
|
366
|
-
}
|
|
367
|
-
async captureContainerExitCode(serviceName, reportDir) {
|
|
368
|
-
try {
|
|
369
|
-
// Get container ID including stopped containers
|
|
370
|
-
const containerIdCmd = `docker compose -f "testeranto/docker-compose.yml" ps -a -q ${serviceName}`;
|
|
371
|
-
const containerId = (0, child_process_1.execSync)(containerIdCmd, {
|
|
372
|
-
// cwd: this.dockerManager.cwd
|
|
373
|
-
}).toString().trim();
|
|
374
|
-
if (containerId) {
|
|
375
|
-
// Check if container exists and get its exit code
|
|
376
|
-
const inspectCmd = `docker inspect --format='{{.State.ExitCode}}' ${containerId}`;
|
|
377
|
-
const exitCode = (0, child_process_1.execSync)(inspectCmd, {
|
|
378
|
-
// cwd: this.dockerManager.cwd
|
|
379
|
-
}).toString().trim();
|
|
380
|
-
// Write container exit code to a separate file
|
|
381
|
-
const containerExitCodeFilePath = path_1.default.join(reportDir, `${serviceName}.container.exitcode`);
|
|
382
|
-
fs_1.default.writeFileSync(containerExitCodeFilePath, exitCode);
|
|
383
|
-
console.log(`[Server_Docker] Container ${serviceName} (${containerId.substring(0, 12)}) exited with code ${exitCode}`);
|
|
384
|
-
// Also capture the container's status
|
|
385
|
-
const statusCmd = `docker inspect --format='{{.State.Status}}' ${containerId}`;
|
|
386
|
-
const status = (0, child_process_1.execSync)(statusCmd, {
|
|
387
|
-
// cwd: this.dockerManager.cwd
|
|
388
|
-
}).toString().trim();
|
|
389
|
-
const statusFilePath = path_1.default.join(reportDir, `${serviceName}.container.status`);
|
|
390
|
-
fs_1.default.writeFileSync(statusFilePath, status);
|
|
391
|
-
}
|
|
392
|
-
else {
|
|
393
|
-
console.debug(`[Server_Docker] No container found for service ${serviceName}`);
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
catch (error) {
|
|
397
|
-
// Container might not exist anymore, which is fine
|
|
398
|
-
console.debug(`[Server_Docker] Could not capture container exit code for ${serviceName}: ${error.message}`);
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
async start() {
|
|
402
|
-
console.log(`[Server_Docker] start()`);
|
|
403
|
-
super.start();
|
|
404
|
-
await this.setupDockerCompose();
|
|
405
|
-
// Ensure base reports directory exists
|
|
406
|
-
const baseReportsDir = path_1.default.join(process.cwd(), "testeranto", "reports");
|
|
407
|
-
try {
|
|
408
|
-
fs_1.default.mkdirSync(baseReportsDir, { recursive: true });
|
|
409
|
-
console.log(`[Server_Docker] Created base reports directory: ${baseReportsDir}`);
|
|
410
|
-
}
|
|
411
|
-
catch (error) {
|
|
412
|
-
console.error(`[Server_Docker] Failed to create base reports directory ${baseReportsDir}: ${error.message}`);
|
|
413
|
-
}
|
|
414
|
-
console.log(`[Server_Docker] Dropping everything...`);
|
|
415
|
-
try {
|
|
416
|
-
const downCmd = `docker compose -f "testeranto/docker-compose.yml" down -v --remove-orphans`;
|
|
417
|
-
console.log(`[Server_Docker] Running: ${downCmd}`);
|
|
418
|
-
await this.spawnPromise(downCmd);
|
|
419
|
-
console.log(`[Server_Docker] Docker compose down completed`);
|
|
420
|
-
}
|
|
421
|
-
catch (error) {
|
|
422
|
-
console.log(`[Server_Docker] Docker compose down noted: ${error.message}`);
|
|
423
|
-
}
|
|
424
|
-
// Start builder services
|
|
425
|
-
for (const runtime of runtimes_1.RUN_TIMES) {
|
|
426
|
-
const serviceName = `${runtime}-builder`;
|
|
427
|
-
console.log(`[Server_Docker] Starting builder service: ${serviceName}`);
|
|
428
|
-
try {
|
|
429
|
-
await this.spawnPromise(`docker compose -f "testeranto/docker-compose.yml" up -d ${serviceName}`);
|
|
430
|
-
this.startServiceLogging(serviceName, runtime)
|
|
431
|
-
.catch(error => console.error(`[Server_Docker] Failed to start logging for ${serviceName}:`, error));
|
|
432
|
-
this.captureExistingLogs(serviceName, runtime);
|
|
433
|
-
}
|
|
434
|
-
catch (error) {
|
|
435
|
-
console.error(`[Server_Docker] Failed to start ${serviceName}: ${error.message}`);
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
// Start browser service
|
|
439
|
-
console.log(`[Server_Docker] Starting browser service...`);
|
|
440
|
-
try {
|
|
441
|
-
await this.spawnPromise(`docker compose -f "testeranto/docker-compose.yml" up -d browser`);
|
|
442
|
-
}
|
|
443
|
-
catch (error) {
|
|
444
|
-
console.error(`[Server_Docker] Failed to start browser service: ${error.message}`);
|
|
445
|
-
}
|
|
446
|
-
// Wait for browser service to be healthy before starting web BDD services
|
|
447
|
-
console.log(`[Server_Docker] Waiting for browser container to be healthy...`);
|
|
448
|
-
await this.waitForContainerHealthy('browser-allTests', 60000); // 60 seconds max
|
|
449
|
-
// Start aider services
|
|
450
|
-
for (const [configKey, configValue] of Object.entries(this.configs.runtimes)) {
|
|
451
|
-
const runtime = configValue.runtime;
|
|
452
|
-
// const testsObj = configValue[3];
|
|
453
|
-
const tests = configValue.tests;
|
|
454
|
-
console.log(`[Server_Docker] Found tests for ${runtime}:`, (JSON.stringify(tests)));
|
|
455
|
-
for (const testName of tests) {
|
|
456
|
-
// Generate the UID exactly as DockerManager does
|
|
457
|
-
const uid = `${configKey}-${testName.toLowerCase().replaceAll("/", "_").replaceAll(".", "-")}`;
|
|
458
|
-
const aiderServiceName = `${uid}-aider`;
|
|
459
|
-
console.log(`[Server_Docker] Starting aider service: ${aiderServiceName} for test ${testName}`);
|
|
460
|
-
try {
|
|
461
|
-
await this.spawnPromise(`docker compose -f "testeranto/docker-compose.yml" up -d ${aiderServiceName}`);
|
|
462
|
-
// Start logging for aider services
|
|
463
|
-
this.startServiceLogging(aiderServiceName, runtime)
|
|
464
|
-
.catch(error => console.error(`[Server_Docker] Failed to start logging for ${aiderServiceName}:`, error));
|
|
465
|
-
this.captureExistingLogs(aiderServiceName, runtime)
|
|
466
|
-
.catch(error => console.error(`[Server_Docker] Failed to capture existing logs for ${aiderServiceName}:`, error));
|
|
467
|
-
}
|
|
468
|
-
catch (error) {
|
|
469
|
-
console.error(`[Server_Docker] Failed to start ${aiderServiceName}: ${error.message}`);
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
// Start BDD test services
|
|
474
|
-
// TODO these logs from these services should be saved into reports
|
|
475
|
-
for (const [configKey, configValue] of Object.entries(this.configs.runtimes)) {
|
|
476
|
-
const runtime = configValue.runtime;
|
|
477
|
-
// const testsObj = configValue[3];
|
|
478
|
-
const tests = configValue.tests;
|
|
479
|
-
console.log(`[Server_Docker] Found tests for ${runtime}:`, (JSON.stringify(tests)));
|
|
480
|
-
// const runtime = configValue[0];
|
|
481
|
-
// const testsObj = configValue[3];
|
|
482
|
-
// const tests = testsObj?.tests || {};
|
|
483
|
-
for (const testName of tests) {
|
|
484
|
-
const uid = `${configKey}-${testName.toLowerCase().replaceAll("/", "_").replaceAll(".", "-")}`;
|
|
485
|
-
const bddServiceName = `${uid}-bdd`;
|
|
486
|
-
console.log(`[Server_Docker] Starting BDD service: ${bddServiceName}, ${configKey}, ${configValue}`);
|
|
487
|
-
try {
|
|
488
|
-
// Start the service
|
|
489
|
-
await this.spawnPromise(`docker compose -f "testeranto/docker-compose.yml" up -d ${bddServiceName}`);
|
|
490
|
-
// Immediately start logging in the background
|
|
491
|
-
// Don't wait for it to complete
|
|
492
|
-
this.startServiceLogging(bddServiceName, runtime)
|
|
493
|
-
.catch(error => console.error(`[Server_Docker] Failed to start logging for ${bddServiceName}:`, error));
|
|
494
|
-
// Also capture any existing logs from the container (in case it already produced output)
|
|
495
|
-
this.captureExistingLogs(bddServiceName, runtime)
|
|
496
|
-
.catch(error => console.error(`[Server_Docker] Failed to capture existing logs for ${bddServiceName}:`, error));
|
|
497
|
-
}
|
|
498
|
-
catch (error) {
|
|
499
|
-
console.error(`[Server_Docker] Failed to start ${bddServiceName}: ${error.message}`);
|
|
500
|
-
// Even if starting failed, try to capture any logs that might exist
|
|
501
|
-
this.captureExistingLogs(bddServiceName, runtime)
|
|
502
|
-
.catch(err => console.error(`[Server_Docker] Also failed to capture logs:`, err));
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
// Start static test services
|
|
507
|
-
// TODO these logs from these services should be saved into reports
|
|
508
|
-
for (const [configKey, configValue] of Object.entries(this.configs)) {
|
|
509
|
-
const runtime = configValue[0];
|
|
510
|
-
const testsObj = configValue[3];
|
|
511
|
-
const tests = (testsObj === null || testsObj === void 0 ? void 0 : testsObj.tests) || {};
|
|
512
|
-
for (const testName in tests) {
|
|
513
|
-
const uid = `${configKey}-${testName.toLowerCase().replaceAll("/", "_").replaceAll(".", "-")}`;
|
|
514
|
-
const checks = (testsObj === null || testsObj === void 0 ? void 0 : testsObj.checks) || [];
|
|
515
|
-
for (let i = 0; i < checks.length; i++) {
|
|
516
|
-
const staticServiceName = `${uid}-static-${i}`;
|
|
517
|
-
console.log(`[Server_Docker] Starting static test service: ${staticServiceName}`);
|
|
518
|
-
try {
|
|
519
|
-
await this.spawnPromise(`docker compose -f "testeranto/docker-compose.yml" up -d ${staticServiceName}`);
|
|
520
|
-
// Start logging for this service
|
|
521
|
-
this.startServiceLogging(staticServiceName, runtime)
|
|
522
|
-
.catch(error => console.error(`[Server_Docker] Failed to start logging for ${staticServiceName}:`, error));
|
|
523
|
-
// Also capture any existing logs
|
|
524
|
-
this.captureExistingLogs(staticServiceName, runtime)
|
|
525
|
-
.catch(error => console.error(`[Server_Docker] Failed to capture existing logs for ${staticServiceName}:`, error));
|
|
526
|
-
}
|
|
527
|
-
catch (error) {
|
|
528
|
-
console.error(`[Server_Docker] Failed to start ${staticServiceName}: ${error.message}`);
|
|
529
|
-
// Try to capture logs even if starting failed
|
|
530
|
-
this.captureExistingLogs(staticServiceName, runtime)
|
|
531
|
-
.catch(err => console.error(`[Server_Docker] Also failed to capture logs:`, err));
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
async captureExistingLogs(serviceName, runtime) {
|
|
538
|
-
// Create report directory
|
|
539
|
-
const reportDir = path_1.default.join(process.cwd(), "testeranto", "reports", "allTests", "example", runtime);
|
|
540
|
-
try {
|
|
541
|
-
fs_1.default.mkdirSync(reportDir, { recursive: true });
|
|
542
|
-
}
|
|
543
|
-
catch (error) {
|
|
544
|
-
console.error(`[Server_Docker] Failed to create report directory ${reportDir}: ${error.message}`);
|
|
545
|
-
return;
|
|
546
|
-
}
|
|
547
|
-
const logFilePath = path_1.default.join(reportDir, `${serviceName}.log`);
|
|
548
|
-
try {
|
|
549
|
-
// First, check if the container exists (including stopped ones)
|
|
550
|
-
const checkCmd = `docker compose -f "testeranto/docker-compose.yml" ps -a -q ${serviceName}`;
|
|
551
|
-
const containerId = (0, child_process_1.execSync)(checkCmd, {
|
|
552
|
-
// cwd: this.dockerManager.cwd,
|
|
553
|
-
encoding: 'utf-8'
|
|
554
|
-
}).toString().trim();
|
|
555
|
-
if (!containerId) {
|
|
556
|
-
console.debug(`[Server_Docker] No container found for service ${serviceName}`);
|
|
557
|
-
return;
|
|
558
|
-
}
|
|
559
|
-
// Get existing logs from the container
|
|
560
|
-
const cmd = `docker compose -f "testeranto/docker-compose.yml" logs --no-color ${serviceName} 2>/dev/null || true`;
|
|
561
|
-
const existingLogs = (0, child_process_1.execSync)(cmd, {
|
|
562
|
-
// cwd: this.dockerManager.cwd,
|
|
563
|
-
encoding: 'utf-8',
|
|
564
|
-
maxBuffer: 10 * 1024 * 1024 // 10MB
|
|
565
|
-
});
|
|
566
|
-
if (existingLogs && existingLogs.trim().length > 0) {
|
|
567
|
-
// Append to the log file
|
|
568
|
-
fs_1.default.appendFileSync(logFilePath, existingLogs);
|
|
569
|
-
console.log(`[Server_Docker] Captured ${existingLogs.length} bytes of existing logs for ${serviceName}`);
|
|
570
|
-
}
|
|
571
|
-
// Also try to capture the container exit code if it has exited
|
|
572
|
-
this.captureContainerExitCode(serviceName, reportDir);
|
|
573
|
-
}
|
|
574
|
-
catch (error) {
|
|
575
|
-
// It's okay if this fails - the container might not exist yet
|
|
576
|
-
console.debug(`[Server_Docker] No existing logs for ${serviceName}: ${error.message}`);
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
async waitForContainerHealthy(containerName, timeoutMs) {
|
|
580
|
-
const startTime = Date.now();
|
|
581
|
-
const checkInterval = 2000; // Check every 2 seconds
|
|
582
|
-
// while (Date.now() - startTime < timeoutMs) {
|
|
583
|
-
// try {
|
|
584
|
-
// // Use docker inspect to check container health status
|
|
585
|
-
// const cmd = `docker inspect --format="{{.State.Health.Status}}" ${containerName}`;
|
|
586
|
-
// const { exec } = require('child_process');
|
|
587
|
-
// const { promisify } = require('util');
|
|
588
|
-
// const execAsync = promisify(exec);
|
|
589
|
-
// const { stdout, stderr } = await execAsync(cmd);
|
|
590
|
-
// const healthStatus = stdout.trim();
|
|
591
|
-
// if (healthStatus === 'healthy') {
|
|
592
|
-
// console.log(`[Server_Docker] Container ${containerName} is healthy`);
|
|
593
|
-
// return;
|
|
594
|
-
// } else if (healthStatus === 'unhealthy') {
|
|
595
|
-
// throw new Error(`Container ${containerName} is unhealthy`);
|
|
596
|
-
// } else {
|
|
597
|
-
// console.log(`[Server_Docker] Container ${containerName} health status: ${healthStatus}`);
|
|
598
|
-
// }
|
|
599
|
-
// } catch (error: any) {
|
|
600
|
-
// // Container might not exist yet or command failed
|
|
601
|
-
// console.log(`[Server_Docker] Waiting for container ${containerName} to be healthy...`);
|
|
602
|
-
// }
|
|
603
|
-
// // Wait before checking again
|
|
604
|
-
// await new Promise(resolve => setTimeout(resolve, checkInterval));
|
|
605
|
-
// }
|
|
606
|
-
// throw new Error(`Timeout waiting for container ${containerName} to become healthy`);
|
|
607
|
-
}
|
|
608
|
-
async stop() {
|
|
609
|
-
console.log(`[Server_Docker] stop()`);
|
|
610
|
-
// Stop all log processes first
|
|
611
|
-
for (const [containerId, logProcess] of this.logProcesses.entries()) {
|
|
612
|
-
try {
|
|
613
|
-
logProcess.process.kill('SIGTERM');
|
|
614
|
-
console.log(`[Server_Docker] Stopped log process for container ${containerId} (${logProcess.serviceName})`);
|
|
615
|
-
}
|
|
616
|
-
catch (error) {
|
|
617
|
-
console.error(`[Server_Docker] Error stopping log process for ${containerId}:`, error);
|
|
618
|
-
}
|
|
619
|
-
}
|
|
620
|
-
this.logProcesses.clear();
|
|
621
|
-
const result = await this.DC_down();
|
|
622
|
-
if (result.exitCode !== 0) {
|
|
623
|
-
console.error(`Docker Compose down failed: ${result.err}`);
|
|
624
|
-
}
|
|
625
|
-
super.stop();
|
|
626
|
-
}
|
|
627
|
-
async setupDockerCompose() {
|
|
628
|
-
// First, ensure all necessary directories exist
|
|
629
|
-
const composeDir = path_1.default.join(process.cwd(), "testeranto", "bundles");
|
|
630
|
-
try {
|
|
631
|
-
// Setup directories
|
|
632
|
-
fs_1.default.mkdirSync(composeDir, { recursive: true });
|
|
633
|
-
// Generate Dockerfiles for each runtime
|
|
634
|
-
// Note: runtimes needs to be defined - we'll get it from config
|
|
635
|
-
// const runtimes: IRunTime[] = ["node", "web", "golang", "python", "ruby"];
|
|
636
|
-
// deprecated
|
|
637
|
-
// this.generateRuntimeDockerfiles(config, runtimes, composeDir, log, error);
|
|
638
|
-
const services = this.generateServices(
|
|
639
|
-
// config,
|
|
640
|
-
);
|
|
641
|
-
this.writeComposeFile(services);
|
|
642
|
-
}
|
|
643
|
-
catch (err) {
|
|
644
|
-
console.error(`Error in setupDockerCompose:`, err);
|
|
645
|
-
throw err;
|
|
646
|
-
}
|
|
647
|
-
}
|
|
648
|
-
writeComposeFile(services) {
|
|
649
|
-
const dockerComposeFileContents = this.BaseCompose(services);
|
|
650
|
-
fs_1.default.writeFileSync('testeranto/docker-compose.yml', js_yaml_1.default.dump(dockerComposeFileContents, {
|
|
651
|
-
lineWidth: -1,
|
|
652
|
-
noRefs: true,
|
|
653
|
-
}));
|
|
654
|
-
}
|
|
655
|
-
async exec(cmd, options) {
|
|
656
|
-
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
657
|
-
return execAsync(cmd, { cwd: options.cwd });
|
|
658
|
-
}
|
|
659
|
-
spawnPromise(command) {
|
|
660
|
-
return new Promise((resolve, reject) => {
|
|
661
|
-
console.log(`[spawnPromise] Executing: ${command}`);
|
|
662
|
-
// Use shell: true to let the shell handle command parsing (including quotes)
|
|
663
|
-
const child = (0, child_process_1.spawn)(command, {
|
|
664
|
-
stdio: 'inherit',
|
|
665
|
-
shell: true,
|
|
666
|
-
// cwd: this.dockerManager.cwd
|
|
667
|
-
});
|
|
668
|
-
child.on('error', (error) => {
|
|
669
|
-
console.error(`[spawnPromise] Failed to start process: ${error.message}`);
|
|
670
|
-
reject(error);
|
|
671
|
-
});
|
|
672
|
-
child.on('close', (code) => {
|
|
673
|
-
if (code === 0) {
|
|
674
|
-
console.log(`[spawnPromise] Process completed successfully`);
|
|
675
|
-
resolve(code);
|
|
676
|
-
}
|
|
677
|
-
else {
|
|
678
|
-
console.error(`[spawnPromise] Process exited with code ${code}`);
|
|
679
|
-
reject(new Error(`Process exited with code ${code}`));
|
|
680
|
-
}
|
|
681
|
-
});
|
|
682
|
-
});
|
|
683
|
-
}
|
|
684
|
-
async DC_upAll() {
|
|
685
|
-
try {
|
|
686
|
-
const cmd = this.getUpCommand();
|
|
687
|
-
await this.spawnPromise(cmd);
|
|
688
|
-
return {
|
|
689
|
-
exitCode: 0,
|
|
690
|
-
out: '',
|
|
691
|
-
err: '',
|
|
692
|
-
data: null,
|
|
693
|
-
};
|
|
694
|
-
}
|
|
695
|
-
catch (error) {
|
|
696
|
-
console.error(`[Docker] docker compose up ❌ ${ansi_colors_1.default.bgBlue(error.message.replaceAll('\\n', '\n'))}`);
|
|
697
|
-
return {
|
|
698
|
-
exitCode: 1,
|
|
699
|
-
out: '',
|
|
700
|
-
err: `Error starting services: ${error.message}`,
|
|
701
|
-
data: null,
|
|
702
|
-
};
|
|
703
|
-
}
|
|
704
|
-
}
|
|
705
|
-
async DC_down() {
|
|
706
|
-
try {
|
|
707
|
-
const cmd = this.getDownCommand();
|
|
708
|
-
await this.spawnPromise(cmd);
|
|
709
|
-
return {
|
|
710
|
-
exitCode: 0,
|
|
711
|
-
out: "",
|
|
712
|
-
err: "",
|
|
713
|
-
data: null,
|
|
714
|
-
};
|
|
715
|
-
}
|
|
716
|
-
catch (error) {
|
|
717
|
-
console.log(`[DC_down] Error during down: ${error.message}`);
|
|
718
|
-
return {
|
|
719
|
-
exitCode: 1,
|
|
720
|
-
out: "",
|
|
721
|
-
err: `Error stopping services: ${error.message}`,
|
|
722
|
-
data: null,
|
|
723
|
-
};
|
|
724
|
-
}
|
|
725
|
-
}
|
|
726
|
-
async DC_ps() {
|
|
727
|
-
try {
|
|
728
|
-
const cmd = this.getPsCommand();
|
|
729
|
-
const { stdout, stderr } = await this.exec(cmd, {
|
|
730
|
-
// cwd: this.dockerManager.cwd
|
|
731
|
-
});
|
|
732
|
-
return {
|
|
733
|
-
exitCode: 0,
|
|
734
|
-
out: stdout,
|
|
735
|
-
err: stderr,
|
|
736
|
-
data: null,
|
|
737
|
-
};
|
|
738
|
-
}
|
|
739
|
-
catch (error) {
|
|
740
|
-
return {
|
|
741
|
-
exitCode: 1,
|
|
742
|
-
out: "",
|
|
743
|
-
err: `Error getting service status: ${error.message}`,
|
|
744
|
-
data: null,
|
|
745
|
-
};
|
|
746
|
-
}
|
|
747
|
-
}
|
|
748
|
-
async DC_logs(serviceName, options) {
|
|
749
|
-
var _a;
|
|
750
|
-
const tail = (_a = options === null || options === void 0 ? void 0 : options.tail) !== null && _a !== void 0 ? _a : 100;
|
|
751
|
-
try {
|
|
752
|
-
const cmd = this.getLogsCommand(serviceName, tail);
|
|
753
|
-
const { stdout, stderr } = await this.exec(cmd, {
|
|
754
|
-
// cwd: this.dockerManager.cwd
|
|
755
|
-
});
|
|
756
|
-
return {
|
|
757
|
-
exitCode: 0,
|
|
758
|
-
out: stdout,
|
|
759
|
-
err: stderr,
|
|
760
|
-
data: null,
|
|
761
|
-
};
|
|
762
|
-
}
|
|
763
|
-
catch (error) {
|
|
764
|
-
return {
|
|
765
|
-
exitCode: 1,
|
|
766
|
-
out: "",
|
|
767
|
-
err: `Error getting logs for ${serviceName}: ${error.message}`,
|
|
768
|
-
data: null,
|
|
769
|
-
};
|
|
770
|
-
}
|
|
771
|
-
}
|
|
772
|
-
async DC_configServices() {
|
|
773
|
-
try {
|
|
774
|
-
const cmd = this.getConfigServicesCommand();
|
|
775
|
-
const { stdout, stderr } = await this.exec(cmd, {
|
|
776
|
-
// cwd: this.dockerManager.cwd
|
|
777
|
-
});
|
|
778
|
-
return {
|
|
779
|
-
exitCode: 0,
|
|
780
|
-
out: stdout,
|
|
781
|
-
err: stderr,
|
|
782
|
-
data: null,
|
|
783
|
-
};
|
|
784
|
-
}
|
|
785
|
-
catch (error) {
|
|
786
|
-
return {
|
|
787
|
-
exitCode: 1,
|
|
788
|
-
out: "",
|
|
789
|
-
err: `Error getting services from config: ${error.message}`,
|
|
790
|
-
data: null,
|
|
791
|
-
};
|
|
792
|
-
}
|
|
793
|
-
}
|
|
794
|
-
async DC_start() {
|
|
795
|
-
try {
|
|
796
|
-
const startCommand = this.getStartCommand();
|
|
797
|
-
await this.spawnPromise(startCommand);
|
|
798
|
-
return {
|
|
799
|
-
exitCode: 0,
|
|
800
|
-
data: null,
|
|
801
|
-
};
|
|
802
|
-
}
|
|
803
|
-
catch (error) {
|
|
804
|
-
console.error(`[Docker] docker compose start ❌ ${ansi_colors_1.default.bgBlue(error.message.replaceAll('\\n', '\n'))}`);
|
|
805
|
-
return {
|
|
806
|
-
exitCode: 1,
|
|
807
|
-
data: null,
|
|
808
|
-
};
|
|
809
|
-
}
|
|
810
|
-
}
|
|
811
|
-
async DC_build() {
|
|
812
|
-
try {
|
|
813
|
-
const buildCommand = this.getBuildCommand();
|
|
814
|
-
await this.spawnPromise(buildCommand);
|
|
815
|
-
console.log(`[DC_build] Build completed successfully`);
|
|
816
|
-
return {
|
|
817
|
-
exitCode: 0,
|
|
818
|
-
out: '',
|
|
819
|
-
err: '',
|
|
820
|
-
data: null,
|
|
821
|
-
};
|
|
822
|
-
}
|
|
823
|
-
catch (error) {
|
|
824
|
-
console.error(`[Docker] docker-compose build ❌ ${ansi_colors_1.default.bgBlue(error.message.replaceAll('\\n', '\n'))}`);
|
|
825
|
-
return {
|
|
826
|
-
exitCode: 1,
|
|
827
|
-
out: '',
|
|
828
|
-
err: `Error building services: ${error.message}`,
|
|
829
|
-
data: null,
|
|
830
|
-
};
|
|
831
|
-
}
|
|
832
|
-
}
|
|
833
|
-
getProcessSummary() {
|
|
834
|
-
console.log(`[Server_Docker] getProcessSummary called`);
|
|
835
|
-
try {
|
|
836
|
-
// Get running containers
|
|
837
|
-
const output = (0, child_process_1.execSync)('docker ps --format "{{.Names}}|{{.Image}}|{{.Status}}|{{.Ports}}|{{.State}}|{{.Command}}"').toString();
|
|
838
|
-
const processes = output.trim().split('\n').filter(line => line.trim()).map(line => {
|
|
839
|
-
const parts = line.split('|');
|
|
840
|
-
const [name, image, status, ports, state, command] = parts;
|
|
841
|
-
// Try to get exit code for stopped containers
|
|
842
|
-
let exitCode = null;
|
|
843
|
-
try {
|
|
844
|
-
// Check if container exists (including stopped ones)
|
|
845
|
-
const inspectCmd = `docker inspect --format='{{.State.ExitCode}}' ${name} 2>/dev/null || echo ""`;
|
|
846
|
-
const exitCodeStr = (0, child_process_1.execSync)(inspectCmd).toString().trim();
|
|
847
|
-
if (exitCodeStr !== '') {
|
|
848
|
-
exitCode = parseInt(exitCodeStr, 10);
|
|
849
|
-
// Only include exit code if container is not running
|
|
850
|
-
if (state === 'running') {
|
|
851
|
-
exitCode = null;
|
|
852
|
-
}
|
|
853
|
-
}
|
|
854
|
-
}
|
|
855
|
-
catch (error) {
|
|
856
|
-
// Container might not exist, which is fine
|
|
857
|
-
}
|
|
858
|
-
return {
|
|
859
|
-
processId: name,
|
|
860
|
-
command: command || image,
|
|
861
|
-
image: image,
|
|
862
|
-
timestamp: new Date().toISOString(),
|
|
863
|
-
status: status,
|
|
864
|
-
state: state,
|
|
865
|
-
ports: ports,
|
|
866
|
-
exitCode: exitCode,
|
|
867
|
-
// Add additional fields that might be useful for the frontend
|
|
868
|
-
runtime: this.getRuntimeFromName(name),
|
|
869
|
-
health: 'unknown' // We could add health check status here
|
|
870
|
-
};
|
|
871
|
-
});
|
|
872
|
-
return {
|
|
873
|
-
processes: processes,
|
|
874
|
-
total: processes.length,
|
|
875
|
-
timestamp: new Date().toISOString()
|
|
876
|
-
};
|
|
877
|
-
}
|
|
878
|
-
catch (error) {
|
|
879
|
-
console.error(`[Server_Docker] Error getting docker processes: ${error.message}`);
|
|
880
|
-
return {
|
|
881
|
-
processes: [],
|
|
882
|
-
total: 0,
|
|
883
|
-
timestamp: new Date().toISOString(),
|
|
884
|
-
error: error.message
|
|
885
|
-
};
|
|
886
|
-
}
|
|
887
|
-
}
|
|
888
|
-
getRuntimeFromName(name) {
|
|
889
|
-
if (name.includes('node'))
|
|
890
|
-
return 'node';
|
|
891
|
-
if (name.includes('web'))
|
|
892
|
-
return 'web';
|
|
893
|
-
if (name.includes('golang'))
|
|
894
|
-
return 'golang';
|
|
895
|
-
if (name.includes('python'))
|
|
896
|
-
return 'python';
|
|
897
|
-
if (name.includes('ruby'))
|
|
898
|
-
return 'ruby';
|
|
899
|
-
if (name.includes('browser'))
|
|
900
|
-
return 'browser';
|
|
901
|
-
return 'unknown';
|
|
902
|
-
}
|
|
903
|
-
}
|
|
904
|
-
exports.Server_Docker = Server_Docker;
|