I think this fixes tests, and makes them runnable from continuous integration.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3161 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		| @@ -257,7 +257,8 @@ void Task::kill() { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| void Task::execute(const char* fileName) { | bool Task::execute(const char* fileName) { | ||||||
|  | 	bool executed = false; | ||||||
| 	v8::Isolate::Scope isolateScope(_isolate); | 	v8::Isolate::Scope isolateScope(_isolate); | ||||||
| 	v8::HandleScope handleScope(_isolate); | 	v8::HandleScope handleScope(_isolate); | ||||||
| 	v8::Context::Scope contextScope(v8::Local<v8::Context>::New(_isolate, _context)); | 	v8::Context::Scope contextScope(v8::Local<v8::Context>::New(_isolate, _context)); | ||||||
| @@ -274,6 +275,7 @@ void Task::execute(const char* fileName) { | |||||||
| 		if (!script.IsEmpty()) { | 		if (!script.IsEmpty()) { | ||||||
| 			script->Run(); | 			script->Run(); | ||||||
| 			std::cout << "Script " << fileName << " completed\n"; | 			std::cout << "Script " << fileName << " completed\n"; | ||||||
|  | 			executed = true; | ||||||
| 		} else { | 		} else { | ||||||
| 			std::cerr << "Failed to compile: " << fileName << ".\n"; | 			std::cerr << "Failed to compile: " << fileName << ".\n"; | ||||||
| 		} | 		} | ||||||
| @@ -283,6 +285,7 @@ void Task::execute(const char* fileName) { | |||||||
| 		message += fileName; | 		message += fileName; | ||||||
| 		_isolate->ThrowException(v8::Exception::Error(v8::String::NewFromUtf8(_isolate, message.c_str()))); | 		_isolate->ThrowException(v8::Exception::Error(v8::String::NewFromUtf8(_isolate, message.c_str()))); | ||||||
| 	} | 	} | ||||||
|  | 	return executed; | ||||||
| } | } | ||||||
|  |  | ||||||
| void Task::invokeExport(const v8::FunctionCallbackInfo<v8::Value>& args) { | void Task::invokeExport(const v8::FunctionCallbackInfo<v8::Value>& args) { | ||||||
|   | |||||||
| @@ -74,7 +74,7 @@ public: | |||||||
|  |  | ||||||
| 	void configureFromStdin(); | 	void configureFromStdin(); | ||||||
| 	void setTrusted(bool trusted) { _trusted = trusted; } | 	void setTrusted(bool trusted) { _trusted = trusted; } | ||||||
| 	void execute(const char* fileName); | 	bool execute(const char* fileName); | ||||||
| 	void activate(); | 	void activate(); | ||||||
| 	void run(); | 	void run(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -55,3 +55,8 @@ TaskTryCatch::~TaskTryCatch() { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | bool TaskTryCatch::hasCaught() | ||||||
|  | { | ||||||
|  | 	return _tryCatch.HasCaught(); | ||||||
|  | } | ||||||
|   | |||||||
| @@ -9,6 +9,7 @@ class TaskTryCatch { | |||||||
| public: | public: | ||||||
| 	TaskTryCatch(Task* task); | 	TaskTryCatch(Task* task); | ||||||
| 	~TaskTryCatch(); | 	~TaskTryCatch(); | ||||||
|  | 	bool hasCaught(); | ||||||
|  |  | ||||||
| private: | private: | ||||||
| 	v8::TryCatch _tryCatch; | 	v8::TryCatch _tryCatch; | ||||||
|   | |||||||
							
								
								
									
										18
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								src/main.cpp
									
									
									
									
									
								
							| @@ -18,6 +18,7 @@ v8::Platform* gPlatform = 0; | |||||||
|  |  | ||||||
|  |  | ||||||
| int main(int argc, char* argv[]) { | int main(int argc, char* argv[]) { | ||||||
|  | 	int result = 0; | ||||||
| 	uv_setup_args(argc, argv); | 	uv_setup_args(argc, argv); | ||||||
| 	TaskStub::initialize(); | 	TaskStub::initialize(); | ||||||
| 	v8::V8::InitializeICU(); | 	v8::V8::InitializeICU(); | ||||||
| @@ -64,12 +65,23 @@ int main(int argc, char* argv[]) { | |||||||
| 			v8::HandleScope handleScope(task.getIsolate()); | 			v8::HandleScope handleScope(task.getIsolate()); | ||||||
| 			v8::Context::Scope contextScope(task.getContext()); | 			v8::Context::Scope contextScope(task.getContext()); | ||||||
| 			TaskTryCatch tryCatch(&task); | 			TaskTryCatch tryCatch(&task); | ||||||
| 			task.execute(coreTask); | 			if (!task.execute(coreTask)) | ||||||
|  | 			{ | ||||||
|  | 				result = -1; | ||||||
|  | 			} | ||||||
|  | 			if (tryCatch.hasCaught()) | ||||||
|  | 			{ | ||||||
|  | 				result = -2; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if (result == 0) | ||||||
|  | 		{ | ||||||
|  | 			task.run(); | ||||||
| 		} | 		} | ||||||
| 		task.run(); |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	v8::V8::Dispose(); | 	v8::V8::Dispose(); | ||||||
|  |  | ||||||
| 	return 0; | 	return result; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -4,4 +4,4 @@ cat > test.js << EOF | |||||||
| print("hi"); | print("hi"); | ||||||
| EOF | EOF | ||||||
|  |  | ||||||
| $SANDBOXOS test.js | $TILDEFRIENDS test.js | ||||||
|   | |||||||
| @@ -4,4 +4,4 @@ cat > test.js << EOF | |||||||
| print("hi"); | print("hi"); | ||||||
| EOF | EOF | ||||||
|  |  | ||||||
| valgrind --log-file=$LOGDIR/valgrind.log $SANDBOXOS test.js | valgrind --log-file=$LOGDIR/valgrind.log $TILDEFRIENDS test.js | ||||||
|   | |||||||
| @@ -16,4 +16,4 @@ print("I am the child process."); | |||||||
| exit(0); | exit(0); | ||||||
| EOF | EOF | ||||||
|  |  | ||||||
| $SANDBOXOS test.js | $TILDEFRIENDS test.js | ||||||
|   | |||||||
| @@ -24,4 +24,4 @@ exports = { | |||||||
| } | } | ||||||
| EOF | EOF | ||||||
|  |  | ||||||
| $SANDBOXOS test.js | $TILDEFRIENDS test.js | ||||||
|   | |||||||
| @@ -23,4 +23,4 @@ exports = { | |||||||
| } | } | ||||||
| EOF | EOF | ||||||
|  |  | ||||||
| $SANDBOXOS test.js | $TILDEFRIENDS test.js | ||||||
|   | |||||||
| @@ -1,80 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| mkdir -p packages |  | ||||||
| for i in filesystem packager; do |  | ||||||
| 	ln -s $ROOT/packages/$i packages/$i |  | ||||||
| done |  | ||||||
| cp -R $ROOT/packages/system packages/system |  | ||||||
|  |  | ||||||
| mkdir -p packages/test |  | ||||||
|  |  | ||||||
| cat > packages/test/test.js << EOF |  | ||||||
| print("Hello!"); |  | ||||||
|  |  | ||||||
| File.writeFile("packages/hello/hello.js", "this will fail to run!$^!U#%^#$%#%"); |  | ||||||
|  |  | ||||||
| var p = imports.system.restartTask("hello"); |  | ||||||
| print("here is our promise: " + p.toString()); |  | ||||||
| print(p); |  | ||||||
|  |  | ||||||
| p.then(function(r) { |  | ||||||
| 	print("restart succeeded when it should not have: " + r); |  | ||||||
| 	imports.system.finishTest(1); |  | ||||||
| }).catch(function(e) { |  | ||||||
| 	print("restart failed: " + e); |  | ||||||
| 	print(e.toString()); |  | ||||||
| 	for (var i in e) { |  | ||||||
| 		print(i); |  | ||||||
| 		print(e[i]); |  | ||||||
| 	} |  | ||||||
| 	imports.system.finishTest(0); |  | ||||||
| }); |  | ||||||
| EOF |  | ||||||
|  |  | ||||||
| cat > packages/test/package.json << EOF |  | ||||||
| { |  | ||||||
| 	"name": "test", |  | ||||||
| 	"start": "test.js", |  | ||||||
| 	"trusted": true, |  | ||||||
| 	"imports": ["packager", "system"] |  | ||||||
| } |  | ||||||
| EOF |  | ||||||
|  |  | ||||||
| cat >> packages/system/system.js << EOF |  | ||||||
| exports.finishTest = function(result) { |  | ||||||
| 	exit(result); |  | ||||||
| } |  | ||||||
| EOF |  | ||||||
|  |  | ||||||
| mkdir -p packages/hello |  | ||||||
|  |  | ||||||
| cat > packages/hello/hello.js << EOF |  | ||||||
| print("Hi."); |  | ||||||
| EOF |  | ||||||
|  |  | ||||||
| cat > packages/hello/package.json << EOF |  | ||||||
| { |  | ||||||
| 	"name": "hello", |  | ||||||
| 	"start": "hello.js" |  | ||||||
| } |  | ||||||
| EOF |  | ||||||
|  |  | ||||||
|  |  | ||||||
| mkdir -p packages/auth |  | ||||||
|  |  | ||||||
| cat > packages/auth/auth.js << EOF |  | ||||||
| exports = { |  | ||||||
| 	query: function() { return null; }, |  | ||||||
| 	getCredentials: function() { return {user: 'test', token: 'token'}; }, |  | ||||||
| 	verifyCredentials: function() { return {permissions: []}; }, |  | ||||||
| }; |  | ||||||
| EOF |  | ||||||
|  |  | ||||||
| cat > packages/auth/package.json << EOF |  | ||||||
| { |  | ||||||
| 	"name": "auth", |  | ||||||
| 	"start": "auth.js" |  | ||||||
| } |  | ||||||
| EOF |  | ||||||
|  |  | ||||||
| $SANDBOXOS packages/system/system.js |  | ||||||
| @@ -26,4 +26,4 @@ exports = { | |||||||
| } | } | ||||||
| EOF | EOF | ||||||
|  |  | ||||||
| $SANDBOXOS test.js | $TILDEFRIENDS test.js | ||||||
|   | |||||||
| @@ -31,4 +31,4 @@ if (expected.length) { | |||||||
| } | } | ||||||
| EOF | EOF | ||||||
|  |  | ||||||
| $SANDBOXOS test.js | $TILDEFRIENDS test.js | ||||||
|   | |||||||
| @@ -6,4 +6,4 @@ task.activate.bind(null).apply(); | |||||||
| exit(0); | exit(0); | ||||||
| EOF | EOF | ||||||
|  |  | ||||||
| $SANDBOXOS test.js | $TILDEFRIENDS test.js | ||||||
|   | |||||||
| @@ -1,36 +1,68 @@ | |||||||
| #!/bin/bash | #!/usr/bin/python | ||||||
|  |  | ||||||
| export ROOT=$(cd $(dirname ${BASH_SOURCE[0]})/..; pwd) | import argparse | ||||||
| TMP=$ROOT/tmp | import glob | ||||||
| LOGS=$ROOT/logs | import os | ||||||
| TESTS=$ROOT/tests | import shutil | ||||||
| export SANDBOXOS=$ROOT/sandboxos | import subprocess | ||||||
|  | import sys | ||||||
|  |  | ||||||
| mkdir $TMP 2> /dev/null | if sys.platform != 'linux2': | ||||||
| mkdir $LOGS 2> /dev/null | 	print 'Tests are only enabled on Linux.' | ||||||
|  | 	exit(0) | ||||||
|  |  | ||||||
| REQUESTED_TESTS=$* | parser = argparse.ArgumentParser() | ||||||
| if [[ -z $REQUESTED_TESTS ]]; then | parser.add_argument('tests', nargs=argparse.REMAINDER) | ||||||
| 	REQUESTED_TESTS=$(ls $TESTS/* | xargs basename -a) | arguments = parser.parse_args() | ||||||
| fi |  | ||||||
|  |  | ||||||
| for NAME in $REQUESTED_TESTS; do | root = os.path.dirname(os.path.join(os.getcwd(), os.path.dirname(__file__))) | ||||||
| 	TEST=$TESTS/$NAME | tmp = os.path.join(root, 'tmp') | ||||||
| 	echo -n "$(basename $TEST) " | logs = os.path.join(root, 'logs') | ||||||
| 	rm -rf $TMP/* | tests = os.path.join(root, 'tests') | ||||||
| 	pushd $TMP > /dev/null | executable = os.path.join(root, 'tildefriends') | ||||||
| 	export LOGDIR=$LOGS/$NAME |  | ||||||
| 	mkdir $LOGDIR 2> /dev/null |  | ||||||
| 	unbuffer $TEST > $LOGDIR/stdout.log 2> $LOGDIR/stderr.log |  | ||||||
| 	RESULT=$? |  | ||||||
| 	popd > /dev/null |  | ||||||
| 	if [[ $RESULT != 0 ]]; then |  | ||||||
| 		echo "FAILED (with exit code $RESULT)" |  | ||||||
| 		exit $RESULT |  | ||||||
| 	else |  | ||||||
| 		echo "SUCCESS" |  | ||||||
| 	fi |  | ||||||
| done |  | ||||||
|  |  | ||||||
| echo | if not os.path.isdir(logs): | ||||||
| echo "All tests completed successfully." | 	os.makedirs(logs) | ||||||
|  |  | ||||||
|  | selectedTests = set() | ||||||
|  | if not arguments.tests: | ||||||
|  | 	for test in glob.glob(os.path.join(tests, '*')): | ||||||
|  | 		selectedTests.add(test) | ||||||
|  | for pattern in arguments.tests: | ||||||
|  | 	for match in glob.glob(os.path.join(tests, '*' + pattern + '*')): | ||||||
|  | 		selectedTests.add(match) | ||||||
|  |  | ||||||
|  | env = os.environ.copy() | ||||||
|  | env['TILDEFRIENDS'] = executable | ||||||
|  | env['LOGDIR'] = logs | ||||||
|  |  | ||||||
|  | def indent(text): | ||||||
|  | 	return '\n'.join('\t' + line for line in text.split('\n')) | ||||||
|  |  | ||||||
|  | passCount = 0 | ||||||
|  | failCount = 0 | ||||||
|  |  | ||||||
|  | for test in selectedTests: | ||||||
|  | 	if os.path.isdir(tmp): | ||||||
|  | 		shutil.rmtree(tmp) | ||||||
|  | 	if not os.path.isdir(tmp): | ||||||
|  | 		os.makedirs(tmp) | ||||||
|  |  | ||||||
|  | 	process = subprocess.Popen(['bash', test], stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=tmp, env=env) | ||||||
|  | 	stdout, stderr = process.communicate() | ||||||
|  | 	if process.returncode == 0: | ||||||
|  | 		print 'PASSED', test | ||||||
|  | 		passCount += 1 | ||||||
|  | 	else: | ||||||
|  | 		print 'FAILED', test | ||||||
|  | 		print 'RETURNED:', process.returncode | ||||||
|  | 		print 'STDOUT:' | ||||||
|  | 		print indent(stdout) | ||||||
|  | 		print 'STDERR:' | ||||||
|  | 		print indent(stderr) | ||||||
|  | 		failCount += 1 | ||||||
|  |  | ||||||
|  | 	if os.path.isdir(tmp): | ||||||
|  | 		shutil.rmtree(tmp) | ||||||
|  |  | ||||||
|  | print passCount, 'tests passed. ', failCount, 'tests failed.' | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user