Skip to content

Commit 083046b

Browse files
test setting conflicting parameters
1 parent f3288bc commit 083046b

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed

test/test_param.cpp

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ class ParamTest : public testing::Test
6666

6767
const std::string CAMERA_NODE_NAME = "camera";
6868

69+
const std::string conflict_reason = "AeEnable and ExposureTime must not be set simultaneously";
70+
6971
rclcpp::Executor::SharedPtr exec;
7072
rclcpp_components::NodeInstanceWrapper camera;
7173
std::unique_ptr<ParamClient> param_client;
@@ -179,6 +181,131 @@ TEST_F(ParamTest, override_ae_enabled_exposure)
179181
ASSERT_EQ(param_client->get_parameters({"ExposureTime"}).front().as_int(), 15600);
180182
}
181183

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+
}
182309

183310
int
184311
main(int argc, char **argv)

0 commit comments

Comments
 (0)