@@ -70,38 +70,25 @@ ZTEST(basic, test_specification_based__zbus_obs_add_rm_obs)
70
70
count_callback1 = 0 ;
71
71
struct sensor_data_msg sd = {.a = 10 , .b = 100 };
72
72
73
- zassert_equal (CONFIG_ZBUS_RUNTIME_OBSERVERS_POOL_SIZE ,
74
- k_mem_slab_num_free_get (zbus_runtime_obs_pool ()), NULL );
75
73
/* Tyring to add same static observer as one dynamic */
76
74
zassert_equal (- EEXIST , zbus_chan_add_obs (& chan2 , & lis2 , K_MSEC (200 )), NULL );
77
75
78
76
zassert_equal (0 , zbus_chan_pub (& chan1 , & sd , K_MSEC (500 )), NULL );
79
77
zassert_equal (count_callback1 , 0 , "The counter could not be more than zero, no obs" );
80
78
81
79
zassert_equal (0 , zbus_chan_add_obs (& chan1 , & lis1 , K_MSEC (200 )), NULL );
82
- zassert_equal (CONFIG_ZBUS_RUNTIME_OBSERVERS_POOL_SIZE - 1 ,
83
- k_mem_slab_num_free_get (zbus_runtime_obs_pool ()), NULL );
84
80
zassert_equal (- EALREADY , zbus_chan_add_obs (& chan1 , & lis1 , K_MSEC (200 )),
85
81
"It cannot be added twice" );
86
82
87
- zassert_equal (1 , k_mem_slab_max_used_get (zbus_runtime_obs_pool ()), NULL );
88
- zassert_equal (CONFIG_ZBUS_RUNTIME_OBSERVERS_POOL_SIZE - 1 ,
89
- k_mem_slab_num_free_get (zbus_runtime_obs_pool ()), NULL );
90
-
91
83
zassert_equal (0 , zbus_chan_pub (& chan1 , & sd , K_MSEC (500 )), NULL );
92
84
zassert_equal (count_callback1 , 1 , "The counter could not be more than zero, no obs, %d" ,
93
85
count_callback1 );
94
86
95
87
zassert_equal (0 , zbus_chan_rm_obs (& chan1 , & lis1 , K_MSEC (200 )), "It must remove the obs" );
96
- zassert_equal (CONFIG_ZBUS_RUNTIME_OBSERVERS_POOL_SIZE ,
97
- k_mem_slab_num_free_get (zbus_runtime_obs_pool ()), NULL );
98
88
99
- zassert_equal (1 , k_mem_slab_max_used_get (zbus_runtime_obs_pool ()), NULL );
100
89
zassert_equal (- ENODATA , zbus_chan_rm_obs (& chan1 , & lis1 , K_MSEC (200 )),
101
90
"It cannot be removed twice" );
102
91
103
- zassert_equal (CONFIG_ZBUS_RUNTIME_OBSERVERS_POOL_SIZE ,
104
- k_mem_slab_num_free_get (zbus_runtime_obs_pool ()), NULL );
105
92
zassert_equal (0 , zbus_chan_pub (& chan1 , & sd , K_MSEC (500 )), NULL );
106
93
zassert_equal (count_callback1 , 1 , "The counter could not be more than zero, no obs, %d" ,
107
94
count_callback1 );
@@ -125,25 +112,26 @@ ZTEST(basic, test_specification_based__zbus_obs_add_rm_obs)
125
112
zassert_equal (0 , zbus_chan_add_obs (& chan2 , & lis4 , K_MSEC (200 )), "It must add the obs" );
126
113
zassert_equal (0 , zbus_chan_add_obs (& chan2 , & lis5 , K_MSEC (200 )), "It must add the obs" );
127
114
zassert_equal (0 , zbus_chan_add_obs (& chan2 , & lis6 , K_MSEC (200 )), "It must add the obs" );
128
- zassert_equal (- EAGAIN , zbus_chan_add_obs (& chan2 , & lis7 , K_MSEC (200 )),
129
- "It must add the obs" );
115
+
116
+ /* Make the heap full */
117
+ void * mem ;
118
+
119
+ do {
120
+ mem = k_malloc (1 );
121
+ } while (mem != NULL );
122
+
123
+ /* With the heap full it will not be possible to add another obs */
124
+ zassert_equal (- ENOMEM , zbus_chan_add_obs (& chan2 , & lis7 , K_MSEC (200 )), NULL );
130
125
zassert_equal (0 , zbus_chan_pub (& chan2 , & sd , K_MSEC (500 )), NULL );
131
126
zassert_equal (count_callback2 , 5 , NULL );
127
+
132
128
/* To cause an error to sub1 and sub2. They have the queue full in this point */
133
- /* An error message must be printed saying the */
134
- zassert_equal (- EFAULT , zbus_chan_pub (& chan2 , & sd , K_MSEC (500 )), NULL );
129
+ /* ENOMSG must be the result */
130
+ zassert_equal (- ENOMSG , zbus_chan_pub (& chan2 , & sd , K_MSEC (500 )), NULL );
135
131
zassert_equal (count_callback2 , 10 , NULL );
136
132
137
- zassert_equal (CONFIG_ZBUS_RUNTIME_OBSERVERS_POOL_SIZE ,
138
- k_mem_slab_max_used_get (zbus_runtime_obs_pool ()), NULL );
139
-
140
- zassert_equal (0 , k_mem_slab_num_free_get (zbus_runtime_obs_pool ()), NULL );
141
133
zassert_equal (0 , zbus_chan_rm_obs (& chan2 , & sub1 , K_MSEC (200 )), NULL );
142
134
zassert_equal (0 , zbus_chan_rm_obs (& chan2 , & sub2 , K_MSEC (200 )), NULL );
143
- zassert_equal (2 , k_mem_slab_num_free_get (zbus_runtime_obs_pool ()), NULL );
144
-
145
- zassert_equal (CONFIG_ZBUS_RUNTIME_OBSERVERS_POOL_SIZE ,
146
- k_mem_slab_max_used_get (zbus_runtime_obs_pool ()), NULL );
147
135
}
148
136
149
137
struct aux2_wq_data {
@@ -166,8 +154,58 @@ ZTEST(basic, test_specification_based__zbus_obs_add_rm_obs_busy)
166
154
k_work_submit (& wq_handler .work );
167
155
k_msleep (1000 );
168
156
169
- zassert_equal (2 , k_mem_slab_num_free_get (zbus_runtime_obs_pool ()), NULL );
170
157
zassert_equal (0 , zbus_chan_finish (& chan2 ), NULL );
171
158
}
172
159
160
+ ZBUS_CHAN_DEFINE (chan4 , /* Name */
161
+ struct sensor_data_msg , /* Message type */
162
+
163
+ NULL , /* Validator */
164
+ NULL , /* User data */
165
+ ZBUS_OBSERVERS (prio_lis6 , prio_lis5 ), /* observers */
166
+ ZBUS_MSG_INIT (0 ) /* Initial value major 0, minor 1, build 1023 */
167
+ );
168
+
169
+ static int execution_sequence_idx ;
170
+ static uint8_t execution_sequence [6 ] = {0 };
171
+
172
+ #define CALLBACK_DEF (_lis , _idx ) \
173
+ static void _CONCAT(prio_cb, _idx)(const struct zbus_channel *chan) \
174
+ { \
175
+ execution_sequence[execution_sequence_idx] = _idx; \
176
+ ++execution_sequence_idx; \
177
+ } \
178
+ ZBUS_LISTENER_DEFINE(_lis, _CONCAT(prio_cb, _idx))
179
+
180
+ CALLBACK_DEF (prio_lis1 , 1 );
181
+ CALLBACK_DEF (prio_lis2 , 2 );
182
+ CALLBACK_DEF (prio_lis3 , 3 );
183
+ CALLBACK_DEF (prio_lis4 , 4 );
184
+ CALLBACK_DEF (prio_lis5 , 5 );
185
+ CALLBACK_DEF (prio_lis6 , 6 );
186
+
187
+ ZBUS_CHAN_ADD_OBS (chan4 , prio_lis3 , 3 );
188
+ ZBUS_CHAN_ADD_OBS (chan4 , prio_lis4 , 2 );
189
+
190
+ /* Checking the ZBUS_CHAN_ADD_OBS. The execution sequence must be: 6, 5, 4, 3, 2, 1. */
191
+
192
+ ZTEST (basic , test_specification_based__zbus_obs_priority )
193
+ {
194
+ struct sensor_data_msg sd = {.a = 70 , .b = 116 };
195
+
196
+ execution_sequence_idx = 0 ;
197
+
198
+ zassert_equal (0 , zbus_chan_add_obs (& chan4 , & prio_lis2 , K_MSEC (200 )), NULL );
199
+ zassert_equal (0 , zbus_chan_add_obs (& chan4 , & prio_lis1 , K_MSEC (200 )), NULL );
200
+
201
+ zassert_equal (0 , zbus_chan_pub (& chan4 , & sd , K_MSEC (500 )), NULL );
202
+
203
+ zassert_equal (execution_sequence [0 ], 6 , NULL );
204
+ zassert_equal (execution_sequence [1 ], 5 , NULL );
205
+ zassert_equal (execution_sequence [2 ], 4 , NULL );
206
+ zassert_equal (execution_sequence [3 ], 3 , NULL );
207
+ zassert_equal (execution_sequence [4 ], 2 , NULL );
208
+ zassert_equal (execution_sequence [5 ], 1 , NULL );
209
+ }
210
+
173
211
ZTEST_SUITE (basic , NULL , NULL , NULL , NULL , NULL );
0 commit comments