From 3a5b85a1e30ee40726c7c4660a72f0c9341a85af Mon Sep 17 00:00:00 2001 From: Dhruv Date: Tue, 22 Oct 2024 10:05:18 -0400 Subject: [PATCH] Added SQL Triggers that check for undefined types in attributes,command arguments and event fields for a custom XML when inserted into a session. Add session notice as required (#1453) Added SQL Triggers that check for undefined types in attributes ,command arguments and event fields for a custom XML when inserted into a session. Add session notice as required Added relevant tests Corrected typo in package.json --- package.json | 2 +- src-electron/db/zap-schema.sql | 515 +++++++++++++++++- test/custom-matter-xml.test.js | 20 + .../custom-cluster/matter-bad-custom.xml | 4 +- 4 files changed, 527 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index b740acb01e..f5be803123 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "zapall": "node src-script/zap-start.js --logToStdout --zcl ./test/resource/meta/zcl.json --zcl ./zcl-builtin/silabs/zcl.json --zcl ./zcl-builtin/matter/zcl.json --gen ./test/gen-template/zigbee/gen-templates.json --gen ./test/gen-template/matter/gen-test.json --gen ./test/resource/meta/gen-test.json", "zapmultiprotocol": "node src-script/zap-start.js --logToStdout --zcl ./zcl-builtin/silabs/zcl.json --zcl ./zcl-builtin/matter/zcl-with-test-extensions.json --gen ./test/gen-template/zigbee/gen-templates.json --gen ./test/gen-template/matter/gen-test.json", "zapzigbee": "node src-script/zap-start.js --logToStdout --zcl ./zcl-builtin/silabs/zcl.json --gen ./test/gen-template/zigbee/gen-templates.json", - "zapmatter": "node src-script/zap-start.js --logToStdoutc --zcl ./zcl-builtin/matter/zcl.json --gen ./test/gen-template/matter/gen-test.json", + "zapmatter": "node src-script/zap-start.js --logToStdout --zcl ./zcl-builtin/matter/zcl.json --gen ./test/gen-template/matter/gen-test.json", "zapmeta": "node src-script/zap-start.js --logToStdout --zcl ./test/resource/meta/zcl.json --gen ./test/resource/meta/gen-test.json --in ./test/resource/test-meta.zap", "zaphelp": "node src-script/zap-start.js --help", "zap-dotdot": "node src-script/zap-start.js --logToStdout --zcl ./zcl-builtin/dotdot/library.xml -g ./test/gen-template/dotdot/dotdot-templates.json", diff --git a/src-electron/db/zap-schema.sql b/src-electron/db/zap-schema.sql index a5c598537c..6c82873550 100644 --- a/src-electron/db/zap-schema.sql +++ b/src-electron/db/zap-schema.sql @@ -3385,6 +3385,14 @@ SET DIRTY = 1 WHERE SESSION_ID = OLD.SESSION_REF; END; +/* +____ _ _ ____ ___ ____ _ _ _ _ _ _ _ ___ ____ _ ____ ____ ____ ____ ____ +| | | [__ | | | |\/| \/ |\/| | | |__/ | | __ | __ |___ |__/ [__ +|___ |__| ___] | |__| | | _/\_ | | |___ | | \ | |__] |__] |___ | \ ___] + +Custom XML specific triggers +*/ + /* Triggers that deal with code conflicts in custom xml */ /* Trigger that deals with code conflicts in clusters when new session package is inserted */ @@ -3550,7 +3558,7 @@ BEGIN END; -/* Trigger that deals wuth code conflicts in attributes when a session package is inserted */ +/* Trigger that deals with code conflicts in attributes when a session package is inserted */ CREATE TRIGGER ATTRIBUTE_CODE_CONFLICT_MESSAGE_ON_INSERT AFTER INSERT ON SESSION_PACKAGE WHEN @@ -3881,8 +3889,498 @@ BEGIN p.PACKAGE_ID <> p2.PACKAGE_ID; END; -/* Trigger that deletes relevant code conflict session_notice entries when a session package is disabled */ -CREATE TRIGGER CODE_CONFLICT_DELETE_ON_DISABLE +/* Trigger that checks for undefined types in attributes when a session package is inserted */ +CREATE TRIGGER ATTRIBUTE_UNDEFINED_TYPE_MESSAGE_ON_INSERT +AFTER INSERT ON SESSION_PACKAGE +WHEN + EXISTS( + SELECT + 1 + FROM + SESSION_PACKAGE spk + JOIN + PACKAGE p + ON + spk.PACKAGE_REF = p.PACKAGE_ID + WHERE + p.TYPE = 'zcl-xml-standalone' + AND + spk.package_ref = NEW.package_ref + AND + NEW.ENABLED = true + ) +BEGIN + INSERT INTO SESSION_NOTICE( + SESSION_REF, + NOTICE_TYPE, + NOTICE_MESSAGE, + NOTICE_SEVERITY, + DISPLAY, + SEEN + ) + SELECT + spt.SESSION_REF, + 'ERROR', + 'Undefined Data Type ' || a.type ||' in Attribute ' || a.name || ' in ' || p.PATH, + 2, + 1, + 0 + FROM + ATTRIBUTE a + INNER JOIN + PACKAGE p + ON + a.PACKAGE_REF = p.PACKAGE_ID + INNER JOIN + SESSION_PACKAGE spk + ON + p.PACKAGE_ID = spk.PACKAGE_REF + INNER JOIN + SESSION_PARTITION spt + ON + spk.SESSION_PARTITION_REF = spt.SESSION_PARTITION_ID + WHERE + spk.SESSION_PARTITION_REF = NEW.SESSION_PARTITION_REF + AND + spk.PACKAGE_REF = NEW.PACKAGE_REF + AND NOT EXISTS( + SELECT + 1 + FROM + DATA_TYPE dt + INNER JOIN + PACKAGE p2 + ON + dt.PACKAGE_REF = p2.PACKAGE_ID + INNER JOIN + SESSION_PACKAGE spk2 + ON + p2.PACKAGE_ID = spk2.PACKAGE_REF + INNER JOIN + SESSION_PARTITION spt2 + ON + spk2.SESSION_PARTITION_REF = spt2.SESSION_PARTITION_ID + WHERE + spt2.SESSION_REF = spt.SESSION_REF + AND + LOWER(dt.NAME) = LOWER(a.TYPE) + ); +END; + +/* Trigger that checks for undefined types in attributes when a session package is re-enabled*/ +CREATE TRIGGER ATTRIBUTE_UNDEFINED_TYPE_MESSAGE_ON_UPDATE +AFTER UPDATE ON SESSION_PACKAGE +WHEN + EXISTS( + SELECT + 1 + FROM + SESSION_PACKAGE spk + JOIN + PACKAGE p + ON + spk.PACKAGE_REF = p.PACKAGE_ID + WHERE + p.TYPE = 'zcl-xml-standalone' + AND + spk.package_ref = NEW.package_ref + AND + OLD.ENABLED = false + AND + NEW.ENABLED = true + ) +BEGIN + INSERT INTO SESSION_NOTICE( + SESSION_REF, + NOTICE_TYPE, + NOTICE_MESSAGE, + NOTICE_SEVERITY, + DISPLAY, + SEEN + ) + SELECT + spt.SESSION_REF, + 'ERROR', + 'Undefined Data Type ' || a.type ||' in Attribute ' || a.name || ' in ' || p.PATH, + 2, + 1, + 0 + FROM + ATTRIBUTE a + INNER JOIN + PACKAGE p + ON + a.PACKAGE_REF = p.PACKAGE_ID + INNER JOIN + SESSION_PACKAGE spk + ON + p.PACKAGE_ID = spk.PACKAGE_REF + INNER JOIN + SESSION_PARTITION spt + ON + spk.SESSION_PARTITION_REF = spt.SESSION_PARTITION_ID + WHERE + spk.SESSION_PARTITION_REF = NEW.SESSION_PARTITION_REF + AND + spk.PACKAGE_REF = NEW.PACKAGE_REF + AND NOT EXISTS( + SELECT + 1 + FROM + DATA_TYPE dt + INNER JOIN + PACKAGE p2 + ON + dt.PACKAGE_REF = p2.PACKAGE_ID + INNER JOIN + SESSION_PACKAGE spk2 + ON + p2.PACKAGE_ID = spk2.PACKAGE_REF + INNER JOIN + SESSION_PARTITION spt2 + ON + spk2.SESSION_PARTITION_REF = spt2.SESSION_PARTITION_ID + WHERE + spt2.SESSION_REF = spt.SESSION_REF + AND + LOWER(dt.NAME) = LOWER(a.TYPE) + ); +END; + +/* Trigger that checks for undefined types in command args when a session package is inserted */ +CREATE TRIGGER COMMAND_UNDEFINED_TYPE_MESSAGE_ON_INSERT +AFTER INSERT ON SESSION_PACKAGE +WHEN + EXISTS( + SELECT + 1 + FROM + SESSION_PACKAGE spk + JOIN + PACKAGE p + ON + spk.PACKAGE_REF = p.PACKAGE_ID + WHERE + p.TYPE = 'zcl-xml-standalone' + AND + spk.package_ref = NEW.package_ref + AND + NEW.ENABLED = true + ) +BEGIN + INSERT INTO SESSION_NOTICE( + SESSION_REF, + NOTICE_TYPE, + NOTICE_MESSAGE, + NOTICE_SEVERITY, + DISPLAY, + SEEN + ) + SELECT + spt.SESSION_REF, + 'ERROR', + 'Undefined Data Type ' || a.type ||' in Command Argument ' || a.name || ' for Command '|| c.NAME || ' in ' || p.PATH, + 2, + 1, + 0 + FROM + COMMAND_ARG a + INNER JOIN + COMMAND c + ON + a.COMMAND_REF = c.COMMAND_ID + INNER JOIN + PACKAGE p + ON + c.PACKAGE_REF = p.PACKAGE_ID + INNER JOIN + SESSION_PACKAGE spk + ON + p.PACKAGE_ID = spk.PACKAGE_REF + INNER JOIN + SESSION_PARTITION spt + ON + spk.SESSION_PARTITION_REF = spt.SESSION_PARTITION_ID + WHERE + spk.SESSION_PARTITION_REF = NEW.SESSION_PARTITION_REF + AND + spk.PACKAGE_REF = NEW.PACKAGE_REF + AND NOT EXISTS( + SELECT + 1 + FROM + DATA_TYPE dt + INNER JOIN + PACKAGE p2 + ON + dt.PACKAGE_REF = p2.PACKAGE_ID + INNER JOIN + SESSION_PACKAGE spk2 + ON + p2.PACKAGE_ID = spk2.PACKAGE_REF + INNER JOIN + SESSION_PARTITION spt2 + ON + spk2.SESSION_PARTITION_REF = spt2.SESSION_PARTITION_ID + WHERE + spt2.SESSION_REF = spt.SESSION_REF + AND + LOWER(dt.NAME) = LOWER(a.TYPE) + ); +END; + +/* Trigger that checks for undefined types in command args when a session package is re-enabled */ +CREATE TRIGGER COMMAND_UNDEFINED_TYPE_MESSAGE_ON_UPDATE +AFTER UPDATE ON SESSION_PACKAGE +WHEN + EXISTS( + SELECT + 1 + FROM + SESSION_PACKAGE spk + JOIN + PACKAGE p + ON + spk.PACKAGE_REF = p.PACKAGE_ID + WHERE + p.TYPE = 'zcl-xml-standalone' + AND + spk.package_ref = NEW.package_ref + AND + OLD.ENABLED = false + AND + NEW.ENABLED = true + ) +BEGIN + INSERT INTO SESSION_NOTICE( + SESSION_REF, + NOTICE_TYPE, + NOTICE_MESSAGE, + NOTICE_SEVERITY, + DISPLAY, + SEEN + ) + SELECT + spt.SESSION_REF, + 'ERROR', + 'Undefined Data Type ' || a.type ||' in Command Argument ' || a.name || ' for Command '|| c.NAME || ' in ' || p.PATH, + 2, + 1, + 0 + FROM + COMMAND_ARG a + INNER JOIN + COMMAND c + ON + a.COMMAND_REF = c.COMMAND_ID + INNER JOIN + PACKAGE p + ON + c.PACKAGE_REF = p.PACKAGE_ID + INNER JOIN + SESSION_PACKAGE spk + ON + p.PACKAGE_ID = spk.PACKAGE_REF + INNER JOIN + SESSION_PARTITION spt + ON + spk.SESSION_PARTITION_REF = spt.SESSION_PARTITION_ID + WHERE + spk.SESSION_PARTITION_REF = NEW.SESSION_PARTITION_REF + AND + spk.PACKAGE_REF = NEW.PACKAGE_REF + AND NOT EXISTS( + SELECT + 1 + FROM + DATA_TYPE dt + INNER JOIN + PACKAGE p2 + ON + dt.PACKAGE_REF = p2.PACKAGE_ID + INNER JOIN + SESSION_PACKAGE spk2 + ON + p2.PACKAGE_ID = spk2.PACKAGE_REF + INNER JOIN + SESSION_PARTITION spt2 + ON + spk2.SESSION_PARTITION_REF = spt2.SESSION_PARTITION_ID + WHERE + spt2.SESSION_REF = spt.SESSION_REF + AND + LOWER(dt.NAME) = LOWER(a.TYPE) + ); +END; + +/* Trigger that checks for undefined types in event fields when a session package is inserted */ +CREATE TRIGGER EVENT_UNDEFINED_TYPE_MESSAGE_ON_INSERT +AFTER INSERT ON SESSION_PACKAGE +WHEN + EXISTS( + SELECT + 1 + FROM + SESSION_PACKAGE spk + JOIN + PACKAGE p + ON + spk.PACKAGE_REF = p.PACKAGE_ID + WHERE + p.TYPE = 'zcl-xml-standalone' + AND + spk.package_ref = NEW.package_ref + AND + NEW.ENABLED = true + ) +BEGIN + INSERT INTO SESSION_NOTICE( + SESSION_REF, + NOTICE_TYPE, + NOTICE_MESSAGE, + NOTICE_SEVERITY, + DISPLAY, + SEEN + ) + SELECT + spt.SESSION_REF, + 'ERROR', + 'Undefined Data Type ' || f.type ||' in Attribute ' || f.name || ' in ' || p.PATH, + 2, + 1, + 0 + FROM + EVENT_FIELD f + INNER JOIN + EVENT e + ON + f.EVENT_REF = e.EVENT_ID + INNER JOIN + PACKAGE p + ON + e.PACKAGE_REF = p.PACKAGE_ID + INNER JOIN + SESSION_PACKAGE spk + ON + p.PACKAGE_ID = spk.PACKAGE_REF + INNER JOIN + SESSION_PARTITION spt + ON + spk.SESSION_PARTITION_REF = spt.SESSION_PARTITION_ID + WHERE + spk.SESSION_PARTITION_REF = NEW.SESSION_PARTITION_REF + AND + spk.PACKAGE_REF = NEW.PACKAGE_REF + AND NOT EXISTS( + SELECT + 1 + FROM + DATA_TYPE dt + INNER JOIN + PACKAGE p2 + ON + dt.PACKAGE_REF = p2.PACKAGE_ID + INNER JOIN + SESSION_PACKAGE spk2 + ON + p2.PACKAGE_ID = spk2.PACKAGE_REF + INNER JOIN + SESSION_PARTITION spt2 + ON + spk2.SESSION_PARTITION_REF = spt2.SESSION_PARTITION_ID + WHERE + spt2.SESSION_REF = spt.SESSION_REF + AND + LOWER(dt.NAME) = LOWER(f.TYPE) + ); +END; + +/* Trigger that checks for undefined types in event fields when a session package is re-enabled*/ +CREATE TRIGGER EVENT_UNDEFINED_TYPE_MESSAGE_ON_UPDATE +AFTER UPDATE ON SESSION_PACKAGE +WHEN + EXISTS( + SELECT + 1 + FROM + SESSION_PACKAGE spk + JOIN + PACKAGE p + ON + spk.PACKAGE_REF = p.PACKAGE_ID + WHERE + p.TYPE = 'zcl-xml-standalone' + AND + spk.package_ref = NEW.package_ref + AND + OLD.ENABLED = false + AND + NEW.ENABLED = true + ) +BEGIN + INSERT INTO SESSION_NOTICE( + SESSION_REF, + NOTICE_TYPE, + NOTICE_MESSAGE, + NOTICE_SEVERITY, + DISPLAY, + SEEN + ) + SELECT + spt.SESSION_REF, + 'ERROR', + 'Undefined Data Type ' || f.type ||' in Attribute ' || f.name || ' in ' || p.PATH, + 2, + 1, + 0 + FROM + EVENT_FIELD f + INNER JOIN + EVENT e + ON + f.EVENT_REF = e.EVENT_ID + INNER JOIN + PACKAGE p + ON + e.PACKAGE_REF = p.PACKAGE_ID + INNER JOIN + SESSION_PACKAGE spk + ON + p.PACKAGE_ID = spk.PACKAGE_REF + INNER JOIN + SESSION_PARTITION spt + ON + spk.SESSION_PARTITION_REF = spt.SESSION_PARTITION_ID + WHERE + spk.SESSION_PARTITION_REF = NEW.SESSION_PARTITION_REF + AND + spk.PACKAGE_REF = NEW.PACKAGE_REF + AND NOT EXISTS( + SELECT + 1 + FROM + DATA_TYPE dt + INNER JOIN + PACKAGE p2 + ON + dt.PACKAGE_REF = p2.PACKAGE_ID + INNER JOIN + SESSION_PACKAGE spk2 + ON + p2.PACKAGE_ID = spk2.PACKAGE_REF + INNER JOIN + SESSION_PARTITION spt2 + ON + spk2.SESSION_PARTITION_REF = spt2.SESSION_PARTITION_ID + WHERE + spt2.SESSION_REF = spt.SESSION_REF + AND + LOWER(dt.NAME) = LOWER(f.TYPE) + ); +END; + +/* Trigger that deletes relevant custom XML specific session_notice entries when a session package is disabled */ +CREATE TRIGGER DELETE_NOTICE_ON_DISABLE_CUSTOM_XML AFTER UPDATE ON SESSION_PACKAGE WHEN OLD.ENABLED = 1 @@ -3902,14 +4400,12 @@ BEGIN ) AND NOTICE_TYPE = "ERROR" - AND - NOTICE_MESSAGE LIKE '%code conflict%' AND NOTICE_MESSAGE LIKE '%' || (SELECT p.PATH FROM PACKAGE p WHERE p.PACKAGE_ID = OLD.PACKAGE_REF) || '%'; END; -/* Trigger that deletes relevant code conflict session_notice entries when a session package is deleted */ -CREATE TRIGGER CODE_CONFLICT_DELETE +/* Trigger that deletes relevant custom XML specific session_notice entries when a session package is deleted */ +CREATE TRIGGER DELETE_NOTICE_ON_DELETE_CUSTOM_XML AFTER DELETE ON SESSION_PACKAGE BEGIN DELETE FROM @@ -3925,15 +4421,10 @@ BEGIN ) AND NOTICE_TYPE = 'ERROR' - AND - NOTICE_MESSAGE LIKE '%code conflict%' AND NOTICE_MESSAGE LIKE '%' || (SELECT p.PATH FROM PACKAGE p WHERE p.PACKAGE_ID = OLD.PACKAGE_REF) || '%'; END; - - - /* * * $$$$$$\ $$\ $$\ $$\ $$\ $$\ diff --git a/test/custom-matter-xml.test.js b/test/custom-matter-xml.test.js index c3def28548..c8e540bcce 100644 --- a/test/custom-matter-xml.test.js +++ b/test/custom-matter-xml.test.js @@ -449,6 +449,26 @@ test( expect( packageNotif.some((notif) => notif.message.includes('type contradiction')) ).toBeTruthy() // checks if the correct warning is thrown + + let sessionNotif = await querySessionNotification.getNotification(db, sid) + expect( + sessionNotif.some( + (notif) => + notif.type === 'ERROR' && + notif.message.includes('Undefined Data Type') && + notif.message.includes('Attribute Sample Mfg Specific Attribute') && + notif.message.includes('matter-bad-custom.xml') + ) + ).toBeTruthy() + expect( + sessionNotif.some( + (notif) => + notif.type === 'ERROR' && + notif.message.includes('Undefined Data Type') && + notif.message.includes('arg1') && + notif.message.includes('matter-bad-custom.xml') + ) + ).toBeTruthy() }, testUtil.timeout.short() ) diff --git a/test/resource/custom-cluster/matter-bad-custom.xml b/test/resource/custom-cluster/matter-bad-custom.xml index 8cdda42ffa..9c05d06d58 100644 --- a/test/resource/custom-cluster/matter-bad-custom.xml +++ b/test/resource/custom-cluster/matter-bad-custom.xml @@ -9,7 +9,8 @@ - Sample Mfg Specific Attribute 6 + // intentional undefined type errors + Sample Mfg Specific Attribute 6 Sample Mfg Specific Attribute 8 Client command that turns the device on with a transition given @@ -18,6 +19,7 @@ Client command that toggles the device with a transition given by the transition time in the Ember Sample transition time attribute. +