summaryrefslogtreecommitdiff
path: root/server/src/connection.cc
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/connection.cc')
-rw-r--r--server/src/connection.cc242
1 files changed, 226 insertions, 16 deletions
diff --git a/server/src/connection.cc b/server/src/connection.cc
index 36c030e..ed5a7a9 100644
--- a/server/src/connection.cc
+++ b/server/src/connection.cc
@@ -40,13 +40,23 @@ static std::string error_box(std::string message)
return errorbox;
}
-Connection::Connection(Environment &e, std::string sid, bool c)
+#ifdef TEST_CONNECTION
+static bool did_commit = false;
+#endif
+
+Connection::Connection(Environment &e, std::string sid, bool c, bool d)
: env(e), parser(&transaction)
{
PRACRO_DEBUG(connection, "[%p] CREATE\n", this);
sessionid = sid;
- commit = c;
+ docommit = c;
+ dodiscard = d;
+
+#ifdef TEST_CONNECTION
+ did_commit = false;
+#endif
+
}
Connection::~Connection()
@@ -54,6 +64,27 @@ Connection::~Connection()
PRACRO_DEBUG(connection, "[%p] DESTROY\n", this);
}
+void Connection::commit(Session *session)
+{
+ if(docommit) {
+ session->commit();
+ env.sessions.deleteSession(session->id());
+ sessionid = "";
+#ifdef TEST_CONNECTION
+ did_commit = true;
+#endif
+ }
+}
+
+void Connection::discard(Session *session)
+{
+ if(dodiscard) {
+ session->discard();
+ env.sessions.deleteSession(session->id());
+ sessionid = "";
+ }
+}
+
bool Connection::handle(const char *data, size_t size)
{
Session *session = NULL;
@@ -76,20 +107,22 @@ bool Connection::handle(const char *data, size_t size)
sessionid = session->id();
- if(!data || !size) return true;
-
try {
+
+ if(!data || !size) {
+ commit(session);
+ discard(session);
+ return true;
+ }
+
if(parser.parse(data, size)) {
{
SessionAutolock lock(*session);
response = handleTransaction(transaction, env, *session);
}
- if(commit) {
- session->commit();
- env.sessions.deleteSession(session->id());
- }
-
+ commit(session);
+ discard(session);
return true;
}
} catch(...) {
@@ -112,17 +145,194 @@ std::string Connection::getSessionID()
}
#ifdef TEST_CONNECTION
-//Additional dependency files
-//deps:
-//Required cflags (autoconf vars may be used)
-//cflags:
-//Required link options (autoconf vars may be used)
-//libs:
+//deps: debug.cc transactionparser.cc session.cc xml_encode_decode.cc saxparser.cc transactionhandler.cc journalwriter.cc mutex.cc templateparser.cc exception.cc configuration.cc macroparser.cc semaphore.cc entitylist.cc luaquerymapper.cc inotify.cc log.cc queryhandlerpentominos.cc widgetgenerator.cc queryhandlerpracro.cc resumeparser.cc journal_commit.cc versionstr.cc luaresume.cc luautil.cc artefact.cc environment.cc database.cc macrolist.cc templatelist.cc pracrodao.cc templateheaderparser.cc macroheaderparser.cc pracrodaotest.cc pracrodaopgsql.cc
+//cflags: -DWITHOUT_DATABASE -DWITHOUT_ARTEFACT -I.. $(LUA_CFLAGS) $(EXPAT_CFLAGS) $(PTHREAD_CFLAGS) $(PQXX_CXXFLAGS)
+//libs: $(LUA_LIBS) $(EXPAT_LIBS) $(PTHREAD_LIBS) $(PQXX_LIBS)
#include "test.h"
+static char xml_request[] =
+"<?xml version='1.0' encoding='UTF-8'?>\n"
+"<pracro version=\"1.0\" user=\"testuser\" cpr=\"1505050505\">\n"
+" <request macro=\"test\" template=\"test\"/>\n"
+"</pracro>\n"
+ ;
+
+static char xml_commit[] =
+"<?xml version='1.0' encoding='UTF-8'?>\n"
+"<pracro version=\"1.0\" user=\"testuser\" cpr=\"1505050505\">\n"
+" <commit version=\"\" macro=\"referral\" template=\"amd_forunders\" >\n"
+" <field value=\"Some docs\" name=\"referral.doctor\"/>\n"
+" <field value=\"DIMS\" name=\"referral.diagnosecode\"/>\n"
+" <field value=\"Avs\" name=\"referral.diagnose\"/>\n"
+" </commit>\n"
+"</pracro>\n"
+ ;
+
+static char xml_commit_p1[] =
+"<?xml version='1.0' encoding='UTF-8'?>\n"
+"<pracro version=\"1.0\" user=\"testuser\" cpr=\"1505050505\">\n"
+" <commit version=\"\" macro=\"referral\" template=\"amd_forunders\" >\n"
+" <field value=\"Some docs\" name=\"referral.doctor\"/>\n"
+" <field value=\"DIMS\" name=\"referral.diagn"
+ ;
+
+static char xml_commit_p2[] =
+"ose\"/>\n"
+" </commit>\n"
+"</pracro>\n"
+ ;
+
TEST_BEGIN;
-// TODO: Put some testcode here (see test.h for usable macros).
+Environment env;
+std::string sid;
+
+// Without data
+{
+ Connection con(env, "", false);
+ TEST_TRUE(con.handle("", 0), "Test handler return value.");
+ TEST_EQUAL_STR(con.getResponse(), "", "Test response value.");
+ sid = con.getSessionID();
+ TEST_NOTEQUAL_STR(sid, "", "Test new session id.");
+ TEST_FALSE(did_commit, "No commit.");
+}
+
+{
+ Connection con(env, sid, false);
+ TEST_TRUE(con.handle("", 0), "Test handler return value.");
+ TEST_EQUAL_STR(con.getResponse(), "", "Test response value.");
+ TEST_NOTEQUAL_STR(con.getSessionID(), "", "Test existing session id.");
+ TEST_EQUAL_STR(con.getSessionID(), sid, "Test existing session id.");
+ TEST_FALSE(did_commit, "No commit.");
+}
+
+{
+ Connection con(env, sid, true);
+ TEST_TRUE(con.handle("", 0), "Test handler return value.");
+ TEST_EQUAL_STR(con.getResponse(), "", "Test response value.");
+ TEST_EQUAL_STR(con.getSessionID(), "", "Test existing session id.");
+ TEST_TRUE(did_commit, "Commit.");
+}
+
+{
+ Connection con(env, sid, false);
+ TEST_TRUE(con.handle("", 0), "Test handler return value.");
+ TEST_EQUAL_STR(con.getResponse(), "", "Test response value.");
+ TEST_NOTEQUAL_STR(con.getSessionID(), "", "Test existing session id.");
+ TEST_NOTEQUAL_STR(con.getSessionID(), sid, "Test new session id.");
+ TEST_FALSE(did_commit, "No commit.");
+}
+
+// With commit partial data
+{
+ Connection con(env, "", false);
+ TEST_FALSE(con.handle(xml_commit_p1, sizeof(xml_commit_p1) - 1),
+ "Test handler return value.");
+ sid = con.getSessionID();
+ TEST_NOTEQUAL_STR(sid, "", "Test new session id.");
+ TEST_FALSE(did_commit, "No commit.");
+ TEST_EQUAL_STR(con.getResponse(), "", "Test response value.");
+ TEST_TRUE(con.handle(xml_commit_p2, sizeof(xml_commit_p2) - 1),
+ "Test handler return value.");
+ TEST_EQUAL_STR(con.getSessionID(), sid, "Test session id.");
+ TEST_NOTEQUAL_STR(con.getResponse(), "", "Test response value.");
+ TEST_FALSE(did_commit, "No commit.");
+}
+
+// With commit partial data and journal commit
+{
+ Connection con(env, "", true);
+ TEST_FALSE(con.handle(xml_commit_p1, sizeof(xml_commit_p1) - 1),
+ "Test handler return value.");
+ sid = con.getSessionID();
+ TEST_NOTEQUAL_STR(sid, "", "Test new session id.");
+ TEST_EQUAL_STR(con.getResponse(), "", "Test response value.");
+ TEST_FALSE(did_commit, "No commit.");
+ TEST_TRUE(con.handle(xml_commit_p2, sizeof(xml_commit_p2) - 1),
+ "Test handler return value.");
+ TEST_EQUAL_STR(con.getSessionID(), "", "Test session id.");
+ TEST_TRUE(did_commit, "No commit.");
+ TEST_NOTEQUAL_STR(con.getResponse(), "", "Test response value.");
+}
+
+// With commit data
+{
+ Connection con(env, "", false);
+ TEST_TRUE(con.handle(xml_commit, sizeof(xml_commit) - 1),
+ "Test handler return value.");
+ sid = con.getSessionID();
+ TEST_NOTEQUAL_STR(sid, "", "Test new session id.");
+ TEST_NOTEQUAL_STR(con.getResponse(), "", "Test response value.");
+ TEST_FALSE(did_commit, "No commit.");
+}
+
+{
+ Connection con(env, sid, false);
+ TEST_TRUE(con.handle(xml_commit, sizeof(xml_commit) - 1),
+ "Test handler return value.");
+ TEST_NOTEQUAL_STR(con.getResponse(), "", "Test response value.");
+ TEST_NOTEQUAL_STR(con.getSessionID(), "", "Test existing session id.");
+ TEST_EQUAL_STR(con.getSessionID(), sid, "Test existing session id.");
+ TEST_FALSE(did_commit, "No commit.");
+}
+
+{
+ Connection con(env, sid, true);
+ TEST_TRUE(con.handle(xml_commit, sizeof(xml_commit) - 1),
+ "Test handler return value.");
+ TEST_NOTEQUAL_STR(con.getResponse(), "", "Test response value.");
+ TEST_EQUAL_STR(con.getSessionID(), "", "Test existing session id.");
+ TEST_TRUE(did_commit, "Commit.");
+}
+
+{
+ Connection con(env, sid, false);
+ TEST_TRUE(con.handle(xml_commit, sizeof(xml_commit) - 1),
+ "Test handler return value.");
+ TEST_NOTEQUAL_STR(con.getResponse(), "", "Test response value.");
+ TEST_NOTEQUAL_STR(con.getSessionID(), "", "Test existing session id.");
+ TEST_NOTEQUAL_STR(con.getSessionID(), sid, "Test new session id.");
+ TEST_FALSE(did_commit, "No commit.");
+}
+
+// With request data
+{
+ Connection con(env, "", false);
+ TEST_TRUE(con.handle(xml_request, sizeof(xml_request) - 1),
+ "Test handler return value.");
+ TEST_NOTEQUAL_STR(con.getResponse(), "", "Test response value.");
+ sid = con.getSessionID();
+ TEST_NOTEQUAL_STR(sid, "", "Test new session id.");
+ TEST_FALSE(did_commit, "No commit.");
+}
+
+{
+ Connection con(env, sid, false);
+ TEST_TRUE(con.handle(xml_request, sizeof(xml_request) - 1),
+ "Test handler return value.");
+ TEST_NOTEQUAL_STR(con.getResponse(), "", "Test response value.");
+ TEST_NOTEQUAL_STR(con.getSessionID(), "", "Test existing session id.");
+ TEST_EQUAL_STR(con.getSessionID(), sid, "Test existing session id.");
+ TEST_FALSE(did_commit, "No commit.");
+}
+
+{
+ Connection con(env, sid, true);
+ TEST_TRUE(con.handle(xml_request, sizeof(xml_request) - 1),
+ "Test handler return value.");
+ TEST_NOTEQUAL_STR(con.getResponse(), "", "Test response value.");
+ TEST_EQUAL_STR(con.getSessionID(), "", "Test existing session id.");
+ TEST_TRUE(did_commit, "Commit.");
+}
+
+{
+ Connection con(env, sid, false);
+ TEST_TRUE(con.handle(xml_request, sizeof(xml_request) - 1),
+ "Test handler return value.");
+ TEST_NOTEQUAL_STR(con.getSessionID(), "", "Test existing session id.");
+ TEST_NOTEQUAL_STR(con.getSessionID(), sid, "Test new session id.");
+ TEST_FALSE(did_commit, "No commit.");
+}
TEST_END;