bindings: cxx: fix the return value of line_bulk::find_lines()
authorBartosz Golaszewski <bartekgola@gmail.com>
Sun, 13 May 2018 21:34:38 +0000 (23:34 +0200)
committerBartosz Golaszewski <bartekgola@gmail.com>
Mon, 14 May 2018 10:01:13 +0000 (12:01 +0200)
We should return an invalid line_bulk object if we failed to look up at
least one line from the provided list of names.

Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com>
bindings/cxx/chip.cpp
bindings/cxx/examples/gpiod_cxx_tests.cpp

index 15136ca46fa3ddafb4ad23692114041470db076f..f4c92ef2b902bd6bb486237a643e84c8c9069981 100644 (file)
@@ -158,9 +158,17 @@ line_bulk chip::get_all_lines(void) const
 line_bulk chip::find_lines(const ::std::vector<::std::string>& names) const
 {
        line_bulk lines;
+       line line;
 
-       for (auto& it: names)
-               lines.append(this->find_line(it));
+       for (auto& it: names) {
+               line = this->find_line(it);
+               if (!line) {
+                       lines.clear();
+                       return ::std::move(lines);
+               }
+
+               lines.append(line);
+       }
 
        return ::std::move(lines);
 }
index 81cf62c16bee81c137c5597560866296b0bf5043..df4820b3d96ed6dc1d2d761ca608f192b14f8410 100644 (file)
@@ -185,6 +185,18 @@ void chip_line_ops(void)
 }
 TEST_CASE(chip_line_ops);
 
+void chip_find_lines_nonexistent(void)
+{
+       ::gpiod::chip chip("gpiochip0");
+
+       auto lines = chip.find_lines({ "gpio-mockup-A-1", "nonexistent", "gpio-mockup-A-4" });
+       if (lines)
+               throw ::std::logic_error("line_bulk object should be invalid");
+
+       ::std::cerr << "line_bulk invalid as expected" << ::std::endl;
+}
+TEST_CASE(chip_find_lines_nonexistent);
+
 void line_info(void)
 {
        ::gpiod::chip chip("gpiochip0");