2021-08-19 15:29:37 -04:00
|
|
|
#include "tests.h"
|
|
|
|
|
2023-03-07 12:50:17 -05:00
|
|
|
#include "log.h"
|
2022-06-04 13:04:51 -04:00
|
|
|
#include "mem.h"
|
2021-09-06 14:23:22 -04:00
|
|
|
#include "ssb.tests.h"
|
2021-08-19 15:29:37 -04:00
|
|
|
|
|
|
|
#include <assert.h>
|
2021-09-06 14:23:22 -04:00
|
|
|
#include <stdbool.h>
|
2021-08-19 15:29:37 -04:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
2021-09-06 14:23:22 -04:00
|
|
|
#include <string.h>
|
2021-08-19 15:29:37 -04:00
|
|
|
#include <unistd.h>
|
|
|
|
|
2022-05-16 18:30:14 -04:00
|
|
|
#if defined(_WIN32)
|
|
|
|
#define WIFEXITED(x) 1
|
|
|
|
#define WEXITSTATUS(x) (x)
|
|
|
|
#endif
|
|
|
|
|
2023-11-07 22:36:08 -05:00
|
|
|
#if defined(__OpenBSD__)
|
|
|
|
#include <sys/wait.h>
|
|
|
|
#endif
|
|
|
|
|
2023-10-11 20:29:17 -04:00
|
|
|
#if defined(__APPLE__)
|
|
|
|
#include <TargetConditionals.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if !TARGET_OS_IPHONE
|
2021-09-06 14:23:22 -04:00
|
|
|
static void _test_nop(const tf_test_options_t* options)
|
2021-08-19 15:29:37 -04:00
|
|
|
{
|
|
|
|
FILE* file = fopen("out/test.js", "w");
|
|
|
|
fprintf(file, "print('hi');");
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
char command[256];
|
2022-10-14 08:27:34 -04:00
|
|
|
snprintf(command, sizeof(command), "%s run --ssb-port=0 --db-path=:memory: -s out/test.js", options->exe_path);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("%s\n", command);
|
2021-08-19 15:29:37 -04:00
|
|
|
int result = system(command);
|
2021-08-22 13:38:20 -04:00
|
|
|
(void)result;
|
2021-08-19 15:29:37 -04:00
|
|
|
assert(WIFEXITED(result));
|
|
|
|
assert(WEXITSTATUS(result) == 0);
|
|
|
|
}
|
|
|
|
|
2021-09-06 14:23:22 -04:00
|
|
|
static void _test_child(const tf_test_options_t* options)
|
2021-08-19 15:29:37 -04:00
|
|
|
{
|
|
|
|
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"
|
2021-10-10 18:45:24 -04:00
|
|
|
"File.readFile('out/child.js').then(function(data) {\n"
|
|
|
|
" task.execute({name: 'child.js', source: utf8Decode(data)}).then(function() {\n"
|
|
|
|
" print('child started');\n"
|
|
|
|
" });\n"
|
2021-08-19 15:29:37 -04:00
|
|
|
"});");
|
|
|
|
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];
|
2022-10-14 08:27:34 -04:00
|
|
|
snprintf(command, sizeof(command), "%s run --ssb-port=0 --db-path=:memory: -s out/test.js", options->exe_path);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("%s\n", command);
|
2021-08-19 15:29:37 -04:00
|
|
|
int result = system(command);
|
2021-08-22 13:38:20 -04:00
|
|
|
(void)result;
|
2021-08-19 15:29:37 -04:00
|
|
|
assert(WIFEXITED(result));
|
|
|
|
assert(WEXITSTATUS(result) == 0);
|
|
|
|
|
|
|
|
unlink("out/test.js");
|
|
|
|
unlink("out/child.js");
|
|
|
|
}
|
|
|
|
|
2021-09-06 14:23:22 -04:00
|
|
|
static void _test_promise(const tf_test_options_t* options)
|
2021-08-19 15:29:37 -04:00
|
|
|
{
|
|
|
|
FILE* file = fopen("out/test.js", "w");
|
|
|
|
fprintf(file,
|
|
|
|
"var task = new Task();\n"
|
|
|
|
"task.activate();\n"
|
2021-10-10 18:45:24 -04:00
|
|
|
"File.readFile('out/child.js').then(function(data) {\n"
|
|
|
|
" task.execute({name: 'child.js', source: utf8Decode(data)}).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"
|
2021-08-19 15:29:37 -04:00
|
|
|
" });\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];
|
2022-10-14 08:27:34 -04:00
|
|
|
snprintf(command, sizeof(command), "%s run --ssb-port=0 --db-path=:memory: -s out/test.js", options->exe_path);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("%s\n", command);
|
2021-08-19 15:29:37 -04:00
|
|
|
int result = system(command);
|
2021-08-22 13:38:20 -04:00
|
|
|
(void)result;
|
2021-08-19 15:29:37 -04:00
|
|
|
assert(WIFEXITED(result));
|
|
|
|
assert(WEXITSTATUS(result) == 0);
|
|
|
|
|
|
|
|
unlink("out/test.js");
|
|
|
|
unlink("out/child.js");
|
|
|
|
}
|
|
|
|
|
2021-09-06 14:23:22 -04:00
|
|
|
static void _test_promise_remote_throw(const tf_test_options_t* options)
|
2021-08-19 15:29:37 -04:00
|
|
|
{
|
|
|
|
FILE* file = fopen("out/test.js", "w");
|
|
|
|
fprintf(file,
|
|
|
|
"var task = new Task();\n"
|
|
|
|
"task.activate();\n"
|
2021-10-10 18:45:24 -04:00
|
|
|
"File.readFile('out/child.js').then(function(data) {\n"
|
|
|
|
" task.execute({name: 'child.js', source: utf8Decode(data)}).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"
|
2021-08-19 15:29:37 -04:00
|
|
|
" });\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];
|
2022-10-14 08:27:34 -04:00
|
|
|
snprintf(command, sizeof(command), "%s run --ssb-port=0 --db-path=:memory: -s out/test.js", options->exe_path);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("%s\n", command);
|
2021-08-19 15:29:37 -04:00
|
|
|
int result = system(command);
|
2021-08-22 13:38:20 -04:00
|
|
|
(void)result;
|
2021-08-19 15:29:37 -04:00
|
|
|
assert(WIFEXITED(result));
|
|
|
|
assert(WEXITSTATUS(result) == 0);
|
|
|
|
|
|
|
|
unlink("out/test.js");
|
|
|
|
unlink("out/child.js");
|
|
|
|
}
|
|
|
|
|
2021-09-06 14:23:22 -04:00
|
|
|
static void _test_promise_remote_reject(const tf_test_options_t* options)
|
2021-08-19 16:10:37 -04:00
|
|
|
{
|
|
|
|
FILE* file = fopen("out/test.js", "w");
|
|
|
|
fprintf(file,
|
|
|
|
"var task = new Task();\n"
|
|
|
|
"task.activate();\n"
|
2021-10-10 18:45:24 -04:00
|
|
|
"File.readFile('out/child.js').then(function(data) {\n"
|
|
|
|
" task.execute({name: 'child.js', source: utf8Decode(data)}).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"
|
2021-08-19 16:10:37 -04:00
|
|
|
" });\n"
|
|
|
|
"});\n");
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
file = fopen("out/child.js", "w");
|
|
|
|
fprintf(file,
|
|
|
|
"exports = {\n"
|
|
|
|
" add: function(left, right) {\n"
|
|
|
|
" return new Promise(function(resolve, reject) {\n"
|
|
|
|
" reject(new Error('oops'));\n"
|
|
|
|
" });\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n");
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
char command[256];
|
2022-10-14 08:27:34 -04:00
|
|
|
snprintf(command, sizeof(command), "%s run --ssb-port=0 --db-path=:memory: -s out/test.js", options->exe_path);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("%s\n", command);
|
2021-08-19 16:10:37 -04:00
|
|
|
int result = system(command);
|
2021-08-22 13:38:20 -04:00
|
|
|
(void)result;
|
2021-08-19 16:10:37 -04:00
|
|
|
assert(WIFEXITED(result));
|
|
|
|
assert(WEXITSTATUS(result) == 0);
|
|
|
|
|
|
|
|
unlink("out/test.js");
|
|
|
|
unlink("out/child.js");
|
|
|
|
}
|
|
|
|
|
2021-09-06 14:23:22 -04:00
|
|
|
static void _test_database(const tf_test_options_t* options)
|
2021-08-19 16:10:37 -04:00
|
|
|
{
|
|
|
|
FILE* file = fopen("out/test.js", "w");
|
|
|
|
fprintf(file,
|
|
|
|
"var db = new Database('testdb');\n"
|
|
|
|
"if (db.get('a')) {\n"
|
|
|
|
" exit(1);\n"
|
|
|
|
"}\n"
|
|
|
|
"db.set('a', 1);\n"
|
|
|
|
"if (db.get('a') != 1) {\n"
|
|
|
|
" exit(2);\n"
|
|
|
|
"}\n"
|
|
|
|
"db.set('b', 2);\n"
|
|
|
|
"db.set('c', 3);\n"
|
|
|
|
"\n"
|
|
|
|
"var expected = ['a', 'b', 'c'];\n"
|
|
|
|
"var have = db.getAll();\n"
|
|
|
|
"for (var i = 0; i < have.length; i++) {\n"
|
|
|
|
" var item = have[i];\n"
|
|
|
|
" if (expected.indexOf(item) == -1) {\n"
|
|
|
|
" print('Did not find ' + item + ' in db.');\n"
|
|
|
|
" exit(3);\n"
|
|
|
|
" } else {\n"
|
|
|
|
" expected.splice(expected.indexOf(item), 1);\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n"
|
|
|
|
"if (expected.length) {\n"
|
|
|
|
" print('Expected but did not find: ' + JSON.stringify(expected));\n"
|
|
|
|
" exit(4);\n"
|
|
|
|
"}\n");
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
char command[256];
|
2023-08-04 19:44:48 -04:00
|
|
|
unlink("out/test_db0.sqlite");
|
|
|
|
snprintf(command, sizeof(command), "%s run --ssb-port=0 --db-path=out/test_db0.sqlite -s out/test.js", options->exe_path);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("%s\n", command);
|
2021-08-19 16:10:37 -04:00
|
|
|
int result = system(command);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("returned %d\n", WEXITSTATUS(result));
|
2021-08-19 16:10:37 -04:00
|
|
|
assert(WIFEXITED(result));
|
|
|
|
assert(WEXITSTATUS(result) == 0);
|
|
|
|
|
|
|
|
unlink("out/test.js");
|
2023-08-04 19:44:48 -04:00
|
|
|
unlink("out/test_db0.sqlite");
|
2021-08-19 16:10:37 -04:00
|
|
|
}
|
|
|
|
|
2021-09-06 14:23:22 -04:00
|
|
|
static void _test_this(const tf_test_options_t* options)
|
2021-08-19 16:10:37 -04:00
|
|
|
{
|
|
|
|
FILE* file = fopen("out/test.js", "w");
|
|
|
|
fprintf(file,
|
|
|
|
"var task = new Task();\n"
|
|
|
|
"task.activate.bind(null).apply();\n"
|
|
|
|
"exit(0);\n");
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
char command[256];
|
2022-10-14 08:27:34 -04:00
|
|
|
snprintf(command, sizeof(command), "%s run --ssb-port=0 --db-path=:memory: -s out/test.js", options->exe_path);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("%s\n", command);
|
2021-08-19 16:10:37 -04:00
|
|
|
int result = system(command);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("returned %d\n", WEXITSTATUS(result));
|
2021-08-19 16:10:37 -04:00
|
|
|
assert(WIFEXITED(result));
|
|
|
|
assert(WEXITSTATUS(result) == 0);
|
|
|
|
|
|
|
|
unlink("out/test.js");
|
|
|
|
}
|
|
|
|
|
2021-09-06 14:23:22 -04:00
|
|
|
static void _test_await(const tf_test_options_t* options)
|
2021-08-19 16:10:37 -04:00
|
|
|
{
|
|
|
|
FILE* file = fopen("out/test.js", "w");
|
|
|
|
fprintf(file,
|
|
|
|
"print('hi');\n"
|
|
|
|
|
|
|
|
"function foobar() {\n"
|
2021-10-10 18:45:24 -04:00
|
|
|
" return new Promise(function(resolve, reject) {\n"
|
2021-08-19 16:10:37 -04:00
|
|
|
" resolve(10);\n"
|
|
|
|
" });\n"
|
|
|
|
"}\n"
|
|
|
|
"\n"
|
|
|
|
"async function huh() {\n"
|
|
|
|
" let v = await foobar();\n"
|
|
|
|
" print('v => ' + v);\n"
|
|
|
|
" if (v != 10) {\n"
|
|
|
|
" throw new Error('nope');\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n"
|
|
|
|
"\n");
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
char command[256];
|
2022-10-14 08:27:34 -04:00
|
|
|
snprintf(command, sizeof(command), "%s run --ssb-port=0 --db-path=:memory: -s out/test.js", options->exe_path);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("%s\n", command);
|
2021-08-19 16:10:37 -04:00
|
|
|
int result = system(command);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("returned %d\n", WEXITSTATUS(result));
|
2021-08-19 16:10:37 -04:00
|
|
|
assert(WIFEXITED(result));
|
|
|
|
assert(WEXITSTATUS(result) == 0);
|
|
|
|
|
|
|
|
unlink("out/test.js");
|
|
|
|
}
|
|
|
|
|
2022-06-18 13:50:22 -04:00
|
|
|
static void _test_import(const tf_test_options_t* options)
|
2021-08-19 16:10:37 -04:00
|
|
|
{
|
|
|
|
FILE* file = fopen("out/test.js", "w");
|
|
|
|
fprintf(file,
|
2022-06-18 13:50:22 -04:00
|
|
|
"import * as req from './required.js';\n"
|
|
|
|
"if (req.foo() != 12345) {\n"
|
2021-08-19 16:10:37 -04:00
|
|
|
" exit(1);\n"
|
2022-06-18 13:50:22 -04:00
|
|
|
"}\n");
|
2021-08-19 16:10:37 -04:00
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
file = fopen("out/required.js", "w");
|
|
|
|
fprintf(file,
|
2022-06-18 13:50:22 -04:00
|
|
|
"export function foo() {\n"
|
2021-08-19 16:10:37 -04:00
|
|
|
" return 12345;\n"
|
2022-06-18 13:50:22 -04:00
|
|
|
"}\n");
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
file = fopen("out/bad.js", "w");
|
|
|
|
fprintf(file,
|
|
|
|
"import * as req from './missing.js';\n"
|
|
|
|
"if (req.foo() != 12345) {\n"
|
|
|
|
" exit(1);\n"
|
|
|
|
"}\n");
|
2021-08-19 16:10:37 -04:00
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
char command[256];
|
2022-10-14 08:27:34 -04:00
|
|
|
snprintf(command, sizeof(command), "%s run --ssb-port=0 --db-path=:memory: -s out/test.js", options->exe_path);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("%s\n", command);
|
2021-08-19 16:10:37 -04:00
|
|
|
int result = system(command);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("returned %d\n", WEXITSTATUS(result));
|
2021-08-19 16:10:37 -04:00
|
|
|
assert(WIFEXITED(result));
|
|
|
|
assert(WEXITSTATUS(result) == 0);
|
|
|
|
|
2022-10-14 08:27:34 -04:00
|
|
|
snprintf(command, sizeof(command), "%s run --ssb-port=0 --db-path=:memory: -s out/bad.js", options->exe_path);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("%s\n", command);
|
2022-06-18 13:50:22 -04:00
|
|
|
result = system(command);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("returned %d\n", WEXITSTATUS(result));
|
2022-06-18 13:50:22 -04:00
|
|
|
assert(WIFEXITED(result));
|
|
|
|
assert(WEXITSTATUS(result) == 0);
|
|
|
|
|
2021-08-19 16:10:37 -04:00
|
|
|
unlink("out/test.js");
|
|
|
|
unlink("out/required.js");
|
2022-06-18 13:50:22 -04:00
|
|
|
unlink("out/missing.js");
|
2021-08-19 16:10:37 -04:00
|
|
|
}
|
|
|
|
|
2021-09-06 14:23:22 -04:00
|
|
|
static void _test_exit(const tf_test_options_t* options)
|
2021-08-19 16:10:37 -04:00
|
|
|
{
|
|
|
|
FILE* file = fopen("out/test.js", "w");
|
2022-06-18 13:50:22 -04:00
|
|
|
fprintf(file, "import * as blah from './blah.js';\n");
|
2021-08-19 16:10:37 -04:00
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
file = fopen("out/blah.js", "w");
|
|
|
|
fprintf(file, "\n");
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
char command[256];
|
2022-10-14 08:27:34 -04:00
|
|
|
snprintf(command, sizeof(command), "%s run --ssb-port=0 --db-path=:memory: -s out/test.js", options->exe_path);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("%s\n", command);
|
2021-08-19 16:10:37 -04:00
|
|
|
int result = system(command);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("returned %d\n", WEXITSTATUS(result));
|
2021-08-19 16:10:37 -04:00
|
|
|
assert(WIFEXITED(result));
|
|
|
|
assert(WEXITSTATUS(result) == 0);
|
|
|
|
|
|
|
|
unlink("out/test.js");
|
|
|
|
unlink("out/blah.js");
|
|
|
|
}
|
|
|
|
|
2021-09-06 14:23:22 -04:00
|
|
|
static void _test_icu(const tf_test_options_t* options)
|
2021-08-19 16:10:37 -04:00
|
|
|
{
|
|
|
|
FILE* file = fopen("out/test.js", "w");
|
|
|
|
fprintf(file,
|
|
|
|
"print('Hi');\n"
|
|
|
|
"print(parseInt('3').toLocaleString());\n");
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
char command[256];
|
2022-10-14 08:27:34 -04:00
|
|
|
snprintf(command, sizeof(command), "%s run --ssb-port=0 --db-path=:memory: -s out/test.js", options->exe_path);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("%s\n", command);
|
2021-08-19 16:10:37 -04:00
|
|
|
int result = system(command);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("returned %d\n", WEXITSTATUS(result));
|
2021-08-19 16:10:37 -04:00
|
|
|
assert(WIFEXITED(result));
|
|
|
|
assert(WEXITSTATUS(result) == 0);
|
|
|
|
|
|
|
|
unlink("out/test.js");
|
|
|
|
}
|
|
|
|
|
2021-09-06 14:23:22 -04:00
|
|
|
static void _test_uint8array(const tf_test_options_t* options)
|
2021-08-19 16:10:37 -04:00
|
|
|
{
|
|
|
|
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"
|
2021-10-10 18:45:24 -04:00
|
|
|
"File.readFile('out/child.js').then(function(data) {\n"
|
|
|
|
" task.execute({name: 'child.js', source: utf8Decode(data)}).then(async function() {\n"
|
|
|
|
" print('child started');\n"
|
|
|
|
" var input = new Uint8Array(10);\n"
|
|
|
|
" for (var i = 0; i < 10; i++) {\n"
|
|
|
|
" input[i] = i;\n"
|
2021-08-19 16:10:37 -04:00
|
|
|
" }\n"
|
2021-10-10 18:45:24 -04:00
|
|
|
" var test = (await task.getExports()).test;\n"
|
|
|
|
" var output = new Uint8Array(await test(input));\n"
|
|
|
|
" print('input', input, input.length, input.byteLength);\n"
|
|
|
|
" print('output', output, output.length, output.byteLength);\n"
|
|
|
|
" for (var i = 0; i < 10; i++) {\n"
|
|
|
|
" print(output[i]);\n"
|
|
|
|
" if (output[i] != i) {\n"
|
|
|
|
" print('output[' + i + '] == ' + output[i]);\n"
|
|
|
|
" exit(1);\n"
|
|
|
|
" }\n"
|
|
|
|
" }\n"
|
|
|
|
" exit(0);\n"
|
|
|
|
" })\n"
|
|
|
|
"})\n");
|
2021-08-19 16:10:37 -04:00
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
file = fopen("out/child.js", "w");
|
|
|
|
fprintf(file,
|
|
|
|
"exports = {\n"
|
|
|
|
" test: function(data) {\n"
|
|
|
|
" return data;\n"
|
|
|
|
" }\n"
|
|
|
|
"}\n");
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
char command[256];
|
2022-10-14 08:27:34 -04:00
|
|
|
snprintf(command, sizeof(command), "%s run --ssb-port=0 --db-path=:memory: -s out/test.js", options->exe_path);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("%s\n", command);
|
2021-08-19 16:10:37 -04:00
|
|
|
int result = system(command);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("returned %d\n", WEXITSTATUS(result));
|
2021-08-19 16:10:37 -04:00
|
|
|
assert(WIFEXITED(result));
|
|
|
|
assert(WEXITSTATUS(result) == 0);
|
|
|
|
|
|
|
|
unlink("out/test.js");
|
|
|
|
unlink("out/child.js");
|
|
|
|
}
|
|
|
|
|
2023-09-16 20:13:31 -04:00
|
|
|
static void _test_float(const tf_test_options_t* options)
|
|
|
|
{
|
|
|
|
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"
|
|
|
|
"File.readFile('out/child.js').then(function(data) {\n"
|
|
|
|
" task.execute({name: 'child.js', source: utf8Decode(data)}).then(async function() {\n"
|
|
|
|
" print('get exports');\n"
|
|
|
|
" let test = (await task.getExports()).test;\n"
|
|
|
|
" print('calling export');\n"
|
|
|
|
" let result = await test(1.2);\n"
|
|
|
|
" print(result);\n"
|
|
|
|
" exit(result == 1.2 ? 0 : 1);\n"
|
|
|
|
" });\n"
|
|
|
|
"});");
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
file = fopen("out/child.js", "w");
|
|
|
|
fprintf(file,
|
|
|
|
"print(\"child\");\n"
|
|
|
|
"exports = {\n"
|
|
|
|
" test: function(value) {\n"
|
|
|
|
" print(value);\n"
|
|
|
|
" return value;\n"
|
|
|
|
" }\n"
|
|
|
|
"};\n"
|
|
|
|
"print(\"child ready\");\n"
|
|
|
|
);
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
char command[256];
|
|
|
|
snprintf(command, sizeof(command), "%s run --ssb-port=0 --db-path=:memory: -s out/test.js", options->exe_path);
|
|
|
|
tf_printf("%s\n", command);
|
|
|
|
int result = system(command);
|
|
|
|
(void)result;
|
|
|
|
assert(WIFEXITED(result));
|
|
|
|
assert(WEXITSTATUS(result) == 0);
|
|
|
|
|
|
|
|
unlink("out/test.js");
|
|
|
|
unlink("out/child.js");
|
|
|
|
}
|
|
|
|
|
2021-09-06 14:23:22 -04:00
|
|
|
static void _test_socket(const tf_test_options_t* options)
|
2021-08-19 16:10:37 -04:00
|
|
|
{
|
|
|
|
FILE* file = fopen("out/test.js", "w");
|
|
|
|
fprintf(file,
|
|
|
|
"'use strict';\n"
|
|
|
|
"\n"
|
|
|
|
"var s = new Socket();\n"
|
|
|
|
"print('connecting');\n"
|
|
|
|
"print('before connect', s.isConnected);\n"
|
|
|
|
"s.onError(function(e) {\n"
|
|
|
|
" print(e);\n"
|
|
|
|
"});\n"
|
|
|
|
"print('noDelay', s.noDelay);\n"
|
|
|
|
"s.noDelay = true;\n"
|
|
|
|
"s.connect('www.unprompted.com', 80).then(function() {\n"
|
2022-10-14 08:27:34 -04:00
|
|
|
" print('connected', 'www.unprompted.com', 80, s.isConnected);\n"
|
2021-08-19 16:10:37 -04:00
|
|
|
" print(s.peerName);\n"
|
|
|
|
" s.read(function(data) {\n"
|
2021-09-06 13:50:38 -04:00
|
|
|
" print('read', data ? data.length : null);\n"
|
2021-08-19 16:10:37 -04:00
|
|
|
" });\n"
|
|
|
|
" s.write('GET / HTTP/1.0\\r\\n\\r\\n');\n"
|
2022-10-14 08:27:34 -04:00
|
|
|
"}).then(function(e) {\n"
|
|
|
|
" print('closed 1');\n"
|
2021-08-19 16:10:37 -04:00
|
|
|
"});\n"
|
|
|
|
"\n"
|
|
|
|
"var s2 = new Socket();\n"
|
|
|
|
"print('connecting');\n"
|
|
|
|
"print('before connect', s2.isConnected);\n"
|
|
|
|
"s2.onError(function(e) {\n"
|
|
|
|
" print('error');\n"
|
|
|
|
" print(e);\n"
|
|
|
|
"});\n"
|
|
|
|
"print('noDelay', s2.noDelay);\n"
|
|
|
|
"s2.noDelay = true;\n"
|
|
|
|
"s2.connect('www.unprompted.com', 443).then(function() {\n"
|
2022-10-14 08:27:34 -04:00
|
|
|
" print('connected', 'www.unprompted.com', 443);\n"
|
2021-08-19 16:10:37 -04:00
|
|
|
" s2.read(function(data) {\n"
|
2021-09-06 13:50:38 -04:00
|
|
|
" print('read', data ? data.length : null);\n"
|
2021-08-19 16:10:37 -04:00
|
|
|
" });\n"
|
|
|
|
" return s2.startTls();\n"
|
|
|
|
"}).then(function() {\n"
|
|
|
|
" print('ready');\n"
|
|
|
|
" print(s2.peerName);\n"
|
|
|
|
" s2.write('GET / HTTP/1.0\\r\\nConnection: close\\r\\n\\r\\n').then(function() {\n"
|
|
|
|
" s2.shutdown();\n"
|
|
|
|
" });\n"
|
|
|
|
"}).catch(function(e) {\n"
|
2022-07-09 10:14:48 -04:00
|
|
|
" print('caught');\n"
|
|
|
|
" print(e);\n"
|
|
|
|
"});\n"
|
|
|
|
"var s3 = new Socket();\n"
|
|
|
|
"print('connecting s3');\n"
|
|
|
|
"print('before connect', s3.isConnected);\n"
|
|
|
|
"s3.onError(function(e) {\n"
|
|
|
|
" print('error');\n"
|
|
|
|
" print(e);\n"
|
|
|
|
"});\n"
|
|
|
|
"print('noDelay', s3.noDelay);\n"
|
|
|
|
"s3.noDelay = true;\n"
|
|
|
|
"s3.connect('0.0.0.0', 443).then(function() {\n"
|
2022-10-14 08:27:34 -04:00
|
|
|
" print('connected', '0.0.0.0', 443);\n"
|
2022-07-09 10:14:48 -04:00
|
|
|
" s3.read(function(data) {\n"
|
|
|
|
" print('read', data ? data.length : null);\n"
|
|
|
|
" });\n"
|
|
|
|
" return s3.startTls();\n"
|
|
|
|
"}).then(function() {\n"
|
|
|
|
" print('ready');\n"
|
|
|
|
" print(s3.peerName);\n"
|
|
|
|
" s3.write('GET / HTTP/1.0\\r\\nConnection: close\\r\\n\\r\\n').then(function() {\n"
|
|
|
|
" s3.shutdown();\n"
|
|
|
|
" });\n"
|
|
|
|
"}).catch(function(e) {\n"
|
|
|
|
" print('caught');\n"
|
2021-08-19 16:10:37 -04:00
|
|
|
" print(e);\n"
|
|
|
|
"});\n");
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
char command[256];
|
2022-10-14 08:27:34 -04:00
|
|
|
snprintf(command, sizeof(command), "%s run --ssb-port=0 --db-path=:memory: -s out/test.js", options->exe_path);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("%s\n", command);
|
2021-08-19 16:10:37 -04:00
|
|
|
int result = system(command);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("returned %d\n", WEXITSTATUS(result));
|
2021-08-19 16:10:37 -04:00
|
|
|
assert(WIFEXITED(result));
|
|
|
|
assert(WEXITSTATUS(result) == 0);
|
|
|
|
|
|
|
|
unlink("out/test.js");
|
|
|
|
}
|
|
|
|
|
2021-10-05 21:25:33 -04:00
|
|
|
static void _test_file(const tf_test_options_t* options)
|
|
|
|
{
|
|
|
|
FILE* file = fopen("out/test.js", "w");
|
|
|
|
fprintf(file,
|
|
|
|
"'use strict';\n"
|
|
|
|
"File.readFile('out/test.js').then(function(data) {\n"
|
|
|
|
"}).catch(function(error) {\n"
|
|
|
|
" print('ERROR', error);\n"
|
|
|
|
" exit(1);\n"
|
|
|
|
"});\n"
|
|
|
|
"File.readFile('out/missing.txt').then(function(data) {\n"
|
|
|
|
" print('READ', utf8Decode(data));\n"
|
|
|
|
" exit(1);\n"
|
|
|
|
"}).catch(function(error) {\n"
|
|
|
|
" print('expected error', error);\n"
|
|
|
|
"});\n");
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
char command[256];
|
2022-10-14 08:27:34 -04:00
|
|
|
snprintf(command, sizeof(command), "%s run --ssb-port=0 --db-path=:memory: -s out/test.js", options->exe_path);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("%s\n", command);
|
2021-10-05 21:25:33 -04:00
|
|
|
int result = system(command);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("returned %d\n", WEXITSTATUS(result));
|
2021-10-05 21:25:33 -04:00
|
|
|
assert(WIFEXITED(result));
|
|
|
|
assert(WEXITSTATUS(result) == 0);
|
|
|
|
|
|
|
|
unlink("out/test.js");
|
|
|
|
}
|
|
|
|
|
2022-09-28 19:52:44 -04:00
|
|
|
static void _test_sign(const tf_test_options_t* options)
|
|
|
|
{
|
|
|
|
FILE* file = fopen("out/test.js", "w");
|
|
|
|
fprintf(file,
|
|
|
|
"'use strict';\n"
|
|
|
|
"let id = ssb.createIdentity('test');\n"
|
|
|
|
"print(id);\n"
|
|
|
|
"let sig = ssb.hmacsha256sign('hello', 'test', id);\n"
|
|
|
|
"print(sig);\n"
|
|
|
|
"if (!ssb.hmacsha256verify(id, 'hello', sig)) {\n"
|
|
|
|
" exit(1);\n"
|
|
|
|
"}\n"
|
|
|
|
"if (ssb.hmacsha256verify(id, 'world', sig)) {\n"
|
|
|
|
" exit(1);\n"
|
|
|
|
"}\n"
|
|
|
|
"if (ssb.hmacsha256verify(id, 'hello1', sig)) {\n"
|
|
|
|
" exit(1);\n"
|
|
|
|
"}\n"
|
|
|
|
);
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
char command[256];
|
2022-10-14 08:27:34 -04:00
|
|
|
snprintf(command, sizeof(command), "%s run --ssb-port=0 --db-path=:memory: -s out/test.js", options->exe_path);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("%s\n", command);
|
2022-09-28 19:52:44 -04:00
|
|
|
int result = system(command);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("returned %d\n", WEXITSTATUS(result));
|
2022-09-28 19:52:44 -04:00
|
|
|
assert(WIFEXITED(result));
|
|
|
|
assert(WEXITSTATUS(result) == 0);
|
|
|
|
|
|
|
|
unlink("out/test.js");
|
|
|
|
}
|
|
|
|
|
|
|
|
static void _test_b64(const tf_test_options_t* options)
|
|
|
|
{
|
|
|
|
FILE* file = fopen("out/test.js", "w");
|
|
|
|
fprintf(file,
|
|
|
|
"'use strict';\n"
|
|
|
|
"print(base64Encode('hello'));\n"
|
2023-02-13 22:15:24 -05:00
|
|
|
"let x = base64Decode(base64Encode('hello'));\n"
|
|
|
|
"if (x !== 'hello') {\n"
|
|
|
|
" print(x);\n"
|
2022-09-28 19:52:44 -04:00
|
|
|
" exit(1);\n"
|
|
|
|
"}\n"
|
|
|
|
);
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
char command[256];
|
2022-10-14 08:27:34 -04:00
|
|
|
snprintf(command, sizeof(command), "%s run --ssb-port=0 --db-path=:memory: -s out/test.js", options->exe_path);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("%s\n", command);
|
2022-09-28 19:52:44 -04:00
|
|
|
int result = system(command);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("returned %d\n", WEXITSTATUS(result));
|
2022-09-28 19:52:44 -04:00
|
|
|
assert(WIFEXITED(result));
|
|
|
|
assert(WEXITSTATUS(result) == 0);
|
|
|
|
|
|
|
|
unlink("out/test.js");
|
|
|
|
}
|
|
|
|
|
2023-09-21 19:38:55 -04:00
|
|
|
static void _tf_test_run(const tf_test_options_t* options, const char* name, void (*test)(const tf_test_options_t* options), bool opt_in)
|
2021-08-19 15:29:37 -04:00
|
|
|
{
|
2021-09-06 14:23:22 -04:00
|
|
|
bool specified = false;
|
2021-10-10 17:51:38 -04:00
|
|
|
if (options->tests)
|
|
|
|
{
|
2022-06-04 13:04:51 -04:00
|
|
|
char* dup = tf_strdup(options->tests);
|
2021-09-06 14:23:22 -04:00
|
|
|
char* state = NULL;
|
|
|
|
const char* t = NULL;
|
2021-10-10 17:51:38 -04:00
|
|
|
while ((t = strtok_r(t ? NULL : dup, ",", &state)) != NULL)
|
|
|
|
{
|
|
|
|
if (strcmp(t, name) == 0)
|
|
|
|
{
|
2021-09-06 14:23:22 -04:00
|
|
|
specified = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2022-06-04 13:04:51 -04:00
|
|
|
tf_free(dup);
|
2021-09-06 14:23:22 -04:00
|
|
|
}
|
|
|
|
|
2023-09-21 19:38:55 -04:00
|
|
|
if ((!opt_in && !options->tests) || specified)
|
2021-10-10 17:51:38 -04:00
|
|
|
{
|
2022-07-09 10:38:00 -04:00
|
|
|
#define GREEN "\e[1;32m"
|
2022-07-09 10:33:38 -04:00
|
|
|
#define MAGENTA "\e[1;35m"
|
|
|
|
#define CYAN "\e[1;36m"
|
|
|
|
#define RESET "\e[0m"
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf(CYAN "== running test " MAGENTA "%s" CYAN " ==\n" RESET, name);
|
2021-09-06 14:23:22 -04:00
|
|
|
test(options);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("[" GREEN "pass" RESET "] %s\n", name);
|
2022-07-09 10:38:00 -04:00
|
|
|
#undef GREEN
|
|
|
|
#undef MAGENTA
|
|
|
|
#undef CYAN
|
|
|
|
#undef RESET
|
2021-09-06 14:23:22 -04:00
|
|
|
}
|
|
|
|
}
|
2023-10-11 20:29:17 -04:00
|
|
|
#endif
|
2021-09-06 14:23:22 -04:00
|
|
|
|
|
|
|
void tf_tests(const tf_test_options_t* options)
|
|
|
|
{
|
2023-10-11 20:29:17 -04:00
|
|
|
#if !TARGET_OS_IPHONE
|
2023-09-21 19:38:55 -04:00
|
|
|
_tf_test_run(options, "ssb", tf_ssb_test_ssb, false);
|
|
|
|
_tf_test_run(options, "ssb_id", tf_ssb_test_id_conversion, false);
|
|
|
|
_tf_test_run(options, "ssb_following", tf_ssb_test_following, false);
|
|
|
|
_tf_test_run(options, "nop", _test_nop, false);
|
|
|
|
_tf_test_run(options, "child", _test_child, false);
|
|
|
|
_tf_test_run(options, "promise", _test_promise, false);
|
|
|
|
_tf_test_run(options, "promise_remote_throw", _test_promise_remote_throw, false);
|
|
|
|
_tf_test_run(options, "promise_remote_reject", _test_promise_remote_reject, false);
|
|
|
|
_tf_test_run(options, "database", _test_database, false);
|
|
|
|
_tf_test_run(options, "this", _test_this, false);
|
|
|
|
_tf_test_run(options, "await", _test_await, false);
|
|
|
|
_tf_test_run(options, "import", _test_import, false);
|
|
|
|
_tf_test_run(options, "exit", _test_exit, false);
|
|
|
|
_tf_test_run(options, "icu", _test_icu, false);
|
|
|
|
_tf_test_run(options, "uint8array", _test_uint8array, false);
|
|
|
|
_tf_test_run(options, "float", _test_float, false);
|
|
|
|
_tf_test_run(options, "socket", _test_socket, false);
|
|
|
|
_tf_test_run(options, "file", _test_file, false);
|
|
|
|
_tf_test_run(options, "sign", _test_sign, false);
|
|
|
|
_tf_test_run(options, "b64", _test_b64, false);
|
|
|
|
_tf_test_run(options, "rooms", tf_ssb_test_rooms, false);
|
|
|
|
_tf_test_run(options, "bench", tf_ssb_test_bench, false);
|
|
|
|
_tf_test_run(options, "go-ssb-room", tf_ssb_test_go_ssb_room, true);
|
2023-03-07 12:50:17 -05:00
|
|
|
tf_printf("Tests completed.\n");
|
2023-10-11 20:29:17 -04:00
|
|
|
#endif
|
2021-08-19 15:29:37 -04:00
|
|
|
}
|