From ccbcb92c5e45fb7f8c5fc488cdbbf79498af963a Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Mon, 30 Jan 2017 12:17:55 +0000 Subject: Fix case where operation returns void but has declared exception list (returnsdata == true, but returntype == null) --- icespider/compile/routeCompiler.cpp | 4 ++-- icespider/unittests/Jamfile.jam | 1 + icespider/unittests/test-api-impl.cpp | 8 ++++++++ icespider/unittests/test-api.ice | 11 +++++++++-- icespider/unittests/testApp.cpp | 29 ++++++++++++++++++++++++++--- icespider/unittests/testCompile.cpp | 4 ++-- icespider/unittests/testRoutes.json | 10 ++++++++++ 7 files changed, 58 insertions(+), 9 deletions(-) create mode 100644 icespider/unittests/test-api-impl.cpp diff --git a/icespider/compile/routeCompiler.cpp b/icespider/compile/routeCompiler.cpp index 31bf272..9bb3ba0 100644 --- a/icespider/compile/routeCompiler.cpp +++ b/icespider/compile/routeCompiler.cpp @@ -533,7 +533,7 @@ namespace IceSpider { RouteCompiler::addSingleOperation(FILE * output, RoutePtr r, Slice::OperationPtr o) const { auto operation = r->operation->substr(r->operation->find_last_of('.') + 1); - if (o->returnsData()) { + if (o->returnType()) { fprintbf(4, output, "auto _responseModel = prx0->%s(", operation); } else { @@ -552,7 +552,7 @@ namespace IceSpider { for(const auto & mutator : r->mutators) { fprintbf(4, output, "%s(request, _responseModel);\n", mutator); } - if (o->returnsData()) { + if (o->returnType()) { fprintbf(4, output, "request->response(this, _responseModel);\n"); } else { diff --git a/icespider/unittests/Jamfile.jam b/icespider/unittests/Jamfile.jam index 2c24e7d..4dcc450 100644 --- a/icespider/unittests/Jamfile.jam +++ b/icespider/unittests/Jamfile.jam @@ -120,6 +120,7 @@ run lib test-api : test-api.ice + test-api-impl.cpp : yes slicer diff --git a/icespider/unittests/test-api-impl.cpp b/icespider/unittests/test-api-impl.cpp new file mode 100644 index 0000000..7d5b556 --- /dev/null +++ b/icespider/unittests/test-api-impl.cpp @@ -0,0 +1,8 @@ +#include + +void +TestIceSpider::Ex::ice_print(std::ostream & s) const +{ + s << message; +} + diff --git a/icespider/unittests/test-api.ice b/icespider/unittests/test-api.ice index 53def7d..c89e0fc 100644 --- a/icespider/unittests/test-api.ice +++ b/icespider/unittests/test-api.ice @@ -14,10 +14,17 @@ module TestIceSpider { string s; }; + ["cpp:ice_print"] + exception Ex { + string message; + }; + interface TestApi { + int simple() throws Ex; + string simplei(int i); SomeModel index(); - SomeModel withParams(string s, int i); - void returnNothing(string s); + SomeModel withParams(string s, int i) throws Ex; + void returnNothing(string s) throws Ex; void complexParam(optional(0) string s, SomeModel m); }; interface DummyPlugin { diff --git a/icespider/unittests/testApp.cpp b/icespider/unittests/testApp.cpp index a95bca5..000f983 100644 --- a/icespider/unittests/testApp.cpp +++ b/icespider/unittests/testApp.cpp @@ -29,7 +29,7 @@ void forceEarlyChangeDir() BOOST_AUTO_TEST_CASE( testLoadConfiguration ) { - BOOST_REQUIRE_EQUAL(12, AdHoc::PluginManager::getDefault()->getAll().size()); + BOOST_REQUIRE_EQUAL(14, AdHoc::PluginManager::getDefault()->getAll().size()); } class CoreWithProps : public CoreWithDefaultRouter { @@ -85,8 +85,8 @@ BOOST_AUTO_TEST_CASE( testCoreSettings ) { BOOST_REQUIRE_EQUAL(5, routes.size()); BOOST_REQUIRE_EQUAL(1, routes[0].size()); - BOOST_REQUIRE_EQUAL(6, routes[1].size()); - BOOST_REQUIRE_EQUAL(1, routes[2].size()); + BOOST_REQUIRE_EQUAL(7, routes[1].size()); + BOOST_REQUIRE_EQUAL(2, routes[2].size()); BOOST_REQUIRE_EQUAL(2, routes[3].size()); BOOST_REQUIRE_EQUAL(2, routes[4].size()); } @@ -151,6 +151,9 @@ class TestSerice : public TestIceSpider::TestApi { void returnNothing(const std::string & s, const Ice::Current &) override { + if (s == "error") { + throw TestIceSpider::Ex("test error"); + } BOOST_REQUIRE_EQUAL(s, "some value"); } @@ -161,6 +164,16 @@ class TestSerice : public TestIceSpider::TestApi { BOOST_REQUIRE(m); BOOST_REQUIRE_EQUAL("some value", m->value); } + + Ice::Int simple(const Ice::Current &) override + { + return 1; + } + + std::string simplei(Ice::Int n, const Ice::Current &) override + { + return boost::lexical_cast(n); + } }; class TestApp : public CoreWithDefaultRouter { @@ -478,5 +491,15 @@ BOOST_AUTO_TEST_CASE( testCookies ) BOOST_REQUIRE_EQUAL(h["Status"], "200 OK"); } +BOOST_AUTO_TEST_CASE( testErrorHandler ) +{ + TestRequest requestDeleteItem(this, HttpMethod::DELETE, "/error"); + process(&requestDeleteItem); + auto h = requestDeleteItem.getResponseHeaders(); + BOOST_REQUIRE_EQUAL(h["Status"], "500 test error"); + requestDeleteItem.output.get(); + BOOST_REQUIRE(requestDeleteItem.output.eof()); +} + BOOST_AUTO_TEST_SUITE_END(); diff --git a/icespider/unittests/testCompile.cpp b/icespider/unittests/testCompile.cpp index 00862fa..1337d7d 100644 --- a/icespider/unittests/testCompile.cpp +++ b/icespider/unittests/testCompile.cpp @@ -36,7 +36,7 @@ BOOST_AUTO_TEST_CASE( testLoadConfiguration ) rc.applyDefaults(cfg, u); BOOST_REQUIRE_EQUAL("common", cfg->name); - BOOST_REQUIRE_EQUAL(12, cfg->routes.size()); + BOOST_REQUIRE_EQUAL(14, cfg->routes.size()); BOOST_REQUIRE_EQUAL("/", cfg->routes["index"]->path); BOOST_REQUIRE_EQUAL(HttpMethod::GET, cfg->routes["index"]->method); @@ -129,7 +129,7 @@ BOOST_AUTO_TEST_CASE( testLoad ) BOOST_TEST_INFO(dlerror()); BOOST_REQUIRE(lib); - BOOST_REQUIRE_EQUAL(12, AdHoc::PluginManager::getDefault()->getAll().size()); + BOOST_REQUIRE_EQUAL(14, AdHoc::PluginManager::getDefault()->getAll().size()); // smoke test (block ensure dlclose dones't cause segfault) { auto route = AdHoc::PluginManager::getDefault()->get("common::index"); diff --git a/icespider/unittests/testRoutes.json b/icespider/unittests/testRoutes.json index 2fd7aac..7f6dd70 100644 --- a/icespider/unittests/testRoutes.json +++ b/icespider/unittests/testRoutes.json @@ -21,6 +21,16 @@ "mutators": [ "testMutate" ], "operation": "TestIceSpider.TestApi.index" }, + "simple": { + "path": "/simple", + "method": "GET", + "operation": "TestIceSpider.TestApi.simple" + }, + "simplei": { + "path": "/simple/{i}", + "method": "GET", + "operation": "TestIceSpider.TestApi.simplei" + }, "item": { "path": "/view/{s}/{i}", "method": "GET", -- cgit v1.2.3