diff --git a/configure.py b/configure.py index 61cff36565..df941147a0 100755 --- a/configure.py +++ b/configure.py @@ -72,6 +72,7 @@ tests = [ 'tests/timertest', 'tests/tcp_test', 'tests/futures_test', + 'tests/smp_test', 'tests/udp_server', 'tests/udp_client', 'tests/blkdiscard_test', @@ -194,6 +195,7 @@ deps = { 'tests/tcp_test': ['tests/tcp_test.cc'] + core + libnet, 'tests/timertest': ['tests/timertest.cc'] + core, 'tests/futures_test': ['tests/futures_test.cc'] + core, + 'tests/smp_test': ['tests/smp_test.cc'] + core, 'tests/udp_server': ['tests/udp_server.cc'] + core + libnet, 'tests/udp_client': ['tests/udp_client.cc'] + core + libnet, 'tests/tcp_server': ['tests/tcp_server.cc'] + core + libnet, diff --git a/test.py b/test.py index ca6f9325f4..4359a8198f 100755 --- a/test.py +++ b/test.py @@ -6,6 +6,7 @@ import subprocess all_tests = [ 'futures_test', + 'smp_test', 'memcached/test_ascii_parser', 'sstring_test', 'output_stream_test', diff --git a/tests/smp_test.cc b/tests/smp_test.cc new file mode 100644 index 0000000000..6234c23917 --- /dev/null +++ b/tests/smp_test.cc @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2014 Cloudius Systems, Ltd. + */ + +#include "core/reactor.hh" +#include "core/app-template.hh" +#include "core/print.hh" + +future test_smp_call() { + return smp::submit_to(1, [] { + return make_ready_future(3); + }).then([] (int ret) { + return make_ready_future(ret == 3); + }); +} + +struct nasty_exception {}; + +future test_smp_exception() { + print("1\n"); + return smp::submit_to(1, [] { + print("2\n"); + auto x = make_exception_future(nasty_exception()); + print("3\n"); + return x; + }).then_wrapped([] (future result) { + print("4\n"); + try { + result.get(); + return make_ready_future(false); // expected an exception + } catch (nasty_exception&) { + // all is well + return make_ready_future(true); + } catch (...) { + // incorrect exception type + return make_ready_future(false); + } + }); +} + +int tests, fails; + +future<> +report(sstring msg, future&& result) { + return std::move(result).then([msg] (bool result) { + print("%s: %s\n", (result ? "PASS" : "FAIL"), msg); + tests += 1; + fails += !result; + }); +} + +int main(int ac, char** av) { + return app_template().run(ac, av, [] { + return report("smp call", test_smp_call()).then([] { + return report("smp exception", test_smp_exception()); + }).then([] { + print("\n%d tests / %d failures\n", tests, fails); + engine.exit(fails ? 1 : 0); + }); + }); +}