summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/src/Makefile.am8
-rw-r--r--server/src/transactionparser.cc128
2 files changed, 132 insertions, 4 deletions
diff --git a/server/src/Makefile.am b/server/src/Makefile.am
index f970117..baecd73 100644
--- a/server/src/Makefile.am
+++ b/server/src/Makefile.am
@@ -103,6 +103,7 @@ EXTRA_DIST = \
TESTFILES = \
test_saxparser \
+ test_transactionparser \
test_versionstr \
test_macrolist \
test_queryhandlerpentominos \
@@ -139,6 +140,13 @@ TEST_SAXPARSER_FILES = \
test_saxparser: $(TEST_SAXPARSER_FILES)
@../../tools/test $(TEST_SAXPARSER_FILES) $(BASICFLAGS) $(PARSERFLAGS)
+TEST_TRANSACTIONPARSER_FILES = \
+ transactionparser.cc \
+ $(BASICFILES) \
+ $(PARSERFILES)
+test_transactionparser: $(TEST_TRANSACTIONPARSER_FILES)
+ @../../tools/test $(TEST_TRANSACTIONPARSER_FILES) $(BASICFLAGS) $(PARSERFLAGS)
+
TEST_VERSIONSTR_FILES = \
versionstr.cc \
$(BASICFILES)
diff --git a/server/src/transactionparser.cc b/server/src/transactionparser.cc
index 9e3d952..08c0a42 100644
--- a/server/src/transactionparser.cc
+++ b/server/src/transactionparser.cc
@@ -33,6 +33,34 @@
#include <string>
#include <map>
+#include "debug.h"
+#include "exception.h"
+
+static void error(const char* fmt, ...)
+{
+ PRACRO_ERR_LOG(transactionparser, "Error in TransactionParser: ");
+
+ {
+ va_list argp;
+ va_start(argp, fmt);
+ PRACRO_ERR_LOG_VA(macro, fmt, argp);
+ va_end(argp);
+
+ fprintf(stderr, "\n");
+ }
+
+ {
+ char *p;
+ va_list argp;
+ va_start(argp, fmt);
+ if(vasprintf(&p, fmt, argp) != -1) {
+ throw Exception("Error in TransactionParser: " + std::string(p));
+ free(p);
+ }
+ va_end(argp);
+ }
+}
+
TransactionParser::TransactionParser(Transaction *transaction)
{
this->transaction = transaction;
@@ -68,15 +96,107 @@ void TransactionParser::startTag(std::string name, std::map< std::string, std::s
}
if(name == "field") {
+ if(!transaction->commits.size()) error("Field without a commit tag!");
+ if(attributes.find("name") == attributes.end()) error("Field is missing 'name' attribute");
+ if(attributes.find("value") == attributes.end()) error("Field is missing 'value' attribute");
transaction->commits.back().fields[attributes["name"]] = attributes["value"];
}
}
void TransactionParser::parseError(char *buf, size_t len, std::string error, int lineno)
{
- fprintf(stderr, "TransactionParser error at line %d: %s\n", lineno, error.c_str());
- fprintf(stderr, "\tBuffer %u bytes: [", len);
+ PRACRO_ERR_LOG(transactionparser, "TransactionParser error at line %d: %s\n",
+ lineno, error.c_str());
+ PRACRO_ERR_LOG(transactionparser, "\tBuffer %u bytes: [", len);
if(fwrite(buf, len, 1, stderr) != len) {}
- fprintf(stderr, "]\n");
- fflush(stderr);
+ PRACRO_ERR_LOG(transactionparser, "]\n");
+
+ char *slineno;
+ if(asprintf(&slineno, " at line %d\n", lineno) != -1) {
+ throw Exception(error + slineno);
+ free(slineno);
+ }
}
+
+#ifdef TEST_TRANSACTIONPARSER
+
+static char xml_minimal[] =
+"<?xml version='1.0' encoding='UTF-8'?>\n"
+"<pracro/>\n"
+ ;
+
+static char xml_request[] =
+"<?xml version='1.0' encoding='UTF-8'?>\n"
+"<pracro version=\"1.0\" user=\"testuser\" cpr=\"1505050505\">\n"
+" <request macro=\"test\" course=\"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\" course=\"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_fail[] =
+"<?xml version='1.0' encoding='UTF-8'?>\n"
+"<pracro version=\"1.0\" user=\"testuser\" cpr=\"1505050505\">\n"
+" <request macro=\"test course=\"test\"/>\n"
+"</pracro>\n"
+ ;
+
+int main()
+{
+ // Test minimal
+ try {
+ Transaction transaction;
+ TransactionParser parser(&transaction);
+ parser.parse(xml_minimal, strlen(xml_minimal));
+ } catch(Exception &e) {
+ printf("ERROR: %s\n", e.what());
+ return 1;
+ }
+
+ // Test request
+ try {
+ Transaction transaction;
+ TransactionParser parser(&transaction);
+ parser.parse(xml_request, strlen(xml_request));
+ } catch(Exception &e) {
+ printf("ERROR: %s\n", e.what());
+ return 1;
+ }
+
+ // Test commit
+ try {
+ Transaction transaction;
+ TransactionParser parser(&transaction);
+ parser.parse(xml_commit, strlen(xml_commit));
+ } catch(Exception &e) {
+ printf("ERROR: %s\n", e.what());
+ return 1;
+ }
+
+ // Test parse error (should throw an exception)
+ try {
+ Transaction transaction;
+ TransactionParser parser(&transaction);
+ parser.parse(xml_fail, strlen(xml_fail));
+ } catch(Exception &e) {
+ printf("ERROR: %s\n", e.what());
+ goto onandon;
+ }
+ printf("We should fail here...\n");
+ return 1;
+
+ onandon:
+
+ return 0;
+}
+
+#endif/*TEST_TRANSACTIONPARSER*/