diff --git a/template/src/lib/conditionals.lua b/template/src/lib/conditionals.lua index 5f1d372..18c321e 100644 --- a/template/src/lib/conditionals.lua +++ b/template/src/lib/conditionals.lua @@ -98,7 +98,9 @@ function Conditionals:_getNextConditionalId() local currentConditionals = {} for _, keys in pairs(self:getConditionals()) do for _, conditional in pairs(keys) do - currentConditionals[conditional.conditionalId] = true + if Select(conditional, "conditionalId") ~= nil then + currentConditionals[conditional.conditionalId] = true + end end end local nextId = CONDITIONAL_ID_START diff --git a/template/src/lib/events.lua b/template/src/lib/events.lua index dd9e399..2d5e156 100644 --- a/template/src/lib/events.lua +++ b/template/src/lib/events.lua @@ -119,8 +119,10 @@ function Events:restoreEvents() local usedEventIds = {} for _, keys in pairs(self:getEvents()) do for _, event in pairs(keys) do - usedEventIds[event.eventId] = true - C4:AddEvent(event.eventId, event.name, event.description) + if Select(event, "eventId") ~= nil then + usedEventIds[event.eventId] = true + C4:AddEvent(event.eventId, event.name, event.description) + end end end for id = EVENT_ID_START, EVENT_ID_END do @@ -140,7 +142,9 @@ function Events:_getNextEventId() local currentEvents = {} for _, keys in pairs(self:getEvents()) do for _, event in pairs(keys) do - currentEvents[event.eventId] = true + if Select(event, "eventId") ~= nil then + currentEvents[event.eventId] = true + end end end local nextId = EVENT_ID_START diff --git a/template/test/test_saved_entries_without_ids.lua b/template/test/test_saved_entries_without_ids.lua new file mode 100644 index 0000000..350a67c --- /dev/null +++ b/template/test/test_saved_entries_without_ids.lua @@ -0,0 +1,67 @@ +-- What lib/conditionals.lua and lib/events.lua do with a saved record that comes back without its id, or as +-- something other than a table. Restoring events and finding the next free id indexed by that id, so one such +-- record threw "table index is nil" at the start of OnDriverLateInit and stopped the driver from starting. +-- +-- Run from the driver root: +-- make test +-- or: +-- ./test/run_test.sh test_saved_entries_without_ids.lua + +local T = require("testlib") + +require("c4_shim") +require("drivers-common-public.global.handlers") -- TC + +local persist = require("lib.persist") + +--- Saves records under key the way a driver might find them: one whole, one without its id and one that is not a +--- table. Then fresh modules read them back, as after a restart. +local function savedAfterRestart(key, whole, noId) + persist:set(key, { Buttons = { whole = whole, noId = noId, notATable = "x" } }) + ShimPersistLand() + T.unload("^lib%.") + ShimResetEvents() + persist = require("lib.persist") +end + +--- The keys of t, sorted. +local function keys(t) + local out = {} + for k in pairs(t or {}) do + out[#out + 1] = k + end + table.sort(out) + return out +end + +T.section("a saved conditional without its id is skipped") +savedAfterRestart( + "Conditionals", + { conditionalId = 10, name = "CONDITIONAL_10", type = "BOOL", condition_statement = "IS", description = "Whole" }, + { name = "CONDITIONAL_LOST", type = "BOOL", condition_statement = "IS", description = "Lost its id" } +) +local conditionals = require("lib.conditionals") +local ok, added = pcall(conditionals.upsertConditional, conditionals, "Buttons", "new", { + type = "BOOL", + condition_statement = "IS", + description = "New", +}, function() + return true +end) +T.truthy("a new one is added", ok, added) +T.eq("under the next free id", ok and added.conditionalId, 11) + +T.section("a saved event without its id is skipped") +savedAfterRestart( + "Events", + { eventId = 10, name = "Whole", description = "When whole" }, + { name = "Lost", description = "Lost its id" } +) +local events = require("lib.events") +T.truthy("restoreEvents runs", pcall(events.restoreEvents, events)) +T.eq("and declares only the whole one", keys(ShimEvents()), { 10 }) +ok, added = pcall(events.getOrAddEvent, events, "Buttons", "new", "New", "When new") +T.truthy("a new one is added", ok, added) +T.eq("under the next free id", ok and added.eventId, 11) + +T.finish() diff --git a/tests/template-renders/crypto-bundles.files b/tests/template-renders/crypto-bundles.files index d2a6f66..5f713da 100644 --- a/tests/template-renders/crypto-bundles.files +++ b/tests/template-renders/crypto-bundles.files @@ -71,6 +71,7 @@ test/test_persist_missing_key.lua test/test_persist_reload.lua test/test_persist_undecodable.lua test/test_persist_write_behind.lua +test/test_saved_entries_without_ids.lua test/test_secret_sends_trace.lua test/test_sensor_params.lua test/test_shim_bindings.lua diff --git a/tests/template-renders/dc-product.files b/tests/template-renders/dc-product.files index 40981c0..194238e 100644 --- a/tests/template-renders/dc-product.files +++ b/tests/template-renders/dc-product.files @@ -67,6 +67,7 @@ test/test_persist_missing_key.lua test/test_persist_reload.lua test/test_persist_undecodable.lua test/test_persist_write_behind.lua +test/test_saved_entries_without_ids.lua test/test_secret_sends_trace.lua test/test_sensor_params.lua test/test_shim_bindings.lua diff --git a/tests/template-renders/default.files b/tests/template-renders/default.files index 40981c0..194238e 100644 --- a/tests/template-renders/default.files +++ b/tests/template-renders/default.files @@ -67,6 +67,7 @@ test/test_persist_missing_key.lua test/test_persist_reload.lua test/test_persist_undecodable.lua test/test_persist_write_behind.lua +test/test_saved_entries_without_ids.lua test/test_secret_sends_trace.lua test/test_sensor_params.lua test/test_shim_bindings.lua diff --git a/tests/template-renders/diagnostics.files b/tests/template-renders/diagnostics.files index b4f98cb..0bf7eba 100644 --- a/tests/template-renders/diagnostics.files +++ b/tests/template-renders/diagnostics.files @@ -70,6 +70,7 @@ test/test_persist_missing_key.lua test/test_persist_reload.lua test/test_persist_undecodable.lua test/test_persist_write_behind.lua +test/test_saved_entries_without_ids.lua test/test_secret_sends_trace.lua test/test_sensor_params.lua test/test_shim_bindings.lua diff --git a/tests/template-renders/oauth.files b/tests/template-renders/oauth.files index 6b70a96..0c23065 100644 --- a/tests/template-renders/oauth.files +++ b/tests/template-renders/oauth.files @@ -69,6 +69,7 @@ test/test_persist_missing_key.lua test/test_persist_reload.lua test/test_persist_undecodable.lua test/test_persist_write_behind.lua +test/test_saved_entries_without_ids.lua test/test_secret_sends_trace.lua test/test_sensor_params.lua test/test_shim_bindings.lua diff --git a/tests/template-renders/stale-issues-no-exempt.files b/tests/template-renders/stale-issues-no-exempt.files index dc0416f..ae089fa 100644 --- a/tests/template-renders/stale-issues-no-exempt.files +++ b/tests/template-renders/stale-issues-no-exempt.files @@ -68,6 +68,7 @@ test/test_persist_missing_key.lua test/test_persist_reload.lua test/test_persist_undecodable.lua test/test_persist_write_behind.lua +test/test_saved_entries_without_ids.lua test/test_secret_sends_trace.lua test/test_sensor_params.lua test/test_shim_bindings.lua diff --git a/tests/template-renders/stale-issues.files b/tests/template-renders/stale-issues.files index dc0416f..ae089fa 100644 --- a/tests/template-renders/stale-issues.files +++ b/tests/template-renders/stale-issues.files @@ -68,6 +68,7 @@ test/test_persist_missing_key.lua test/test_persist_reload.lua test/test_persist_undecodable.lua test/test_persist_write_behind.lua +test/test_saved_entries_without_ids.lua test/test_secret_sends_trace.lua test/test_sensor_params.lua test/test_shim_bindings.lua diff --git a/tests/template-renders/ui-expressions.files b/tests/template-renders/ui-expressions.files index ef3d30f..aff3b6e 100644 --- a/tests/template-renders/ui-expressions.files +++ b/tests/template-renders/ui-expressions.files @@ -82,6 +82,7 @@ test/test_persist_missing_key.lua test/test_persist_reload.lua test/test_persist_undecodable.lua test/test_persist_write_behind.lua +test/test_saved_entries_without_ids.lua test/test_secret_sends_trace.lua test/test_sensor_params.lua test/test_shim_bindings.lua diff --git a/tests/template-renders/ui.files b/tests/template-renders/ui.files index 9038d70..0b27804 100644 --- a/tests/template-renders/ui.files +++ b/tests/template-renders/ui.files @@ -75,6 +75,7 @@ test/test_persist_missing_key.lua test/test_persist_reload.lua test/test_persist_undecodable.lua test/test_persist_write_behind.lua +test/test_saved_entries_without_ids.lua test/test_secret_sends_trace.lua test/test_sensor_params.lua test/test_shim_bindings.lua diff --git a/tests/template-renders/variant-readme.files b/tests/template-renders/variant-readme.files index 40981c0..194238e 100644 --- a/tests/template-renders/variant-readme.files +++ b/tests/template-renders/variant-readme.files @@ -67,6 +67,7 @@ test/test_persist_missing_key.lua test/test_persist_reload.lua test/test_persist_undecodable.lua test/test_persist_write_behind.lua +test/test_saved_entries_without_ids.lua test/test_secret_sends_trace.lua test/test_sensor_params.lua test/test_shim_bindings.lua