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:
Cory McWilliams 2016-03-13 13:37:58 +00:00
parent ebe54b6117
commit 7a16a1d65c
15 changed files with 97 additions and 124 deletions

View File

@ -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) {

View File

@ -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();

View File

@ -55,3 +55,8 @@ TaskTryCatch::~TaskTryCatch() {
} }
} }
} }
bool TaskTryCatch::hasCaught()
{
return _tryCatch.HasCaught();
}

View File

@ -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;

View File

@ -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;
} }

View File

@ -4,4 +4,4 @@ cat > test.js << EOF
print("hi"); print("hi");
EOF EOF
$SANDBOXOS test.js $TILDEFRIENDS test.js

View File

@ -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

View File

@ -16,4 +16,4 @@ print("I am the child process.");
exit(0); exit(0);
EOF EOF
$SANDBOXOS test.js $TILDEFRIENDS test.js

View File

@ -24,4 +24,4 @@ exports = {
} }
EOF EOF
$SANDBOXOS test.js $TILDEFRIENDS test.js

View File

@ -23,4 +23,4 @@ exports = {
} }
EOF EOF
$SANDBOXOS test.js $TILDEFRIENDS test.js

View File

@ -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

View File

@ -26,4 +26,4 @@ exports = {
} }
EOF EOF
$SANDBOXOS test.js $TILDEFRIENDS test.js

View File

@ -31,4 +31,4 @@ if (expected.length) {
} }
EOF EOF
$SANDBOXOS test.js $TILDEFRIENDS test.js

View File

@ -6,4 +6,4 @@ task.activate.bind(null).apply();
exit(0); exit(0);
EOF EOF
$SANDBOXOS test.js $TILDEFRIENDS test.js

View File

@ -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.'