Starting to move the tests to C.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3652 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		| @@ -1,6 +1,7 @@ | |||||||
| #include "ssb.h" | #include "ssb.h" | ||||||
| #include "task.h" | #include "task.h" | ||||||
| #include "taskstub.h" | #include "taskstub.h" | ||||||
|  | #include "tests.h" | ||||||
|  |  | ||||||
| #include <quickjs-libc.h> | #include <quickjs-libc.h> | ||||||
| #include <quickjs.h> | #include <quickjs.h> | ||||||
| @@ -137,7 +138,7 @@ static int _tf_command_test(const char* file, int argc, char* argv[]) | |||||||
| 		return 2; | 		return 2; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	tf_ssb_test(); | 	tf_tests(file); | ||||||
| 	return 0; | 	return 0; | ||||||
| xopt_help: | xopt_help: | ||||||
| 	if (extras) { | 	if (extras) { | ||||||
| @@ -434,6 +435,7 @@ static int _tf_command_usage(const char* file, int argc, char* argv[]) | |||||||
|  |  | ||||||
| int main(int argc, char* argv[]) | int main(int argc, char* argv[]) | ||||||
| { | { | ||||||
|  | 	prctl(PR_SET_PDEATHSIG, SIGKILL); | ||||||
| 	uv_setup_args(argc, argv); | 	uv_setup_args(argc, argv); | ||||||
| 	tf_taskstub_startup(); | 	tf_taskstub_startup(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1192,7 +1192,9 @@ void tf_task_activate(tf_task_t* task) | |||||||
| 		tf_ssb_set_trace(task->_ssb, task->_trace); | 		tf_ssb_set_trace(task->_ssb, task->_trace); | ||||||
| 		tf_ssb_broadcast_listener_start(task->_ssb, false); | 		tf_ssb_broadcast_listener_start(task->_ssb, false); | ||||||
| 		tf_ssb_init(context, task->_ssb); | 		tf_ssb_init(context, task->_ssb); | ||||||
| 		tf_ssb_server_open(task->_ssb, task->_ssb_port); | 		if (task->_ssb_port) { | ||||||
|  | 			tf_ssb_server_open(task->_ssb, task->_ssb_port); | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		JS_SetPropertyStr(context, global, "trace", JS_NewCFunction(context, _tf_task_trace, "trace", 1)); | 		JS_SetPropertyStr(context, global, "trace", JS_NewCFunction(context, _tf_task_trace, "trace", 1)); | ||||||
| 	} else { | 	} else { | ||||||
|   | |||||||
							
								
								
									
										145
									
								
								src/tests.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								src/tests.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | |||||||
|  | #include "tests.h" | ||||||
|  |  | ||||||
|  | #include "ssb.h" | ||||||
|  |  | ||||||
|  | #include <assert.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <unistd.h> | ||||||
|  |  | ||||||
|  | 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"); | ||||||
|  | } | ||||||
							
								
								
									
										3
									
								
								src/tests.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/tests.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | void tf_tests(const char* exe_path); | ||||||
| @@ -1,8 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| cat > test.js << EOF |  | ||||||
| print("hi"); |  | ||||||
| EOF |  | ||||||
|  |  | ||||||
| echo $TILDEFRIENDS test.js |  | ||||||
| $TILDEFRIENDS test.js |  | ||||||
| @@ -1,15 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| echo "SKIP" |  | ||||||
| exit 0 |  | ||||||
|  |  | ||||||
| if [ ! -x /usr/bin/valgrind ]; then |  | ||||||
| 	echo "SKIP" |  | ||||||
| 	exit 0 |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| cat > test.js << EOF |  | ||||||
| print("hi"); |  | ||||||
| EOF |  | ||||||
|  |  | ||||||
| valgrind --log-file=$LOGDIR/valgrind.log $TILDEFRIENDS test.js |  | ||||||
| @@ -1,19 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| cat > test.js << EOF |  | ||||||
| var task = new Task(); |  | ||||||
| task.onExit = function() { |  | ||||||
| 	print("child exited"); |  | ||||||
| }; |  | ||||||
| task.activate(); |  | ||||||
| task.execute({name: "child.js", source: utf8Decode(File.readFile("child.js"))}).then(function() { |  | ||||||
| 	print("child started"); |  | ||||||
| }); |  | ||||||
| EOF |  | ||||||
|  |  | ||||||
| cat > child.js << EOF |  | ||||||
| print("I am the child process."); |  | ||||||
| exit(0); |  | ||||||
| EOF |  | ||||||
|  |  | ||||||
| $TILDEFRIENDS test.js |  | ||||||
| @@ -1,27 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| cat > test.js << EOF |  | ||||||
| var task = new Task(); |  | ||||||
| task.activate(); |  | ||||||
| task.execute({name: "child.js", source: utf8Decode(File.readFile("child.js"))}).then(function() { |  | ||||||
| 	task.getExports().then(function(exports) { |  | ||||||
| 		return exports.add(1, 1); |  | ||||||
| 	}).then(function(sum) { |  | ||||||
| 		if (sum == 2) { |  | ||||||
| 			exit(0); |  | ||||||
| 		} else { |  | ||||||
| 			exit(1); |  | ||||||
| 		} |  | ||||||
| 	}); |  | ||||||
| }); |  | ||||||
| EOF |  | ||||||
|  |  | ||||||
| cat > child.js << EOF |  | ||||||
| exports = { |  | ||||||
| 	add: function(left, right) { |  | ||||||
| 		return left + right; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| EOF |  | ||||||
|  |  | ||||||
| $TILDEFRIENDS test.js |  | ||||||
| @@ -1,31 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| cat > test.js << EOF |  | ||||||
| var task = new Task(); |  | ||||||
| task.activate(); |  | ||||||
| task.execute({name: "child.js", source: utf8Decode(File.readFile("child.js"))}).then(function() { |  | ||||||
| 	task.getExports().then(function(exp) { |  | ||||||
| 		return exp.add(1, 1); |  | ||||||
| 	}).then(function(sum) { |  | ||||||
| 		exit(1); |  | ||||||
| 	}).catch(function(error) { |  | ||||||
| 		print("Caught: " + error.message); |  | ||||||
| 		if (error.stack) { |  | ||||||
| 			print("stack: " + error.stack); |  | ||||||
| 		} |  | ||||||
| 		exit(0); |  | ||||||
| 	}); |  | ||||||
| }).catch(function(e) { |  | ||||||
| 	print("caught", e.message); |  | ||||||
| }); |  | ||||||
| EOF |  | ||||||
|  |  | ||||||
| cat > child.js << EOF |  | ||||||
| exports = { |  | ||||||
| 	add: function(left, right) { |  | ||||||
| 		throw new Error("fail"); |  | ||||||
| 	} |  | ||||||
| }; |  | ||||||
| EOF |  | ||||||
|  |  | ||||||
| $TILDEFRIENDS test.js |  | ||||||
		Reference in New Issue
	
	Block a user