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