#include "tests.h" #include "ssb.h" #include #include #include #include static void _test_nop(const char* exe_path) { FILE* file = fopen("out/test.js", "w"); fprintf(file, "print('hi');"); fclose(file); char command[256]; snprintf(command, sizeof(command), "%s run --ssb-port=0 -s out/test.js", exe_path); printf("%s\n", command); int result = system(command); assert(WIFEXITED(result)); assert(WEXITSTATUS(result) == 0); } static void _test_child(const char* exe_path) { FILE* file = fopen("out/test.js", "w"); fprintf(file, "var task = new Task();\n" "task.onExit = function() {\n" " print('child exited');\n" "};\n" "task.activate();\n" "task.execute({name: 'child.js', source: utf8Decode(File.readFile('out/child.js'))}).then(function() {\n" " print('child started');\n" "});"); fclose(file); file = fopen("out/child.js", "w"); fprintf(file, "print('I am the child process.');\n" "exit(0);\n"); fclose(file); char command[256]; snprintf(command, sizeof(command), "%s run --ssb-port=0 -s out/test.js", exe_path); printf("%s\n", command); int result = system(command); assert(WIFEXITED(result)); assert(WEXITSTATUS(result) == 0); unlink("out/test.js"); unlink("out/child.js"); } static void _test_promise(const char* exe_path) { FILE* file = fopen("out/test.js", "w"); fprintf(file, "var task = new Task();\n" "task.activate();\n" "task.execute({name: 'child.js', source: utf8Decode(File.readFile('out/child.js'))}).then(function() {\n" " task.getExports().then(function(exports) {\n" " return exports.add(1, 1);\n" " }).then(function(sum) {\n" " if (sum == 2) {\n" " exit(0);\n" " } else {\n" " exit(1);\n" " }\n" " });\n" "});\n"); fclose(file); file = fopen("out/child.js", "w"); fprintf(file, "exports = {\n" " add: function(left, right) {\n" " return left + right;\n" " }\n" "}\n"); fclose(file); char command[256]; snprintf(command, sizeof(command), "%s run --ssb-port=0 -s out/test.js", exe_path); printf("%s\n", command); int result = system(command); assert(WIFEXITED(result)); assert(WEXITSTATUS(result) == 0); unlink("out/test.js"); unlink("out/child.js"); } static void _test_promise_remote_throw(const char* exe_path) { FILE* file = fopen("out/test.js", "w"); fprintf(file, "var task = new Task();\n" "task.activate();\n" "task.execute({name: 'child.js', source: utf8Decode(File.readFile('out/child.js'))}).then(function() {\n" " task.getExports().then(function(exp) {\n" " return exp.add(1, 1);\n" " }).then(function(sum) {\n" " exit(1);\n" " }).catch(function(error) {\n" " print('Caught: ' + error.message);\n" " if (error.stack) {\n" " print('stack: ' + error.stack);\n" " }\n" " exit(0);\n" " });\n" "}).catch(function(e) {\n" " print('caught', e.message);\n" "});\n"); fclose(file); file = fopen("out/child.js", "w"); fprintf(file, "exports = {\n" " add: function(left, right) {\n" " throw new Error('fail');\n" " }\n" "}\n"); fclose(file); char command[256]; snprintf(command, sizeof(command), "%s run --ssb-port=0 -s out/test.js", exe_path); printf("%s\n", command); int result = system(command); assert(WIFEXITED(result)); assert(WEXITSTATUS(result) == 0); unlink("out/test.js"); unlink("out/child.js"); } void tf_tests(const char* exe_path) { tf_ssb_test(); _test_nop(exe_path); _test_child(exe_path); _test_promise(exe_path); _test_promise_remote_throw(exe_path); printf("Tests completed.\n"); }