From a385737984c91bfb8d350bccec0d0d4d0117ca82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20=C3=96hrstr=C3=B6m?= Date: Fri, 10 Nov 2023 21:33:09 +0100 Subject: [PATCH] Better error messages when trying to load a driver file with errors. --- src/driver_dynamic.cc | 24 ++++++- test.sh | 3 + tests/test_bad_driver.sh | 152 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 176 insertions(+), 3 deletions(-) create mode 100755 tests/test_bad_driver.sh diff --git a/src/driver_dynamic.cc b/src/driver_dynamic.cc index 6f1c2fc..fd40e19 100644 --- a/src/driver_dynamic.cc +++ b/src/driver_dynamic.cc @@ -38,13 +38,17 @@ bool DriverDynamic::load(DriverInfo *di, const string &file) } const char *name = xmqGetString(doc, NULL, "/driver/name"); + if (!name) error("(dynamic) Error in %s cannot find driver/name\n" + " A driver file looks like: driver { name = abc123 ... }\n", file.c_str()); + if (!is_lowercase_alnum_text(name)) error("(dynamic) Error in %s invalid driver name \"%s\"\n" " The driver name must consist of lower case ascii a-z and digits 0-9.\n", file.c_str(), name); - const char *default_fields = xmqGetString(doc, NULL, "/driver/default_fields"); - const char *meter_type_s = xmqGetString(doc, NULL, "/driver/meter_type"); + if (!meter_type_s) error("(dynamic) Error in %s cannot find driver/meter_type\n" + " Remember to add: meter_type = ...\n", file.c_str()); + MeterType meter_type = toMeterType(meter_type_s); if (meter_type == MeterType::UnknownMeter) error("(dynamic) Error in %s unknown meter type %s\n" @@ -52,6 +56,12 @@ bool DriverDynamic::load(DriverInfo *di, const string &file) , file.c_str(), meter_type_s, availableMeterTypes()); + const char *default_fields = xmqGetString(doc, NULL, "/driver/default_fields"); + if (!default_fields) error("(dynamic) Error in %s cannot find driver/default_fields\n" + " Remember to add: default_fields = name,id,total_m3,timestamp\n" + " Where you change total_m3 to your meters most important field.\n", file.c_str()); + + verbose("(dynamic) loading %s %s\n", meter_type_s, name); di->setName(name); @@ -61,6 +71,11 @@ bool DriverDynamic::load(DriverInfo *di, const string &file) xmqForeach(doc, NULL, "/driver/detect/mvt", add_detect, di); + if (di->detect().size() == 0) error("(dynamic) Error in %s cannot find any driver/detect/mvt triplets\n" + " Remember to add: detect { mvt = AAA,05,07 mvt = AAA,06,07 ... }\n" + " The triplets contain MANUFACTURER,VERSION,TYPE\n" + " and you can see these values when listening to all meters.\n", file.c_str()); + di->setConstructor([](MeterInfo& mi, DriverInfo& di){ return shared_ptr(new DriverDynamic(mi, di)); }); return true; @@ -85,7 +100,10 @@ XMQProceed DriverDynamic::add_detect(XMQDoc *doc, XMQNode *detect, void *dd) string mvt = xmqGetString(doc, detect, "."); auto fields = splitString(mvt, ','); - if (fields.size() != 3) error("Cannot load driver %s, wrong number of fields in mvt triple.\n", di->name().str().c_str()); + if (fields.size() != 3) error("(dynamic) Error in %s, wrong number of fields in mvt triple: mvt = %s\n" + " There should be three fields, for example: mvt = AAA,07,05\n", + di->getDynamicFileName().c_str(), + mvt.c_str()); string mfct = fields[0]; int mfct_code = 0; diff --git a/test.sh b/test.sh index 6681cd5..951e2aa 100755 --- a/test.sh +++ b/test.sh @@ -178,6 +178,9 @@ if [ "$?" != "0" ]; then RC="1"; fi ./tests/test_loadable_drivers.sh $PROG if [ "$?" != "0" ]; then RC="1"; fi +./tests/test_bad_driver.sh $PROG +if [ "$?" != "0" ]; then RC="1"; fi + if [ -x ../additional_tests.sh ] then (cd ..; ./additional_tests.sh $PROG) diff --git a/tests/test_bad_driver.sh b/tests/test_bad_driver.sh new file mode 100755 index 0000000..55a43d2 --- /dev/null +++ b/tests/test_bad_driver.sh @@ -0,0 +1,152 @@ +#!/bin/sh + +PROG="$1" +TEST=testoutput +mkdir -p $TEST + +performCheck() { +if [ "$?" = "0" ] +then + cat $TEST/test_output.txt | sed 's/"timestamp":"....-..-..T..:..:..Z"/"timestamp":"1111-11-11T11:11:11Z"/' > $TEST/test_response.txt + diff $TEST/test_expected.txt $TEST/test_response.txt + if [ "$?" = "0" ] + then + echo "OK: $TESTNAME" + TESTRESULT="OK" + else + if [ "$USE_MELD" = "true" ] + then + meld $TEST/test_expected.txt $TEST/test_response.txt + fi + fi +else + echo "ERROR: $TESTNAME $0" + echo "wmbusmeters returned error code: $?" + cat $TEST/test_output.txt +fi +} + +######################################################################################################################## +######################################################################################################################## +######################################################################################################################## + +TESTNAME="Test no driver root" +TESTRESULT="ERROR" +cat > $TEST/driver.xmq < $TEST/test_expected.txt < $TEST/test_output.txt 2>&1 || true + +performCheck + +TESTNAME="Test bad driver name" +TESTRESULT="ERROR" +cat > $TEST/driver.xmq < $TEST/test_expected.txt < $TEST/test_output.txt 2>&1 || true + +performCheck + +TESTNAME="Test no meter_type" +TESTRESULT="ERROR" +cat > $TEST/driver.xmq < $TEST/test_expected.txt < $TEST/test_output.txt 2>&1 || true + +performCheck + +TESTNAME="Test bad meter_type" +TESTRESULT="ERROR" +cat > $TEST/driver.xmq < $TEST/test_expected.txt < $TEST/test_output.txt 2>&1 || true + +performCheck + +TESTNAME="Test no default_fields" +TESTRESULT="ERROR" +cat > $TEST/driver.xmq < $TEST/test_expected.txt < $TEST/test_output.txt 2>&1 || true + +performCheck + +TESTNAME="Test no detect mvt:s" +TESTRESULT="ERROR" +cat > $TEST/driver.xmq < $TEST/test_expected.txt < $TEST/test_output.txt 2>&1 || true + +performCheck + +TESTNAME="Test bad mvt" +TESTRESULT="ERROR" +cat > $TEST/driver.xmq < $TEST/test_expected.txt < $TEST/test_output.txt 2>&1 || true + +performCheck