@@ -66,6 +66,8 @@ class ParamTest : public testing::Test
66
66
67
67
const std::string CAMERA_NODE_NAME = " camera" ;
68
68
69
+ const std::string conflict_reason = " AeEnable and ExposureTime must not be set simultaneously" ;
70
+
69
71
rclcpp::Executor::SharedPtr exec;
70
72
rclcpp_components::NodeInstanceWrapper camera;
71
73
std::unique_ptr<ParamClient> param_client;
@@ -179,6 +181,131 @@ TEST_F(ParamTest, override_ae_enabled_exposure)
179
181
ASSERT_EQ (param_client->get_parameters ({" ExposureTime" }).front ().as_int (), 15600 );
180
182
}
181
183
184
+ TEST_F (ParamTest, override_default_set_exposure)
185
+ {
186
+ instantiate_camera ({});
187
+
188
+ ASSERT_TRUE (param_client->is_set_parameter (" AeEnable" ));
189
+ ASSERT_TRUE (param_client->is_set_parameter (" ExposureTime" ));
190
+
191
+ // by default, auto exposure is active
192
+ ASSERT_EQ (param_client->get_parameters ({" AeEnable" }).front ().as_bool (), true );
193
+
194
+ const int exp_init = param_client->get_parameters ({" ExposureTime" }).front ().as_int ();
195
+
196
+ // setting 'ExposureTime' with 'AeEnable' enabled by default causes conflict
197
+ const int exp_tar1 = exp_init + 100 ;
198
+ const std::vector<rcl_interfaces::msg::SetParametersResult> res_exposure =
199
+ param_client->set_parameters ({{" ExposureTime" , exp_tar1}});
200
+ ASSERT_FALSE (res_exposure[0 ].successful );
201
+ ASSERT_EQ (res_exposure[0 ].reason , " AeEnable and ExposureTime must not be set simultaneously" );
202
+ // parameter updates are not applied
203
+ ASSERT_NE (param_client->get_parameters ({" ExposureTime" }).front ().as_int (), exp_tar1);
204
+ }
205
+
206
+ TEST_F (ParamTest, override_ae_disabled_set_exposure)
207
+ {
208
+ // disable 'AeEnable'
209
+ instantiate_camera ({{" AeEnable" , false }});
210
+
211
+ ASSERT_TRUE (param_client->is_set_parameter (" AeEnable" ));
212
+ ASSERT_TRUE (param_client->is_set_parameter (" ExposureTime" ));
213
+
214
+ // 'AeEnable' takes the override value
215
+ ASSERT_EQ (param_client->get_parameters ({" AeEnable" }).front ().as_bool (), false );
216
+
217
+ const int exp_init = param_client->get_parameters ({" ExposureTime" }).front ().as_int ();
218
+
219
+ // setting 'ExposureTime' does not cause conflict and is applied
220
+ const int exp_tar1 = exp_init + 100 ;
221
+ const std::vector<rcl_interfaces::msg::SetParametersResult> res_exposure =
222
+ param_client->set_parameters ({{" ExposureTime" , exp_tar1}});
223
+ ASSERT_TRUE (res_exposure[0 ].successful );
224
+ ASSERT_EQ (res_exposure[0 ].reason , std::string {});
225
+ // parameter updates are applied
226
+ ASSERT_EQ (param_client->get_parameters ({" ExposureTime" }).front ().as_int (), exp_tar1);
227
+ }
228
+
229
+ TEST_F (ParamTest, override_ae_disabled_set_atom_ae_enabled_exposure)
230
+ {
231
+ // disable 'AeEnable'
232
+ instantiate_camera ({{" AeEnable" , false }});
233
+
234
+ ASSERT_TRUE (param_client->is_set_parameter (" AeEnable" ));
235
+ ASSERT_TRUE (param_client->is_set_parameter (" ExposureTime" ));
236
+
237
+ const int exp_init = param_client->get_parameters ({" ExposureTime" }).front ().as_int ();
238
+
239
+ // setting 'AeEnable' and 'ExposureTime' at once will fail
240
+ // no parameter updates are applied
241
+ const std::vector<rclcpp::Parameter> initial_param_vals =
242
+ param_client->get_parameters ({" AeEnable" , " ExposureTime" });
243
+ const int exp_tar1 = exp_init + 100 ;
244
+ const rcl_interfaces::msg::SetParametersResult res_atom =
245
+ param_client->set_parameters_atomically ({{" AeEnable" , true }, {" ExposureTime" , exp_tar1}});
246
+ ASSERT_FALSE (res_atom.successful );
247
+ ASSERT_EQ (res_atom.reason , conflict_reason);
248
+ // parameters do not change
249
+ ASSERT_EQ (initial_param_vals, param_client->get_parameters ({" AeEnable" , " ExposureTime" }));
250
+ }
251
+
252
+ TEST_F (ParamTest, override_ae_disabled_set_atom_exposure_ae_enabled)
253
+ {
254
+ // disable 'AeEnable'
255
+ instantiate_camera ({{" AeEnable" , false }});
256
+
257
+ ASSERT_TRUE (param_client->is_set_parameter (" AeEnable" ));
258
+ ASSERT_TRUE (param_client->is_set_parameter (" ExposureTime" ));
259
+
260
+ const int exp_init = param_client->get_parameters ({" ExposureTime" }).front ().as_int ();
261
+
262
+ // setting 'ExposureTime' and 'AeEnable' at once will fail
263
+ // no parameter updates are applied
264
+ const std::vector<rclcpp::Parameter> initial_param_vals =
265
+ param_client->get_parameters ({" AeEnable" , " ExposureTime" });
266
+ const int exp_tar1 = exp_init + 100 ;
267
+ const rcl_interfaces::msg::SetParametersResult res_atom =
268
+ param_client->set_parameters_atomically ({{" ExposureTime" , exp_tar1}, {" AeEnable" , true }});
269
+ ASSERT_FALSE (res_atom.successful );
270
+ ASSERT_EQ (res_atom.reason , conflict_reason);
271
+ // parameters do not change
272
+ ASSERT_EQ (initial_param_vals, param_client->get_parameters ({" AeEnable" , " ExposureTime" }));
273
+ }
274
+
275
+ TEST_F (ParamTest, override_ae_disabled_set_indiv_ae_enabled_exposure)
276
+ {
277
+ // disable 'AeEnable'
278
+ instantiate_camera ({{" AeEnable" , false }});
279
+
280
+ ASSERT_TRUE (param_client->is_set_parameter (" AeEnable" ));
281
+ ASSERT_TRUE (param_client->is_set_parameter (" ExposureTime" ));
282
+
283
+ const int exp_init = param_client->get_parameters ({" ExposureTime" }).front ().as_int ();
284
+
285
+ // setting 'AeEnable' and 'ExposureTime' individually one-by-one will fail evenetually
286
+ const int exp_tar1 = exp_init + 100 ;
287
+ const std::vector<rcl_interfaces::msg::SetParametersResult> res_indiv =
288
+ param_client->set_parameters ({{" AeEnable" , true }, {" ExposureTime" , exp_tar1}});
289
+ // first parameter 'AeEnable' does not cause conflicts
290
+ ASSERT_TRUE (res_indiv[0 ].successful );
291
+ ASSERT_EQ (res_indiv[0 ].reason , std::string {});
292
+ // second parameter 'ExposureTime' causes conflict with previous 'AeEnable'
293
+ ASSERT_FALSE (res_indiv[1 ].successful );
294
+ ASSERT_EQ (res_indiv[1 ].reason , conflict_reason);
295
+ // only the parameter update for 'AeEnable' will have been applied
296
+ ASSERT_EQ (param_client->get_parameters ({" AeEnable" }).front ().as_bool (), true );
297
+ ASSERT_EQ (param_client->get_parameters ({" ExposureTime" }).front ().as_int (), exp_init);
298
+ ASSERT_NE (param_client->get_parameters ({" ExposureTime" }).front ().as_int (), exp_tar1);
299
+
300
+ // setting 'ExposureTime' again will fail since 'AeEnable' has already been applied
301
+ const int exp_tar2 = exp_init + 200 ;
302
+ const std::vector<rcl_interfaces::msg::SetParametersResult> res_exposure =
303
+ param_client->set_parameters ({{" ExposureTime" , exp_tar2}});
304
+ ASSERT_FALSE (res_exposure[0 ].successful );
305
+ ASSERT_EQ (res_exposure[0 ].reason , conflict_reason);
306
+ ASSERT_EQ (param_client->get_parameters ({" ExposureTime" }).front ().as_int (), exp_init);
307
+ ASSERT_NE (param_client->get_parameters ({" ExposureTime" }).front ().as_int (), exp_tar2);
308
+ }
182
309
183
310
int
184
311
main (int argc, char **argv)
0 commit comments