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>
4 files changed