summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Jeffery <andrew@aj.id.au>2018-05-23 16:15:26 +0930
committerAndrew Jeffery <andrew@aj.id.au>2019-03-18 16:08:31 +1030
commita607a0d02ceea61c1cfcbaac535fb9f925c0ffc4 (patch)
treee02fb91cc7d2e244f6e0668ea75b30e1af0521b1
parentf2086fcd89b53be4842109b06012489acbf7a390 (diff)
downloadphosphor-led-sysfs-a607a0d02ceea61c1cfcbaac535fb9f925c0ffc4.tar.gz
phosphor-led-sysfs-a607a0d02ceea61c1cfcbaac535fb9f925c0ffc4.zip
test: Add tests for Physical class
The additions to configure expose a new `check-code-coverage` make target when `--enable-code-coverage` is passed to `./configure`. Assuming gcov/lcov are installed, `make check-code-coverage` will run the test suite and generate an HTML line/function/branch coverage report that enables measurement of the effectiveness of the test suite. The tests themselves are trivial (integration) tests that get us to 78.8% line coverage and 93.3% function coverage over physical.hpp and physical.cpp. However, as we don't have the read() and write() functions under our control - and as they're implemented to return empty strings when the target files do not exist - this high level of coverage is more by luck than design. To demonstrate, under the current test arrangement, we can never enter this branch of setInitialState(): auto trigger = read<std::string>(blinkCtrl); if (trigger == "timer") { // LED is blinking. Get the delay_on and delay_off and compute // DutyCycle. sfsfs values are in strings. Need to convert 'em over to // integer. auto delayOn = std::stoi(read<std::string>(delayOnCtrl)); auto delayOff = std::stoi(read<std::string>(delayOffCtrl)); // Calculate frequency and then percentage ON frequency = delayOn + delayOff; auto factor = frequency / 100; auto dutyOn = delayOn / factor; // Update. this->dutyOn(dutyOn); } For similar reasons, we also fail to enter: auto brightness = read<std::string>(brightCtrl); if (brightness == std::string(ASSERT)) { // LED is in Solid ON sdbusplus::xyz::openbmc_project::Led::server ::Physical::state( Action::On); } To test both of these paths we need to make changes to isolate functionality so we can manipulate the read() call to return the necessary strings at the appropriate times, but that is for a future change. Change-Id: I0df2ab2d992ccad514cddb7f7fc6d080aa74f27d Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
-rw-r--r--Makefile.am12
-rw-r--r--configure.ac66
-rw-r--r--test/Makefile.am.include25
-rw-r--r--test/physical.cpp37
4 files changed, 138 insertions, 2 deletions
diff --git a/Makefile.am b/Makefile.am
index 3c42e07..5683086 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -9,3 +9,15 @@ phosphor_ledcontroller_LDFLAGS = $(SDBUSPLUS_LIBS) \
$(PHOSPHOR_DBUS_INTERFACES_LIBS)
phosphor_ledcontroller_CFLAGS = $(SDBUSPLUS_CFLAGS) \
$(PHOSPHOR_DBUS_INTERFACES_CFLAGS)
+
+@CODE_COVERAGE_RULES@
+
+check_PROGRAMS =
+XFAIL_TESTS =
+
+include test/Makefile.am.include
+
+TESTS = $(check_PROGRAMS)
+
+clean-local: code-coverage-clean
+dist-clean-local: code-coverage-dist-clean
diff --git a/configure.ac b/configure.ac
index 58e557a..7060472 100644
--- a/configure.ac
+++ b/configure.ac
@@ -26,8 +26,70 @@ PKG_CHECK_MODULES([SDBUSPLUS], [sdbusplus],, [AC_MSG_ERROR([Could not find sdbus
PKG_CHECK_MODULES([PHOSPHOR_DBUS_INTERFACES], [phosphor-dbus-interfaces],, [AC_MSG_ERROR([Could not find phosphor-dbus-interfaces...openbmc/phosphor-dbus-interfaces package required])])
# Check/set gtest specific functions.
-AX_PTHREAD([GTEST_CPPFLAGS="-DGTEST_HAS_PTHREAD=1"],[GTEST_CPPFLAGS="-DGTEST_HAS_PTHREAD=0"])
-AC_SUBST(GTEST_CPPFLAGS)
+AS_IF([test "x$enable_tests" != "xno"], [
+ PKG_CHECK_MODULES([GTEST], [gtest], [], [true])
+ PKG_CHECK_MODULES([GMOCK], [gmock], [], [true])
+ AX_PTHREAD
+
+ AX_SAVE_FLAGS_WITH_PREFIX(OLD, [CPPFLAGS])
+ AX_APPEND_COMPILE_FLAGS([$GTEST_CFLAGS], [CPPFLAGS])
+ AC_LANG_PUSH([C++])
+ AC_CHECK_HEADERS([gtest/gtest.h], [
+ AS_IF([test "x$GTEST_CFLAGS" = "x"], [
+ AS_IF([test "x$PTHREAD_CFLAGS" = "x"], [
+ AX_APPEND_COMPILE_FLAGS(["-DGTEST_HAS_PTHREAD=0"], [GTEST_CFLAGS])
+ ], [
+ AX_APPEND_COMPILE_FLAGS(["-DGTEST_HAS_PTHREAD=1"], [GTEST_CFLAGS])
+ AX_APPEND_COMPILE_FLAGS([$PTHREAD_CFLAGS], [GTEST_CFLAGS])
+ ])
+ ])
+ ], [
+ AS_IF([test "x$enable_tests" = "xyes"], [
+ AC_MSG_ERROR([Testing enabled but could not find gtest/gtest.h])
+ ])
+ ])
+ AC_LANG_POP([C++])
+ AX_RESTORE_FLAGS_WITH_PREFIX(OLD, [CPPFLAGS])
+
+ AX_SAVE_FLAGS_WITH_PREFIX(OLD, [CPPFLAGS])
+ AX_APPEND_COMPILE_FLAGS([$GMOCK_CFLAGS], [CPPFLAGS])
+ AC_LANG_PUSH([C++])
+ AC_CHECK_HEADERS([gmock/gmock.h], [], [
+ AS_IF([test "x$enable_tests" = "xyes"], [
+ AC_MSG_ERROR([Testing enabled but could not find gmock/gmock.h])
+ ])
+ ])
+ AC_LANG_POP([C++])
+ AX_RESTORE_FLAGS_WITH_PREFIX(OLD, [CPPFLAGS])
+
+ AX_SAVE_FLAGS_WITH_PREFIX(OLD, [LDFLAGS])
+ AX_APPEND_COMPILE_FLAGS([$GTEST_LIBS], [LDFLAGS])
+ AC_CHECK_LIB([gtest], [main], [
+ AS_IF([test "x$GTEST_LIBS" = "x"], [
+ AX_APPEND_COMPILE_FLAGS([-lgtest], [GTEST_LIBS])
+ ])
+ ], [
+ AS_IF([test "x$enable_tests" = "xyes"], [
+ AC_MSG_ERROR([Testing enabled but couldn't find gtest libs])
+ ])
+ ])
+ AX_RESTORE_FLAGS_WITH_PREFIX(OLD, [LDFLAGS])
+
+ AX_SAVE_FLAGS_WITH_PREFIX(OLD, [LDFLAGS])
+ AX_APPEND_COMPILE_FLAGS([$GMOCK_LIBS], [LDFLAGS])
+ AC_CHECK_LIB([gmock], [main], [
+ AS_IF([test "x$GMOCK_LIBS" = "x"], [
+ AX_APPEND_COMPILE_FLAGS([-lgmock], [GMOCK_LIBS])
+ ])
+ ], [
+ AS_IF([test "x$enable_tests" = "xyes"], [
+ AC_MSG_ERROR([Testing enabled but couldn't find gmock libs])
+ ])
+ ])
+ AX_RESTORE_FLAGS_WITH_PREFIX(OLD, [LDFLAGS])
+])
+
+AX_CODE_COVERAGE
AC_ARG_VAR(BUSNAME, [The Dbus busname to own])
AS_IF([test "x$BUSNAME" == "x"], [BUSNAME="xyz.openbmc_project.LED.Controller"])
diff --git a/test/Makefile.am.include b/test/Makefile.am.include
new file mode 100644
index 0000000..dd41dd8
--- /dev/null
+++ b/test/Makefile.am.include
@@ -0,0 +1,25 @@
+AM_CPPFLAGS = \
+ $(PTHREAD_CPPFLAGS) \
+ $(SDBUSPLUS_CPPFLAGS) \
+ $(PHOSPHOR_DBUS_INTERFACES_CPPFLAGS) \
+ $(CODE_COVERAGE_CPPFLAGS)
+AM_CFLAGS = \
+ $(PTHREAD_CFLAGS) \
+ $(SDBUSPLUS_CFLAGS) \
+ $(PHOSPHOR_DBUS_INTERFACES_CFLAGS) \
+ $(CODE_COVERAGE_CFLAGS)
+AM_CXXFLAGS = \
+ $(PTHREAD_CXXFLAGS) \
+ $(SDBUSPLUS_CXXFLAGS) \
+ $(PHOSPHOR_DBUS_INTERFACES_CXXFLAGS) \
+ $(CODE_COVERAGE_CXXFLAGS)
+AM_LDFLAGS = \
+ $(SDBUSPLUS_LIBS) \
+ $(PHOSPHOR_DBUS_INTERFACES_LIBS) \
+ $(CODE_COVERAGE_LIBS) \
+ -lgtest -lgtest_main -lgmock $(PTHREAD_CFLAGS) $(OESDK_TESTCASE_FLAGS)
+
+test_physical_SOURCES = %reldir%/physical.cpp
+test_physical_LDADD = physical.o
+
+check_PROGRAMS += %reldir%/physical
diff --git a/test/physical.cpp b/test/physical.cpp
new file mode 100644
index 0000000..9ab4a30
--- /dev/null
+++ b/test/physical.cpp
@@ -0,0 +1,37 @@
+#include "physical.hpp"
+
+#include <sdbusplus/bus.hpp>
+
+#include <gtest/gtest.h>
+
+constexpr auto LED_OBJ = "/foo/bar/led";
+constexpr auto LED_SYSFS = "/sys/class/leds/test";
+
+using Action = sdbusplus::xyz::openbmc_project::Led::server::Physical::Action;
+
+TEST(Physical, ctor)
+{
+ sdbusplus::bus::bus bus = sdbusplus::bus::new_default();
+ phosphor::led::Physical led(bus, LED_OBJ, LED_SYSFS);
+}
+
+TEST(Physical, off)
+{
+ sdbusplus::bus::bus bus = sdbusplus::bus::new_default();
+ phosphor::led::Physical led(bus, LED_OBJ, LED_SYSFS);
+ led.state(Action::Off);
+}
+
+TEST(Physical, on)
+{
+ sdbusplus::bus::bus bus = sdbusplus::bus::new_default();
+ phosphor::led::Physical led(bus, LED_OBJ, LED_SYSFS);
+ led.state(Action::On);
+}
+
+TEST(Physical, blink)
+{
+ sdbusplus::bus::bus bus = sdbusplus::bus::new_default();
+ phosphor::led::Physical led(bus, LED_OBJ, LED_SYSFS);
+ led.state(Action::Blink);
+}
OpenPOWER on IntegriCloud