Skip to content

Commit 10ecf7a

Browse files
test setting conflicting parameters
1 parent c6ba061 commit 10ecf7a

File tree

1 file changed

+112
-0
lines changed

1 file changed

+112
-0
lines changed

test/test_param.cpp

Lines changed: 112 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;
@@ -172,6 +174,116 @@ TEST_F(ParamTest, override_ae_enabled_exposure)
172174
ASSERT_EQ(param_client->get_parameters({"ExposureTime"}).front().as_int(), 15600);
173175
}
174176

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

176288
int
177289
main(int argc, char **argv)

0 commit comments

Comments
 (0)