Skip to content

Commit b5e30c3

Browse files
authored
Merge branch 'beta' into main
2 parents e9d9394 + aca8e37 commit b5e30c3

3 files changed

Lines changed: 113 additions & 0 deletions

File tree

drivers/SmartThings/matter-sensor/src/sub_drivers/air_quality_sensor/air_quality_sensor_utils/utils.lua

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,5 +121,10 @@ function AirQualitySensorUtils.deep_equals(a, b, opts, seen)
121121
return AirQualitySensorUtils.deep_equals(mt_a, mt_b, opts, seen)
122122
end
123123

124+
-- Compare metatables
125+
local mt_a = getmetatable(a)
126+
local mt_b = getmetatable(b)
127+
return AirQualitySensorUtils.deep_equals(mt_a, mt_b, opts, seen)
128+
end
124129

125130
return AirQualitySensorUtils

drivers/SmartThings/matter-sensor/src/test/test_matter_air_quality_sensor_modular.lua

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,5 +456,40 @@ test.register_coroutine_test(
456456
{ test_init = test_init_modular_fingerprint }
457457
)
458458

459+
test.register_coroutine_test(
460+
"Component-capability update without profile ID update should cause re-subscribe in infoChanged handler",
461+
function()
462+
local expected_metadata_modular_disabled = {
463+
optional_component_capabilities={
464+
{
465+
"main",
466+
{
467+
"tvocMeasurement",
468+
},
469+
},
470+
},
471+
profile="aqs-modular",
472+
}
473+
local subscribe_request_tvoc = get_subscribe_request_tvoc()
474+
local updated_device_profile = t_utils.get_profile_definition("aqs-modular.yml",
475+
{enabled_optional_capabilities = expected_metadata_modular_disabled.optional_component_capabilities}
476+
)
477+
updated_device_profile.id = "00000000-1111-2222-3333-000000000006"
478+
test.socket.device_lifecycle:__queue_receive(mock_device_modular_fingerprint:generate_info_changed({ profile = updated_device_profile }))
479+
test.socket.capability:__expect_send(mock_device_modular_fingerprint:generate_test_message("main", capabilities.airQualityHealthConcern.supportedAirQualityValues({"unknown", "good", "unhealthy", "moderate", "slightlyUnhealthy"}, {visibility={displayed=false}})))
480+
test.socket.matter:__expect_send({mock_device_modular_fingerprint.id, subscribe_request_tvoc})
481+
end,
482+
{ test_init = test_init_modular_fingerprint }
483+
)
484+
485+
test.register_coroutine_test(
486+
"No component-capability update and no profile ID update should not cause a re-subscribe in infoChanged handler",
487+
function()
488+
-- simulate no actual change
489+
test.socket.device_lifecycle:__queue_receive(mock_device_modular_fingerprint:generate_info_changed({}))
490+
end,
491+
{ test_init = test_init_modular_fingerprint }
492+
)
493+
459494
-- run tests
460495
test.run_registered_tests()

drivers/SmartThings/matter-thermostat/src/test/test_matter_thermostat_modular.lua

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,79 @@ local function initialize_subscribe_request(mock_device, subscribed_attributes)
198198
end
199199

200200

201+
local function test_init_modular_fingerprint()
202+
test.mock_device.add_test_device(mock_device_modular)
203+
test.socket.device_lifecycle:__queue_receive({ mock_device_modular.id, "init" })
204+
local subscribe_request = initialize_subscribe_request(mock_device_modular, {
205+
[clusters.Thermostat.ID] = {
206+
clusters.Thermostat.attributes.LocalTemperature,
207+
clusters.Thermostat.attributes.SystemMode,
208+
clusters.Thermostat.attributes.ControlSequenceOfOperation,
209+
},
210+
[clusters.TemperatureMeasurement.ID] = {
211+
clusters.TemperatureMeasurement.attributes.MaxMeasuredValue,
212+
clusters.TemperatureMeasurement.attributes.MeasuredValue,
213+
clusters.TemperatureMeasurement.attributes.MinMeasuredValue,
214+
},
215+
})
216+
test.socket.matter:__expect_send({mock_device_modular.id, subscribe_request})
217+
end
218+
219+
test.register_coroutine_test(
220+
"Component-capability update without profile ID update should cause re-subscribe in infoChanged handler", function()
221+
local subscribe_request = initialize_subscribe_request(mock_device_modular, {
222+
[clusters.Thermostat.ID] = {
223+
clusters.Thermostat.attributes.LocalTemperature,
224+
clusters.Thermostat.attributes.SystemMode,
225+
clusters.Thermostat.attributes.ControlSequenceOfOperation,
226+
},
227+
[clusters.TemperatureMeasurement.ID] = {
228+
clusters.TemperatureMeasurement.attributes.MaxMeasuredValue,
229+
clusters.TemperatureMeasurement.attributes.MeasuredValue,
230+
clusters.TemperatureMeasurement.attributes.MinMeasuredValue,
231+
},
232+
[clusters.FanControl.ID] = {
233+
clusters.FanControl.attributes.FanMode,
234+
clusters.FanControl.attributes.FanModeSequence,
235+
},
236+
})
237+
local expected_metadata_modular = {
238+
optional_component_capabilities={{"main", {"fanMode"}}},
239+
profile="thermostat-modular",
240+
}
241+
local updated_device_profile = t_utils.get_profile_definition("thermostat-modular.yml",
242+
{enabled_optional_capabilities = expected_metadata_modular.optional_component_capabilities}
243+
)
244+
updated_device_profile.id = "00000000-1111-2222-3333-000000000003"
245+
test.socket.device_lifecycle:__queue_receive(mock_device_modular:generate_info_changed({ profile = updated_device_profile }))
246+
test.socket.matter:__expect_send({mock_device_modular.id, subscribe_request})
247+
end,
248+
{ test_init = test_init_modular_fingerprint }
249+
)
250+
251+
test.register_coroutine_test(
252+
"No component-capability update and no profile ID update should not cause a re-subscribe in infoChanged handler", function()
253+
-- simulate no actual change
254+
test.socket.device_lifecycle:__queue_receive(mock_device_modular:generate_info_changed({}))
255+
end,
256+
{ test_init = function() test.mock_device.add_test_device(mock_device_modular) end }
257+
)
258+
259+
local function initialize_subscribe_request(mock_device, subscribed_attributes)
260+
local subscribe_request = nil
261+
for _, attributes in pairs(subscribed_attributes) do
262+
for _, attribute in pairs(attributes) do
263+
if subscribe_request == nil then
264+
subscribe_request = attribute:subscribe(mock_device)
265+
else
266+
subscribe_request:merge(attribute:subscribe(mock_device))
267+
end
268+
end
269+
end
270+
return subscribe_request
271+
end
272+
273+
201274
local function test_init_modular_fingerprint()
202275
test.mock_device.add_test_device(mock_device_modular)
203276
test.socket.device_lifecycle:__queue_receive({ mock_device_modular.id, "init" })

0 commit comments

Comments
 (0)