Better error messages when trying to load a driver file with errors.

pull/1090/head
Fredrik Öhrström 2023-11-10 21:33:09 +01:00
rodzic 22d6880385
commit a385737984
3 zmienionych plików z 176 dodań i 3 usunięć

Wyświetl plik

@ -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<Meter>(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;

Wyświetl plik

@ -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)

Wyświetl plik

@ -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 <<EOF
ddriver { name = Iffo }
EOF
cat > $TEST/test_expected.txt <<EOF
(dynamic) Error in testoutput/driver.xmq cannot find driver/name
A driver file looks like: driver { name = abc123 ... }
EOF
$PROG 1844AE4C4455223399077A55000000_041389E20100023B0000 Hej $TEST/driver.xmq 33225544 NO_KEY > $TEST/test_output.txt 2>&1 || true
performCheck
TESTNAME="Test bad driver name"
TESTRESULT="ERROR"
cat > $TEST/driver.xmq <<EOF
driver { name = Iffo }
EOF
cat > $TEST/test_expected.txt <<EOF
(dynamic) Error in testoutput/driver.xmq invalid driver name "Iffo"
The driver name must consist of lower case ascii a-z and digits 0-9.
EOF
$PROG 1844AE4C4455223399077A55000000_041389E20100023B0000 Hej $TEST/driver.xmq 33225544 NO_KEY > $TEST/test_output.txt 2>&1 || true
performCheck
TESTNAME="Test no meter_type"
TESTRESULT="ERROR"
cat > $TEST/driver.xmq <<EOF
driver { name = iffo }
EOF
cat > $TEST/test_expected.txt <<EOF
(dynamic) Error in testoutput/driver.xmq cannot find driver/meter_type
Remember to add: meter_type = ...
EOF
$PROG 1844AE4C4455223399077A55000000_041389E20100023B0000 Hej $TEST/driver.xmq 33225544 NO_KEY > $TEST/test_output.txt 2>&1 || true
performCheck
TESTNAME="Test bad meter_type"
TESTRESULT="ERROR"
cat > $TEST/driver.xmq <<EOF
driver { name = iffo meter_type = gurka }
EOF
cat > $TEST/test_expected.txt <<EOF
(dynamic) Error in testoutput/driver.xmq unknown meter type gurka
Available meter types are:
DoorWindowDetector
ElectricityMeter
GasMeter
HeatCostAllocationMeter
HeatMeter
HeatCoolingMeter
PulseCounter
SmokeDetector
TempHygroMeter
WaterMeter
PressureSensor
EOF
$PROG 1844AE4C4455223399077A55000000_041389E20100023B0000 Hej $TEST/driver.xmq 33225544 NO_KEY > $TEST/test_output.txt 2>&1 || true
performCheck
TESTNAME="Test no default_fields"
TESTRESULT="ERROR"
cat > $TEST/driver.xmq <<EOF
driver { name = iffo meter_type = WaterMeter }
EOF
cat > $TEST/test_expected.txt <<EOF
(dynamic) Error in testoutput/driver.xmq cannot find driver/default_fields
Remember to add: default_fields = name,id,total_m3,timestamp
Where you change total_m3 to your meters most important field.
EOF
$PROG 1844AE4C4455223399077A55000000_041389E20100023B0000 Hej $TEST/driver.xmq 33225544 NO_KEY > $TEST/test_output.txt 2>&1 || true
performCheck
TESTNAME="Test no detect mvt:s"
TESTRESULT="ERROR"
cat > $TEST/driver.xmq <<EOF
driver { name = iffo meter_type = WaterMeter default_fields = name,id,total_m3,timestamp }
EOF
cat > $TEST/test_expected.txt <<EOF
(dynamic) Error in testoutput/driver.xmq cannot find any driver/detect/mvt triplets
Remember to add: detect { mvt = AAA,05,07 mvt = AAA,06,07 ... }
The triplets contain MANUFACTURER,VERSION,TYPE
and you can see these values when listening to all meters.
EOF
$PROG 1844AE4C4455223399077A55000000_041389E20100023B0000 Hej $TEST/driver.xmq 33225544 NO_KEY > $TEST/test_output.txt 2>&1 || true
performCheck
TESTNAME="Test bad mvt"
TESTRESULT="ERROR"
cat > $TEST/driver.xmq <<EOF
driver { name = iffo meter_type = WaterMeter default_fields = name,id,total_m3,timestamp
detect { mvt = alfa }
}
EOF
cat > $TEST/test_expected.txt <<EOF
(dynamic) Error in testoutput/driver.xmq, wrong number of fields in mvt triple: mvt = alfa
There should be three fields, for example: mvt = AAA,07,05
EOF
$PROG 1844AE4C4455223399077A55000000_041389E20100023B0000 Hej $TEST/driver.xmq 33225544 NO_KEY > $TEST/test_output.txt 2>&1 || true
performCheck