@@ -82,6 +82,36 @@ local mock_device_common = test.mock_device.build_test_matter_device({
8282 }
8383})
8484
85+ local mock_device_modular_fingerprint = test .mock_device .build_test_matter_device ({
86+ profile = t_utils .get_profile_definition (" aqs-modular.yml" ,
87+ {enabled_optional_capabilities = {{" main" , {}}}}),
88+ manufacturer_info = {
89+ vendor_id = 0x0000 ,
90+ product_id = 0x0000 ,
91+ },
92+ endpoints = {
93+ {
94+ endpoint_id = 0 ,
95+ clusters = {
96+ {cluster_id = clusters .Basic .ID , cluster_type = " SERVER" },
97+ },
98+ device_types = {
99+ {device_type_id = 0x0016 , device_type_revision = 1 } -- RootNode
100+ }
101+ },
102+ {
103+ endpoint_id = 1 ,
104+ clusters = {
105+ {cluster_id = clusters .AirQuality .ID , cluster_type = " SERVER" , feature_map = 3 },
106+ {cluster_id = clusters .TotalVolatileOrganicCompoundsConcentrationMeasurement .ID , cluster_type = " SERVER" , feature_map = 1 },
107+ },
108+ device_types = {
109+ {device_type_id = 0x002C , device_type_revision = 1 } -- Air Quality Sensor
110+ }
111+ }
112+ }
113+ })
114+
85115local function test_init_all ()
86116 test .mock_device .add_test_device (mock_device_all )
87117 test .socket .device_lifecycle :__queue_receive ({ mock_device_all .id , " init" })
@@ -94,6 +124,18 @@ local function test_init_all()
94124 test .socket .matter :__expect_send ({mock_device_all .id , subscribe_request })
95125end
96126
127+ local function test_init_modular_fingerprint ()
128+ test .mock_device .add_test_device (mock_device_modular_fingerprint )
129+ test .socket .device_lifecycle :__queue_receive ({ mock_device_modular_fingerprint .id , " init" })
130+ test .socket .capability :__expect_send (mock_device_modular_fingerprint :generate_test_message (" main" ,
131+ capabilities .airQualityHealthConcern .supportedAirQualityValues ({" unknown" , " good" , " unhealthy" , " moderate" , " slightlyUnhealthy" },
132+ {visibility = {displayed = false }}))
133+ )
134+ -- on device create, a generic AQS device will be profiled as aqs, thus only subscribing to one attribute
135+ local subscribe_request = clusters .AirQuality .attributes .AirQuality :subscribe (mock_device_modular_fingerprint )
136+ test .socket .matter :__expect_send ({mock_device_modular_fingerprint .id , subscribe_request })
137+ end
138+
97139local function test_init_common ()
98140 test .mock_device .add_test_device (mock_device_common )
99141 test .socket .device_lifecycle :__queue_receive ({ mock_device_common .id , " added" })
@@ -243,6 +285,30 @@ local function get_subscribe_request_common()
243285 return subscribe_request
244286end
245287
288+ local function get_subscribe_request_tvoc ()
289+ local subscribed_attributes = {
290+ [capabilities .airQualityHealthConcern .ID ] = {
291+ clusters .AirQuality .attributes .AirQuality
292+ },
293+ [capabilities .tvocMeasurement .ID ] = {
294+ clusters .TotalVolatileOrganicCompoundsConcentrationMeasurement .attributes .MeasuredValue ,
295+ clusters .TotalVolatileOrganicCompoundsConcentrationMeasurement .attributes .MeasurementUnit ,
296+ },
297+ }
298+ local subscribe_request = nil
299+ for _ , attributes in pairs (subscribed_attributes ) do
300+ for _ , attribute in pairs (attributes ) do
301+ if subscribe_request == nil then
302+ subscribe_request = attribute :subscribe (mock_device_common )
303+ else
304+ subscribe_request :merge (attribute :subscribe (mock_device_common ))
305+ end
306+ end
307+ end
308+ return subscribe_request
309+ end
310+
311+
246312-- run the profile configuration tests
247313local function test_aqs_device_type_update_modular_profile (generic_mock_device , expected_metadata , subscribe_request , expected_supported_values_setters )
248314 test .socket .device_lifecycle :__queue_receive ({generic_mock_device .id , " doConfigure" })
@@ -349,5 +415,52 @@ test.register_coroutine_test(
349415 { test_init = test_init_common }
350416)
351417
418+ test .register_coroutine_test (
419+ " Component-capability update without profile ID update should cause re-subscribe in infoChanged handler" ,
420+ function ()
421+ local expected_metadata_modular_disabled = {
422+ optional_component_capabilities = {
423+ {
424+ " main" ,
425+ {
426+ " tvocMeasurement" ,
427+ },
428+ },
429+ },
430+ profile = " aqs-modular" ,
431+ }
432+ local subscribe_request_tvoc = get_subscribe_request_tvoc ()
433+ local updated_device_profile = t_utils .get_profile_definition (" aqs-modular.yml" ,
434+ {enabled_optional_capabilities = expected_metadata_modular_disabled .optional_component_capabilities }
435+ )
436+ updated_device_profile .id = " 00000000-1111-2222-3333-000000000006"
437+ test .socket .device_lifecycle :__queue_receive (mock_device_modular_fingerprint :generate_info_changed ({ profile = updated_device_profile }))
438+ test .socket .capability :__expect_send (mock_device_modular_fingerprint :generate_test_message (" main" , capabilities .airQualityHealthConcern .supportedAirQualityValues ({" unknown" , " good" , " unhealthy" , " moderate" , " slightlyUnhealthy" }, {visibility = {displayed = false }})))
439+ test .socket .matter :__expect_send ({mock_device_modular_fingerprint .id , subscribe_request_tvoc })
440+ end ,
441+ { test_init = test_init_modular_fingerprint }
442+ )
443+
444+ test .register_coroutine_test (
445+ " No component-capability update and no profile ID update should not cause a re-subscribe in infoChanged handler" ,
446+ function ()
447+ local expected_metadata_modular_disabled = {
448+ optional_component_capabilities = {
449+ {
450+ " main" ,
451+ {},
452+ },
453+ },
454+ profile = " aqs-modular" ,
455+ }
456+ local updated_device_profile = t_utils .get_profile_definition (" aqs-modular.yml" ,
457+ {enabled_optional_capabilities = expected_metadata_modular_disabled .optional_component_capabilities }
458+ )
459+ updated_device_profile .id = " 00000000-1111-2222-3333-000000000006"
460+ test .socket .device_lifecycle :__queue_receive (mock_device_modular_fingerprint :generate_info_changed ({ profile = updated_device_profile }))
461+ end ,
462+ { test_init = test_init_modular_fingerprint }
463+ )
464+
352465-- run tests
353466test .run_registered_tests ()
0 commit comments