diff options
author | Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com> | 2017-05-03 18:44:16 +0530 |
---|---|---|
committer | Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com> | 2017-06-19 13:06:34 +0530 |
commit | 4b000d8d84253f97cfe5695b4798e75092509706 (patch) | |
tree | c6dfa62f8a82f83f64c6885696bf8fc62ca2718a | |
parent | d27c68f40480070a70d17b58af17a9d8a1704ae3 (diff) | |
download | phosphor-led-manager-4b000d8d84253f97cfe5695b4798e75092509706.tar.gz phosphor-led-manager-4b000d8d84253f97cfe5695b4798e75092509706.zip |
LEDS: Provide support to override the default Blink priority
In some cases, it is needed that the Solid-ON action over rules
Blink and this patch adds that support.
Change-Id: Ib0a88b11142ccef3e39ef0a7c6eb3a037c878bc2
Signed-off-by: Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com>
-rw-r--r-- | group.cpp | 5 | ||||
-rwxr-xr-x | led.yaml | 27 | ||||
-rw-r--r-- | ledlayout.hpp | 16 | ||||
-rw-r--r-- | manager.cpp | 96 | ||||
-rw-r--r-- | manager.hpp | 55 | ||||
-rwxr-xr-x | parse_led.py | 5 | ||||
-rw-r--r-- | test/led-test-map.hpp | 203 | ||||
-rw-r--r-- | test/utest.cpp | 1301 |
8 files changed, 1341 insertions, 367 deletions
@@ -11,17 +11,16 @@ bool Group::asserted(bool value) // Introducing these to enable gtest. Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; // Group management is handled by Manager. The populated leds* sets are not // really used by production code. They are there to enable gtest for // validation. auto result = manager.setGroupState(path, value, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); // If something does not go right here, then there should be an sdbusplus // exception thrown. - manager.driveLEDs(ledsAssert, ledsDeAssert, ledsUpdate); + manager.driveLEDs(ledsAssert, ledsDeAssert); // Set the base class's asserted to 'true' since the getter // operation is handled there. @@ -1,54 +1,41 @@ bmc_booted: heartbeat: Action: 'On' - DutyOn: 50 - Period: 0 power_on: power: Action: 'On' - DutyOn: 50 - Period: 0 + Priority: 'On' enclosure_fault: - fault_front: + front_fault: Action: 'On' - DutyOn: 50 - Period: 0 - fault_rear: + rear_fault: Action: 'On' - DutyOn: 50 - Period: 0 enclosure_identify: front_id: Action: 'Blink' DutyOn: 50 Period: 1000 rear_id: - DutyOn: 50 Action: 'Blink' + DutyOn: 50 Period: 1000 fan_fault: front_fault: - Period: 0 - DutyOn: 50 Action: 'On' fan0: - DutyOn: 50 Action: 'On' - Period: 0 rear_fault: - Period: 0 - DutyOn: 50 Action: 'On' fan_identify: front_id: - Period: 1000 Action: 'Blink' DutyOn: 50 - rear_id: Period: 1000 + rear_id: Action: 'Blink' DutyOn: 50 + Period: 1000 fan0: - DutyOn: 50 Action: 'Blink' + DutyOn: 50 Period: 1000 diff --git a/ledlayout.hpp b/ledlayout.hpp index 998feb5..ca63166 100644 --- a/ledlayout.hpp +++ b/ledlayout.hpp @@ -2,6 +2,7 @@ #include <map> #include <set> + namespace phosphor { namespace led @@ -30,13 +31,24 @@ namespace Layout Action action; uint8_t dutyOn; uint16_t period; + Action priority; - // Needed for inserting elements into sets + // Order LEDs such that same LEDs are grouped next to + // each other and the same LEDs are in priority order + // with the highest priority coming first bool operator<(const LedAction& right) const { if (name == right.name) { - return action < right.action; + if (action == right.action) + { + return false; + } + else if (action == priority) + { + return true; + } + return action > right.action; } return name < right.name; } diff --git a/manager.cpp b/manager.cpp index 4ebc024..77ba546 100644 --- a/manager.cpp +++ b/manager.cpp @@ -11,8 +11,7 @@ namespace led // Assert -or- De-assert bool Manager::setGroupState(const std::string& path, bool assert, - group& ledsAssert, group& ledsDeAssert, - group& ledsUpdate) + group& ledsAssert, group& ledsDeAssert) { if (assert) { @@ -34,55 +33,73 @@ bool Manager::setGroupState(const std::string& path, bool assert, desiredState.insert(grp->cbegin(), grp->cend()); } - // Has the LEDs that are either to be turned off -or- want a new assertion + // Find difference between Combined and Desired to identify + // which LEDs are getting altered group transient {}; - std::set_difference(currentState.begin(), currentState.end(), + std::set_difference(combinedState.begin(), combinedState.end(), desiredState.begin(), desiredState.end(), std::inserter(transient, transient.begin()), ledComp); if(transient.size()) { - // We really do not want the Manager to know how a particular LED - // transitions from State-A --> State-B and all this must be handled by - // the physical LED controller implementation. - // So in this case, Manager really does not want to turn off the - // LEDs and then turning it back on and let the physical LED controller - // handle that. - - // If we previously had a FRU in ON state , and then if there was a - // request to make it blink, the end state would now be blink. - // If we either turn off blink / fault, then we need to go back to its - // previous state. - std::set_intersection(desiredState.begin(), desiredState.end(), - transient.begin(), transient.end(), - std::inserter(ledsUpdate, ledsUpdate.begin()), - ledComp); - - // These LEDs are only to be De-Asserted. - std::set_difference(transient.begin(), transient.end(), - ledsUpdate.begin(), ledsUpdate.end(), + // Find common LEDs between transient and Desired to know if some LEDs + // are changing state and not really getting DeAsserted + group ledsTransient {}; + std::set_intersection(transient.begin(),transient.end(), + desiredState.begin(), desiredState.end(), + std::inserter(ledsTransient, ledsTransient.begin()), + ledLess); + + // Find difference between above 2 to identify those LEDs which are + // really getting DeAsserted + std::set_difference(transient.begin(),transient.end(), + ledsTransient.begin(),ledsTransient.end(), std::inserter(ledsDeAssert, ledsDeAssert.begin()), - ledComp); + ledLess); + // Remove the elements from Current that are being DeAsserted. + if(ledsDeAssert.size()) + { + // Power off LEDs that are to be really DeAsserted + for (auto& it:ledsDeAssert) + { + // Update LEDs in "physically asserted" set by removing those + // LEDs which are De-Asserted + auto found = currentState.find(it); + if (found != currentState.end()) + { + currentState.erase(found); + } + } + } } - // Turn on these - std::set_difference(desiredState.begin(), desiredState.end(), - currentState.begin(), currentState.end(), - std::inserter(ledsAssert, ledsAssert.begin()), - ledComp); - + // Now LEDs that are to be Asserted. These could either be fresh asserts + // -or- change between [On]<-->[Blink] + group temp {}; + std::unique_copy(desiredState.begin(), desiredState.end(), + std::inserter(temp, temp.begin()), + ledEqual); + if(temp.size()) + { + // Find difference between [desired to be Asserted] and those LEDs + // that are physically asserted currently. + std::set_difference(temp.begin(), temp.end(), + currentState.begin(), currentState.end(), + std::inserter(ledsAssert, ledsAssert.begin()), + ledComp); + } - // Done.. Save the latest and greatest. - currentState = std::move(desiredState); + // Update the current actual and desired(the virtual actual) + currentState = std::move(temp); + combinedState = std::move(desiredState); // If we survive, then set the state accordingly. return assert; } /** @brief Run through the map and apply action on the LEDs */ -void Manager::driveLEDs(group& ledsAssert, group& ledsDeAssert, - group& ledsUpdate) +void Manager::driveLEDs(group& ledsAssert, group& ledsDeAssert) { // Map of physical LED dbus paths to their Service providers populateObjectMap(); @@ -94,17 +111,6 @@ void Manager::driveLEDs(group& ledsAssert, group& ledsDeAssert, } // This order of LED operation is important. - if (ledsUpdate.size()) - { - std::cout << "Updating LED states between (On <--> Blink)" - << std::endl; - for (const auto& it: ledsUpdate) - { - std::string objPath = std::string(PHY_LED_PATH) + it.name; - drivePhysicalLED(objPath, it.action, it.dutyOn); - } - } - if (ledsDeAssert.size()) { std::cout << "De-Asserting LEDs" << std::endl; diff --git a/manager.hpp b/manager.hpp index 1a75f8c..c96a4bc 100644 --- a/manager.hpp +++ b/manager.hpp @@ -4,6 +4,7 @@ #include <set> #include <sdbusplus/bus.hpp> #include "ledlayout.hpp" + namespace phosphor { namespace led @@ -28,13 +29,44 @@ class Manager Manager(Manager&&) = delete; Manager& operator=(Manager&&) = delete; - /** @brief For finding intersection */ + /** @brief Special comparator for finding set difference */ static bool ledComp(const phosphor::led::Layout::LedAction& left, const phosphor::led::Layout::LedAction& right) { + // Example : + // If FIRST_1 is {fan0, 1, 1} and FIRST_2 is {fan0, 2, 2}, + // with default priority of Blink, this comparator would return + // false. But considering the priority, this comparator would need + // to return true so that we consider appropriate set and in + // this case its {fan0, 1, 1} + if (left.name == right.name) + { + if (left.action == right.action) + { + return false; + } + else + { + return true; + } + } + return left.name < right.name; + } + + /** @brief Comparator for finding LEDs to be DeAsserted */ + static bool ledLess(const phosphor::led::Layout::LedAction& left, + const phosphor::led::Layout::LedAction& right) + { return left.name < right.name; } + /** @brief Comparator for helping unique_copy */ + static bool ledEqual(const phosphor::led::Layout::LedAction& left, + const phosphor::led::Layout::LedAction& right) + { + return left.name == right.name; + } + using group = std::set<phosphor::led::Layout::LedAction>; using LedLayout = std::map<std::string, group>; @@ -58,28 +90,24 @@ class Manager * * @param[in] path - dbus path of group * @param[in] assert - Could be true or false - * @param[in] ledsAssert - LEDs that are to be asserted newly + * @param[in] ledsAssert - LEDs that are to be asserted new + * or to a different state * @param[in] ledsDeAssert - LEDs that are to be Deasserted - * @param[in] ledsUpdate - LEDs that need a transition between - * different types of asserted states. * * @return - Success or exception thrown */ bool setGroupState(const std::string& path, bool assert, - group& ledsAssert, group& ledsDeAssert, - group& ledsUpdate); + group& ledsAssert, group& ledsDeAssert); /** @brief Finds the set of LEDs to operate on and executes action * * @param[in] ledsAssert - LEDs that are to be asserted newly + * or to a different state * @param[in] ledsDeAssert - LEDs that are to be Deasserted - * @param[in] ledsUpdate - LEDs that need a transition between - * different types of asserted states. * * @return: None */ - void driveLEDs(group& ledsAssert, group& ledsDeAssert, - group& ledsUpdate); + void driveLEDs(group& ledsAssert, group& ledsDeAssert); private: /** @brief sdbusplus handler */ @@ -91,9 +119,14 @@ class Manager /** @brief Pointers to groups that are in asserted state */ std::set<const group*> assertedGroups; - /** @brief Contains the LEDs that are in asserted state */ + /** @brief Contains the highest priority actions for all + * asserted LEDs. + */ group currentState; + /** @brief Contains the set of all actions for asserted LEDs */ + group combinedState; + /** @brief Returns action string based on enum * * @param[in] action - Action enum diff --git a/parse_led.py b/parse_led.py index 5afe4b0..5392e97 100755 --- a/parse_led.py +++ b/parse_led.py @@ -63,9 +63,10 @@ if __name__ == '__main__': ofile.write(' {\"' + underscore(led_dict) + '\",') ofile.write('phosphor::led::Layout::' + str(list_dict.get('Action', 'Off')) + ',') - ofile.write(str(list_dict.get('DutyOn', 0)) + ',') + ofile.write(str(list_dict.get('DutyOn', 50)) + ',') ofile.write(str(list_dict.get('Period', 0)) + ',') - + priority = str(list_dict.get('Priority', 'Blink')) + ofile.write('phosphor::led::Layout::' + priority + ',') ofile.write('},\n') ofile.write(' }},\n') ofile.write('};\n') diff --git a/test/led-test-map.hpp b/test/led-test-map.hpp index a8a62af..0b44ee3 100644 --- a/test/led-test-map.hpp +++ b/test/led-test-map.hpp @@ -1,7 +1,8 @@ static const std::map<std::string, std::set<phosphor::led::Layout::LedAction>> singleLedOn = { { "/xyz/openbmc_project/ledmanager/groups/SingleLed",{ - {"One",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, } }, }; @@ -9,7 +10,17 @@ static const std::map<std::string, static const std::map<std::string, std::set<phosphor::led::Layout::LedAction>> singleLedBlink = { { "/xyz/openbmc_project/ledmanager/groups/SingleLed",{ - {"One",phosphor::led::Layout::Blink}, + {"One",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + } + }, +}; + +static const std::map<std::string, + std::set<phosphor::led::Layout::LedAction>> singleLedBlinkOverrideOn = { + { "/xyz/openbmc_project/ledmanager/groups/SingleLed",{ + {"One",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, } }, }; @@ -17,9 +28,12 @@ static const std::map<std::string, static const std::map<std::string, std::set<phosphor::led::Layout::LedAction>> multipleLedsOn = { { "/xyz/openbmc_project/ledmanager/groups/MultipleLeds",{ - {"One",phosphor::led::Layout::On}, - {"Two",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, } }, }; @@ -27,9 +41,12 @@ static const std::map<std::string, static const std::map<std::string, std::set<phosphor::led::Layout::LedAction>> multipleLedsBlink = { { "/xyz/openbmc_project/ledmanager/groups/MultipleLeds",{ - {"One",phosphor::led::Layout::Blink}, - {"Two",phosphor::led::Layout::Blink}, - {"Three",phosphor::led::Layout::Blink}, + {"One",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + {"Two",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + {"Three",phosphor::led::Layout::Blink,0, + 0, phosphor::led::Layout::Blink}, } }, }; @@ -37,11 +54,16 @@ static const std::map<std::string, static const std::map<std::string, std::set<phosphor::led::Layout::LedAction>> multipleLedsOnAndBlink = { { "/xyz/openbmc_project/ledmanager/groups/MultipleLedsMix",{ - {"One",phosphor::led::Layout::Blink}, - {"Two",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::Blink}, - {"Four",phosphor::led::Layout::On}, - {"Five",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + {"Two",phosphor::led::Layout::On, + 0, phosphor::led::Layout::Blink}, + {"Three",phosphor::led::Layout::Blink, + 0, phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, + 0, phosphor::led::Layout::Blink}, + {"Five",phosphor::led::Layout::On, + 0, phosphor::led::Layout::Blink}, } }, }; @@ -49,15 +71,21 @@ static const std::map<std::string, static const std::map<std::string, std::set<phosphor::led::Layout::LedAction>> twoGroupsWithDistinctLEDsOn = { { "/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet",{ - {"One",phosphor::led::Layout::On}, - {"Two",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, } }, { "/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet",{ - {"Four",phosphor::led::Layout::On}, - {"Five",phosphor::led::Layout::On}, - {"Six",phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + {"Five",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, } }, }; @@ -65,33 +93,65 @@ static const std::map<std::string, static const std::map<std::string, std::set<phosphor::led::Layout::LedAction>> twoGroupsWithOneComonLEDOn = { { "/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet",{ - {"One",phosphor::led::Layout::On}, - {"Two",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, } }, { "/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet",{ - {"Four",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::On}, - {"Six",phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, } }, }; static const std::map<std::string, - std::set<phosphor::led::Layout::LedAction>> - twoGroupsWithOneComonLEDInDifferentState = { + std::set<phosphor::led::Layout::LedAction>> twoGroupsWithOneComonLEDOnOneLEDBlinkPriority = { + { "/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet",{ + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + } + }, + { "/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet",{ + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + } + }, +}; + +static const std::map<std::string, + std::set<phosphor::led::Layout::LedAction>> twoGroupsWithOneComonLEDOnPriority = { { "/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet",{ - {"One",phosphor::led::Layout::On}, - {"Two",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, } }, { "/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet",{ - {"Two",phosphor::led::Layout::Blink}, - {"Four",phosphor::led::Layout::On}, - {"Five",phosphor::led::Layout::On}, - {"Six",phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, } }, }; @@ -100,16 +160,23 @@ static const std::map<std::string, std::set<phosphor::led::Layout::LedAction>> twoGroupsWithMultiplComonLEDOn = { { "/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet",{ - {"One",phosphor::led::Layout::On}, - {"Two",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, } }, { "/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet",{ - {"Two",phosphor::led::Layout::On}, - {"Six",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::On}, - {"Seven",phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Seven",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, } }, }; @@ -118,36 +185,56 @@ static const std::map<std::string, std::set<phosphor::led::Layout::LedAction>> twoGroupsWithMultipleComonLEDInDifferentState = { { "/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet",{ - {"One",phosphor::led::Layout::On}, - {"Two",phosphor::led::Layout::Blink}, - {"Three",phosphor::led::Layout::On}, - {"Four",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, } }, { "/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet",{ - {"Two",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::Blink}, - {"Five",phosphor::led::Layout::On}, - {"Six",phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + {"Five",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, } }, }; static const std::map<std::string, std::set<phosphor::led::Layout::LedAction>> - twoGroupsWithMultipleComonLEDInDifferentStateBlinkAgain = { + twoGroupsWithMultipleComonLEDInDifferentStateDiffPriority = { { "/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet",{ - {"One",phosphor::led::Layout::On}, - {"Two",phosphor::led::Layout::Blink}, - {"Three",phosphor::led::Layout::On}, - {"Four",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Ten",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, } }, { "/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet",{ - {"Two",phosphor::led::Layout::Blink}, - {"Three",phosphor::led::Layout::Blink}, - {"Five",phosphor::led::Layout::On}, - {"Six",phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + {"Five",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Ten",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, } }, }; diff --git a/test/utest.cpp b/test/utest.cpp index 19c54a2..ea08ea0 100644 --- a/test/utest.cpp +++ b/test/utest.cpp @@ -27,20 +27,19 @@ TEST_F(LedTest, assertSingleLedOn) // Assert the LEDs. Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group = "/xyz/openbmc_project/ledmanager/groups/SingleLed"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refAssert = { - {"One",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -59,20 +58,19 @@ TEST_F(LedTest, assertSingleLedBlink) // Assert the LEDs. Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group = "/xyz/openbmc_project/ledmanager/groups/SingleLed"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refAssert = { - {"One",phosphor::led::Layout::Blink}, + {"One",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -91,20 +89,19 @@ TEST_F(LedTest, assertSingleLedOnAndreAssert) // Assert the LEDs. Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group = "/xyz/openbmc_project/ledmanager/groups/SingleLed"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refAssert = { - {"One",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -117,16 +114,14 @@ TEST_F(LedTest, assertSingleLedOnAndreAssert) // Assert the LEDs. Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group = "/xyz/openbmc_project/ledmanager/groups/SingleLed"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); EXPECT_EQ(0, ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); } } @@ -138,22 +133,23 @@ TEST_F(LedTest, assertMultipleLedOn) // Assert the LEDs. Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group = "/xyz/openbmc_project/ledmanager/groups/MultipleLeds"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refAssert = { - {"One",phosphor::led::Layout::On}, - {"Two",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -172,22 +168,23 @@ TEST_F(LedTest, assertMultipleLedBlink) // Assert the LEDs. Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group = "/xyz/openbmc_project/ledmanager/groups/MultipleLeds"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refAssert = { - {"One",phosphor::led::Layout::Blink}, - {"Two",phosphor::led::Layout::Blink}, - {"Three",phosphor::led::Layout::Blink}, + {"One",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + {"Two",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + {"Three",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -206,22 +203,23 @@ TEST_F(LedTest, assertMultipleLedBlinkAndDeAssert) // Assert the LEDs. Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group = "/xyz/openbmc_project/ledmanager/groups/MultipleLeds"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refAssert = { - {"One",phosphor::led::Layout::Blink}, - {"Two",phosphor::led::Layout::Blink}, - {"Three",phosphor::led::Layout::Blink}, + {"One",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + {"Two",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + {"Three",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -234,22 +232,23 @@ TEST_F(LedTest, assertMultipleLedBlinkAndDeAssert) // Assert the LEDs. Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group = "/xyz/openbmc_project/ledmanager/groups/MultipleLeds"; auto result = manager.setGroupState(group, false, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(false, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refDeAssert = { - {"One",phosphor::led::Layout::Blink}, - {"Two",phosphor::led::Layout::Blink}, - {"Three",phosphor::led::Layout::Blink}, + {"One",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + {"Two",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + {"Three",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, }; EXPECT_EQ(refDeAssert.size(), ledsDeAssert.size()); EXPECT_EQ(0, ledsAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refDeAssert and ledsDeAssert must be null. Manager::group temp {}; @@ -268,22 +267,23 @@ TEST_F(LedTest, assertMultipleLedBlinkAndDeAssertTwice) // Assert the LEDs. Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group = "/xyz/openbmc_project/ledmanager/groups/MultipleLeds"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refAssert = { - {"One",phosphor::led::Layout::Blink}, - {"Two",phosphor::led::Layout::Blink}, - {"Three",phosphor::led::Layout::Blink}, + {"One",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + {"Two",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + {"Three",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -296,22 +296,23 @@ TEST_F(LedTest, assertMultipleLedBlinkAndDeAssertTwice) // DeAssert the LEDs. Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group = "/xyz/openbmc_project/ledmanager/groups/MultipleLeds"; auto result = manager.setGroupState(group, false, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(false, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refDeAssert = { - {"One",phosphor::led::Layout::Blink}, - {"Two",phosphor::led::Layout::Blink}, - {"Three",phosphor::led::Layout::Blink}, + {"One",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + {"Two",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + {"Three",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, }; EXPECT_EQ(refDeAssert.size(), ledsDeAssert.size()); EXPECT_EQ(0, ledsAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refDeAssert and ledsDeAssert must be null. Manager::group temp {}; @@ -324,15 +325,13 @@ TEST_F(LedTest, assertMultipleLedBlinkAndDeAssertTwice) // DeAssert the LEDs. Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group = "/xyz/openbmc_project/ledmanager/groups/MultipleLeds"; auto result = manager.setGroupState(group, false, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(false, result); EXPECT_EQ(0, ledsDeAssert.size()); EXPECT_EQ(0, ledsAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); } } @@ -344,24 +343,27 @@ TEST_F(LedTest, assertMultipleLedOnAndBlink) // Assert the LEDs. Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group = "/xyz/openbmc_project/ledmanager/groups/MultipleLedsMix"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refAssert = { - {"One",phosphor::led::Layout::Blink}, - {"Two",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::Blink}, - {"Four",phosphor::led::Layout::On}, - {"Five",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + {"Two",phosphor::led::Layout::On, + 0, phosphor::led::Layout::Blink}, + {"Three",phosphor::led::Layout::Blink, + 0, phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, + 0, phosphor::led::Layout::Blink}, + {"Five",phosphor::led::Layout::On, + 0, phosphor::led::Layout::Blink}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -380,22 +382,23 @@ TEST_F(LedTest, assertTwoGroupsOnWithDistinctLEDOn) // Assert Set-A Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refAssert = { - {"One",phosphor::led::Layout::On}, - {"Two",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -408,22 +411,23 @@ TEST_F(LedTest, assertTwoGroupsOnWithDistinctLEDOn) // Assert Set-B Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refAssert = { - {"Four",phosphor::led::Layout::On}, - {"Five",phosphor::led::Layout::On}, - {"Six",phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + {"Five",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -442,22 +446,23 @@ TEST_F(LedTest, asserttwoGroupsWithOneComonLEDOn) // Assert Set-A Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refAssert = { - {"One",phosphor::led::Layout::On}, - {"Two",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -470,21 +475,21 @@ TEST_F(LedTest, asserttwoGroupsWithOneComonLEDOn) // Assert Set-B Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refAssert = { - {"Four",phosphor::led::Layout::On}, - {"Six",phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -495,30 +500,32 @@ TEST_F(LedTest, asserttwoGroupsWithOneComonLEDOn) } } -/** @brief Assert 2 groups having one of the LEDs common in different state */ -TEST_F(LedTest, assertTwoGroupsWithOneComonLEDInDifferentState) +/** @brief Assert 2 groups having one of the LEDs common but having Blink as + * priority and Deassert*/ +TEST_F(LedTest, asserttwoGroupsWithOneComonLEDOnOneLEDBlinkPriorityAndDeAssertB) { - Manager manager(bus, twoGroupsWithOneComonLEDInDifferentState); + Manager manager(bus, twoGroupsWithOneComonLEDOnOneLEDBlinkPriority); { // Assert Set-A Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refAssert = { - {"One",phosphor::led::Layout::On}, - {"Two",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -531,23 +538,22 @@ TEST_F(LedTest, assertTwoGroupsWithOneComonLEDInDifferentState) // Assert Set-B Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. + // Does not action on [Three] since priority is [Blink] std::set<Layout::LedAction> refAssert = { - {"Two",phosphor::led::Layout::Blink}, - {"Four",phosphor::led::Layout::On}, - {"Five",phosphor::led::Layout::On}, - {"Six",phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -556,33 +562,366 @@ TEST_F(LedTest, assertTwoGroupsWithOneComonLEDInDifferentState) std::inserter(temp, temp.begin())); EXPECT_EQ(0, temp.size()); } + { + // De-Assert Set-B + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; + auto result = manager.setGroupState(group, false, ledsAssert, + ledsDeAssert); + EXPECT_EQ(false, result); + + // Need just the ledsDeAssserted populated with these. + std::set<Layout::LedAction> refDeAssert = { + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + }; + EXPECT_EQ(refDeAssert.size(), ledsDeAssert.size()); + EXPECT_EQ(0, ledsAssert.size()); + + // difference of refDeAssert and ledsDeAssert must be null. + // [Three] is not touched since its already [Blink] + Manager::group temp {}; + std::set_difference(ledsDeAssert.begin(), ledsDeAssert.end(), + refDeAssert.begin(), refDeAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + } +} + +/** @brief Assert 2 groups having one of the LEDs common but having Blink as + * priority and Deassert A */ +TEST_F(LedTest, asserttwoGroupsWithOneComonLEDOnOneLEDBlinkPriorityAndDeAssertA) +{ + Manager manager(bus, twoGroupsWithOneComonLEDOnOneLEDBlinkPriority); + { + // Assert Set-A + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; + auto result = manager.setGroupState(group, true, ledsAssert, + ledsDeAssert); + EXPECT_EQ(true, result); + + // Need just the ledsAssserted populated with these. + std::set<Layout::LedAction> refAssert = { + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + EXPECT_EQ(0, ledsDeAssert.size()); + + // difference of refAssert and ledsAssert must be null. + Manager::group temp {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + } + { + // Assert Set-B + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; + auto result = manager.setGroupState(group, true, ledsAssert, + ledsDeAssert); + EXPECT_EQ(true, result); + + // Need just the ledsAssserted populated with these. + // [Three] does not get actioned since it has Blink priority + std::set<Layout::LedAction> refAssert = { + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + EXPECT_EQ(0, ledsDeAssert.size()); + + // difference of refAssert and ledsAssert must be null. + Manager::group temp {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + } + { + // De-Assert Set-A + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; + auto result = manager.setGroupState(group, false, ledsAssert, + ledsDeAssert); + EXPECT_EQ(false, result); + + // Need just the ledsDeAssserted populated with these. + std::set<Layout::LedAction> refDeAssert = { + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + }; + EXPECT_EQ(refDeAssert.size(), ledsDeAssert.size()); + + // difference of refDeAssert and ledsDeAssert must be null. + Manager::group temp {}; + std::set_difference(ledsDeAssert.begin(), ledsDeAssert.end(), + refDeAssert.begin(), refDeAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + + // Need just the ledsAssert populated with these. + std::set<Layout::LedAction> refAssert = { + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + + // difference of refAssert and ledsAssert must be null. + Manager::group temp1 {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), + std::inserter(temp1, temp1.begin())); + EXPECT_EQ(0, temp1.size()); + } +} + +/** @brief Assert 2 groups having one of the LEDs common but having ON as + * priority And Deassert A */ +TEST_F(LedTest, asserttwoGroupsWithOneComonLEDOnOneLEDOnPriorityAndDeAssertA) +{ + Manager manager(bus, twoGroupsWithOneComonLEDOnPriority); + { + // Assert Set-A + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; + auto result = manager.setGroupState(group, true, + ledsAssert, ledsDeAssert); + EXPECT_EQ(true, result); + + // Need just the ledsAssserted populated with these. + std::set<Layout::LedAction> refAssert = { + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + EXPECT_EQ(0, ledsDeAssert.size()); + + // difference of refAssert and ledsAssert must be null. + Manager::group temp {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + } + { + // Assert Set-B + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; + auto result = manager.setGroupState(group, true, ledsAssert, + ledsDeAssert); + EXPECT_EQ(true, result); + + // Need just the ledsAssserted populated with these. + // Three is set to ON due to ON priority. + std::set<Layout::LedAction> refAssert = { + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + EXPECT_EQ(0, ledsDeAssert.size()); + + // difference of refAssert and ledsAssert must be null. + Manager::group temp {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), + std::inserter(temp, temp.begin())); + } + { + // De-Assert Set-A + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; + auto result = manager.setGroupState(group, false, ledsAssert, + ledsDeAssert); + EXPECT_EQ(false, result); + + // Need just the ledsDeAssserted populated with these. + // [Three] stays in [On] since [B] has it [On] + std::set<Layout::LedAction> refDeAssert = { + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + }; + EXPECT_EQ(refDeAssert.size(), ledsDeAssert.size()); + EXPECT_EQ(0, ledsAssert.size()); + + // difference of refDeAssert and ledsDeAssert must be null. + Manager::group temp {}; + std::set_difference(ledsDeAssert.begin(), ledsDeAssert.end(), + refDeAssert.begin(), refDeAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + } +} + +/** @brief Assert 2 groups having one of the LEDs common but having ON as + * priority And Deassert B */ +TEST_F(LedTest, asserttwoGroupsWithOneComonLEDOnOneLEDOnPriorityAndDeAssertB) +{ + Manager manager(bus, twoGroupsWithOneComonLEDOnPriority); + { + // Assert Set-A + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; + auto result = manager.setGroupState(group, true, ledsAssert, + ledsDeAssert); + EXPECT_EQ(true, result); + + // Need just the ledsAssserted populated with these. + std::set<Layout::LedAction> refAssert = { + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + EXPECT_EQ(0, ledsDeAssert.size()); + + // difference of refAssert and ledsAssert must be null. + Manager::group temp {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + } + { + // Assert Set-B + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; + auto result = manager.setGroupState(group, true, ledsAssert, + ledsDeAssert); + EXPECT_EQ(true, result); + + // Need just the ledsAssserted populated with these. + // Three is set to ON due to ON priority. + std::set<Layout::LedAction> refAssert = { + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + EXPECT_EQ(0, ledsDeAssert.size()); + + // difference of refAssert and ledsAssert must be null. + Manager::group temp {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), + std::inserter(temp, temp.begin())); + } + { + // De-Assert Set-B + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; + auto result = manager.setGroupState(group, false, ledsAssert, + ledsDeAssert); + EXPECT_EQ(false, result); + + // Need just the ledsDeAssserted populated with these. + std::set<Layout::LedAction> refDeAssert = { + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + }; + EXPECT_EQ(refDeAssert.size(), ledsDeAssert.size()); + + // difference of refDeAssert and ledsDeAssert must be null. + Manager::group temp {}; + std::set_difference(ledsDeAssert.begin(), ledsDeAssert.end(), + refDeAssert.begin(), refDeAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + + // Need just the ledsAssert populated with these. + // Since [Three] stood [On], need to go back to [Blink] + std::set<Layout::LedAction> refAssert = { + {"Three",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + + // difference of refAssert and ledsAssert must be null. + Manager::group temp1 {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + } } /** @brief Assert 2 groups having multiple common LEDs in Same State */ -TEST_F(LedTest, assertTwoGroupsWithMultiplComonLEDOn) +TEST_F(LedTest, assertTwoGroupsWithMultiplComonLEDOnAndDeAssert) { Manager manager(bus, twoGroupsWithMultiplComonLEDOn); { // Assert Set-B Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refAssert = { - {"Two",phosphor::led::Layout::On}, - {"Six",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::On}, - {"Seven",phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Seven",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -595,20 +934,19 @@ TEST_F(LedTest, assertTwoGroupsWithMultiplComonLEDOn) // Assert Set-A Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refAssert = { - {"One",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -617,33 +955,92 @@ TEST_F(LedTest, assertTwoGroupsWithMultiplComonLEDOn) std::inserter(temp, temp.begin())); EXPECT_EQ(0, temp.size()); } + { + // De-Assert Set-B + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; + auto result = manager.setGroupState(group, false, ledsAssert, + ledsDeAssert); + EXPECT_EQ(false, result); + + // Need just the ledsDeAssserted populated with these. + std::set<Layout::LedAction> refDeAssert = { + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Seven",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + }; + EXPECT_EQ(refDeAssert.size(), ledsDeAssert.size()); + EXPECT_EQ(0, ledsAssert.size()); + + // difference of refDeAssert and ledsDeAssert must be null. + Manager::group temp {}; + std::set_difference(ledsDeAssert.begin(), ledsDeAssert.end(), + refDeAssert.begin(), refDeAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + + } } /** @brief Assert 2 groups having multiple LEDs common in different state */ -TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDInDifferentStates) +TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDInDifferentStateBandA) { Manager manager(bus, twoGroupsWithMultipleComonLEDInDifferentState); { + // Assert Set-B + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; + auto result = manager.setGroupState(group, true, ledsAssert, + ledsDeAssert); + EXPECT_EQ(true, result); + + // Need just the ledsAssserted populated with these. + std::set<Layout::LedAction> refAssert = { + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + {"Five",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + EXPECT_EQ(0, ledsDeAssert.size()); + + // difference of refAssert and ledsAssert must be null. + Manager::group temp {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + } + { // Assert Set-A Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); - // Need just the ledsAssserted populated with these. + // Need just the ledsAssserted populated with these + // [Two] remains [On] due to higher priority. + // [Three] remains [Blink] std::set<Layout::LedAction> refAssert = { - {"One",phosphor::led::Layout::On}, - {"Two",phosphor::led::Layout::Blink}, - {"Three",phosphor::led::Layout::On}, - {"Four",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -652,28 +1049,67 @@ TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDInDifferentStates) std::inserter(temp, temp.begin())); EXPECT_EQ(0, temp.size()); } +} + +/** @brief Assert 2 groups having multiple LEDs common in different state */ +TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDInDifferentStateAtoB) +{ + Manager manager(bus, twoGroupsWithMultipleComonLEDInDifferentState); { - // Assert Set-B + // Assert Set-A Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; - auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these.'Two' gets to Blink // due to higher priority. std::set<Layout::LedAction> refAssert = { - {"Two",phosphor::led::Layout::Blink}, - {"Three",phosphor::led::Layout::Blink}, - {"Five",phosphor::led::Layout::On}, - {"Six",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + EXPECT_EQ(0, ledsDeAssert.size()); + + // difference of refAssert and ledsAssert must be null. + Manager::group temp {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + } + { + // Assert Set-B + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; + auto result = manager.setGroupState(group, true, ledsAssert, + ledsDeAssert); + EXPECT_EQ(true, result); + + // Need just the ledsAssserted populated with these. + // [Three] remains [Blink] from previous + // [Two] moves to [On] from [Blink] due to [On] priority + std::set<Layout::LedAction> refAssert = { + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Five",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -684,32 +1120,35 @@ TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDInDifferentStates) } } -/** @brief Assert 2 groups having multiple LEDs common in Same State - * and then De-Assert One +/** @brief Assert 2 groups having multiple LEDs common in different state + * DeAssert twice */ -TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDAndDeAssertOne) +TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDInDifferentStateAtoBDeAssertTwice) { - Manager manager(bus, twoGroupsWithMultiplComonLEDOn); + Manager manager(bus, twoGroupsWithMultipleComonLEDInDifferentState); { // Assert Set-A Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refAssert = { - {"One",phosphor::led::Layout::On}, - {"Two",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -722,21 +1161,25 @@ TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDAndDeAssertOne) // Assert Set-B Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. + // [Two] turns [On] due to priority + // [Three] remains [Blink] std::set<Layout::LedAction> refAssert = { - {"Six",phosphor::led::Layout::On}, - {"Seven",phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Five",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -746,59 +1189,154 @@ TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDAndDeAssertOne) EXPECT_EQ(0, temp.size()); } { + // DeAssert Set-B + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; + auto result = manager.setGroupState(group, false, ledsAssert, + ledsDeAssert); + EXPECT_EQ(false, result); + + // Need just the ledsAssserted populated with these. + std::set<Layout::LedAction> refDeAssert = { + {"Five",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + }; + EXPECT_EQ(refDeAssert.size(), ledsDeAssert.size()); + + // difference of refDeAssert and ledsDeAssert must be null. + Manager::group temp {}; + std::set_difference(ledsDeAssert.begin(), ledsDeAssert.end(), + refDeAssert.begin(), refDeAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + + // Need just the ledsAssert populated with these. + // [Two] will go back to [Blink] from [On] + std::set<Layout::LedAction> refAssert = { + {"Two",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + + // difference of refAssert and ledsAssert must be null. + Manager::group temp1 {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), + std::inserter(temp1, temp1.begin())); + EXPECT_EQ(0, temp1.size()); + } + { // DeAssert Set-A Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; auto result = manager.setGroupState(group, false, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(false, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refDeAssert = { - {"One",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, }; EXPECT_EQ(refDeAssert.size(), ledsDeAssert.size()); EXPECT_EQ(0, ledsAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); - // difference of refAssert and ledsAssert must be null. + // difference of refDeAssert and ledsDeAssert must be null. Manager::group temp {}; std::set_difference(ledsDeAssert.begin(), ledsDeAssert.end(), refDeAssert.begin(), refDeAssert.end(), std::inserter(temp, temp.begin())); EXPECT_EQ(0, temp.size()); } + { + // DeAssert Set-A again and make sure we get all empty + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; + auto result = manager.setGroupState(group, false, ledsAssert, + ledsDeAssert); + EXPECT_EQ(false, result); + EXPECT_EQ(0, ledsDeAssert.size()); + EXPECT_EQ(0, ledsAssert.size()); + } } -/** @brief Assert 2 groups having multiple LEDs common but in - * different state and De-Assert one*/ -TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDInDifferentStateDeAssertOne) +/** @brief Assert 2 groups having multiple LEDs common in different state and + * mixed priority. DeAssert-A + */ +TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDInDifferentStateDiffPriorityAandB) { - Manager manager(bus, twoGroupsWithMultipleComonLEDInDifferentState); + Manager manager(bus, twoGroupsWithMultipleComonLEDInDifferentStateDiffPriority); + { + // Assert Set-A + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; + auto result = manager.setGroupState(group, true, ledsAssert, + ledsDeAssert); + EXPECT_EQ(true, result); + + // Need just the ledsAssserted populated with these. + std::set<Layout::LedAction> refAssert = { + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Ten",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + EXPECT_EQ(0, ledsDeAssert.size()); + + // difference of refAssert and ledsAssert must be null. + Manager::group temp {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + } { // Assert Set-B Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. + // [Two] gets to [ON] due to higher priority. + // [Three] remains on since it never was in [Blink] before + // [Ten] remains [Blink] due to priority: [Blink] std::set<Layout::LedAction> refAssert = { - {"Two",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::Blink}, - {"Five",phosphor::led::Layout::On}, - {"Six",phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Five",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -808,27 +1346,74 @@ TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDInDifferentStateDeAssertOne) EXPECT_EQ(0, temp.size()); } { + // De-Assert Set-A + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; + auto result = manager.setGroupState(group, false, ledsAssert, + ledsDeAssert); + EXPECT_EQ(false, result); + + // Need just the ledsDeAsssert populated with these. + std::set<Layout::LedAction> refDeAssert = { + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + }; + EXPECT_EQ(refDeAssert.size(), ledsDeAssert.size()); + + // Need just the ledsAsssert populated with these. + // [Ten] Moves to [On] since there is no prior [Blink] + // [Three] remains [On] since it never changed state. + // [Two] remains [On] since it did not go back + std::set<Layout::LedAction> refAssert = { + {"Ten",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + + // difference of refAssert and ledsAssert must be null. + Manager::group temp {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + } +} + +/** @brief Assert 2 groups having multiple LEDs common in different state and + * mixed priority. DeAssert-B + */ +TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDInDifferentStateDiffPriorityAandBDeAssertB) +{ + Manager manager(bus, twoGroupsWithMultipleComonLEDInDifferentStateDiffPriority); + { // Assert Set-A Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); - // Need just the ledsAssserted populated with these. 'Three` remains at - // Blink due to increased priority. + // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refAssert = { - {"One",phosphor::led::Layout::On}, - {"Two",phosphor::led::Layout::Blink}, - {"Three",phosphor::led::Layout::Blink}, - {"Four",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Ten",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -838,75 +1423,106 @@ TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDInDifferentStateDeAssertOne) EXPECT_EQ(0, temp.size()); } { - // DeAssert Set-A + // Assert Set-B Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; - auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; - auto result = manager.setGroupState(group, false, ledsAssert, - ledsDeAssert, ledsUpdate); - EXPECT_EQ(false, result); + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; + auto result = manager.setGroupState(group, true, ledsAssert, + ledsDeAssert); + EXPECT_EQ(true, result); - // Need just the ledsUpdated populated with these. - std::set<Layout::LedAction> refUpdate = { - {"Two",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::Blink}, + // Need just the ledsAssserted populated with these. + // [Two] gets to [ON] due to higher priority. + // [Three] remains on since it never was in [Blink] before + // [Ten] remains [Blink] due to priority: [Blink] + std::set<Layout::LedAction> refAssert = { + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Five",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, }; - EXPECT_EQ(refUpdate.size(), ledsUpdate.size()); - EXPECT_EQ(0, ledsAssert.size()); + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + EXPECT_EQ(0, ledsDeAssert.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; - std::set_difference(ledsUpdate.begin(), ledsUpdate.end(), - refUpdate.begin(), refUpdate.end(), + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), std::inserter(temp, temp.begin())); EXPECT_EQ(0, temp.size()); + } + { + // De-Assert Set-B + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; - // Need just the ledsDeAsserted populated with these. + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; + auto result = manager.setGroupState(group, false, ledsAssert, + ledsDeAssert); + EXPECT_EQ(false, result); + + // Need just the ledsDeAsssert populated with these. std::set<Layout::LedAction> refDeAssert = { - {"One",phosphor::led::Layout::On}, - {"Four",phosphor::led::Layout::On}, + {"Five",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, }; EXPECT_EQ(refDeAssert.size(), ledsDeAssert.size()); + // Need just the ledsAsssert populated with these. + // [Ten] remains [Blink] since it did not move to [On] + // [Three] remains [On] since it never changed state. + // [Two] moves to [Blink] since there is no prior [On] + std::set<Layout::LedAction> refAssert = { + {"Two",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + // difference of refAssert and ledsAssert must be null. - temp.clear(); - std::set_difference(ledsDeAssert.begin(), ledsDeAssert.end(), - refDeAssert.begin(), refDeAssert.end(), + Manager::group temp {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), std::inserter(temp, temp.begin())); EXPECT_EQ(0, temp.size()); } } -/** @brief Assert 2 groups having multiple LEDs common but in - * different state and De-Assert one and make sure the - * state is changed back to Blink +/** @brief Assert 2 groups having multiple LEDs common in different state and + * mixed priority. */ -TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDInDifferentStateDeAssertOneGetBlink) +TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDInDifferentStateDiffPriorityBandA) { - Manager manager(bus, twoGroupsWithMultipleComonLEDInDifferentStateBlinkAgain); + Manager manager(bus, twoGroupsWithMultipleComonLEDInDifferentStateDiffPriority); { // Assert Set-B Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); // Need just the ledsAssserted populated with these. std::set<Layout::LedAction> refAssert = { - {"Two",phosphor::led::Layout::Blink}, - {"Three",phosphor::led::Layout::Blink}, - {"Five",phosphor::led::Layout::On}, - {"Six",phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + {"Five",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Ten",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -919,24 +1535,26 @@ TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDInDifferentStateDeAssertOneGe // Assert Set-A Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; auto result = manager.setGroupState(group, true, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(true, result); - // Need just the ledsAssserted populated with these. 'Three` remains at - // Blink due to increased priority. Two is already in asserted state and - // it wont be asserted again. + // Need just the ledsAssserted populated with these. + // [Two] remains [ON] due to higher priority. + // [Three] remains on since it never was in [Blink] before + // [Ten] moves to [Blink] due to priority: [Blink] std::set<Layout::LedAction> refAssert = { - {"One",phosphor::led::Layout::On}, - {"Three",phosphor::led::Layout::Blink}, - {"Four",phosphor::led::Layout::On}, + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Ten",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, }; EXPECT_EQ(refAssert.size(), ledsAssert.size()); EXPECT_EQ(0, ledsDeAssert.size()); - EXPECT_EQ(0, ledsUpdate.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; @@ -945,43 +1563,274 @@ TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDInDifferentStateDeAssertOneGe std::inserter(temp, temp.begin())); EXPECT_EQ(0, temp.size()); } +} + +/** @brief Assert 2 groups having multiple LEDs common in different state and + * mixed priority and De-Assert-A + */ +TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDInDifferentStateDiffPriorityBandADeAssertA) +{ + Manager manager(bus, twoGroupsWithMultipleComonLEDInDifferentStateDiffPriority); { - // DeAssert Set-A + // Assert Set-B + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; + auto result = manager.setGroupState(group, true, ledsAssert, + ledsDeAssert); + EXPECT_EQ(true, result); + + // Need just the ledsAssserted populated with these. + std::set<Layout::LedAction> refAssert = { + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + {"Five",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Ten",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + EXPECT_EQ(0, ledsDeAssert.size()); + + // difference of refAssert and ledsAssert must be null. + Manager::group temp {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + } + { + // Assert Set-A + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; + auto result = manager.setGroupState(group, true, ledsAssert, + ledsDeAssert); + EXPECT_EQ(true, result); + + // Need just the ledsAssserted populated with these. + // [Two] remains [ON] due to higher priority. + // [Three] remains on since it never was in [Blink] before + // [Ten] moves to [Blink] due to priority: [Blink] + std::set<Layout::LedAction> refAssert = { + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Ten",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + EXPECT_EQ(0, ledsDeAssert.size()); + + // difference of refAssert and ledsAssert must be null. + Manager::group temp {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + } + { + // De-Assert Set-A Manager::group ledsAssert {}; Manager::group ledsDeAssert {}; - Manager::group ledsUpdate {}; auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; auto result = manager.setGroupState(group, false, ledsAssert, - ledsDeAssert, ledsUpdate); + ledsDeAssert); EXPECT_EQ(false, result); - // Need just the ledsUpdated populated with these. - std::set<Layout::LedAction> refUpdate = { - {"Three",phosphor::led::Layout::Blink}, + // Need just the ledsAssserted populated with these. + // [Ten] remains [Blink] due to priority. + std::set<Layout::LedAction> refDeAssert = { + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, }; - EXPECT_EQ(refUpdate.size(), ledsUpdate.size()); - EXPECT_EQ(0, ledsAssert.size()); + EXPECT_EQ(refDeAssert.size(), ledsDeAssert.size()); + + // Need just the ledsAssserted populated with these. + // [Two] remains [ON] due to higher priority. + // [Three] remains [On] since it never was in [Blink] before + // [Ten] moves to [On] due to priority: [Blink] + std::set<Layout::LedAction> refAssert = { + {"Ten",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + + // difference of refAssert and ledsAssert must be null. + Manager::group temp {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + } +} + +/** @brief Assert 2 groups having multiple LEDs common in different state and + * mixed priority and then DeAssert twice. + */ +TEST_F(LedTest, assertTwoGroupsWithMultipleComonLEDInDifferentStateOnBlinkPriorityBandA) +{ + Manager manager(bus, twoGroupsWithMultipleComonLEDInDifferentStateDiffPriority); + { + // Assert Set-B + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; + auto result = manager.setGroupState(group, true, ledsAssert, + ledsDeAssert); + EXPECT_EQ(true, result); + + // Need just the ledsAssserted populated with these. + std::set<Layout::LedAction> refAssert = { + {"Two",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + {"Five",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Ten",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + EXPECT_EQ(0, ledsDeAssert.size()); // difference of refAssert and ledsAssert must be null. Manager::group temp {}; - std::set_difference(ledsUpdate.begin(), ledsUpdate.end(), - refUpdate.begin(), refUpdate.end(), + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), std::inserter(temp, temp.begin())); EXPECT_EQ(0, temp.size()); + } + { + // Assert Set-A + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; - // Need just the ledsDeAsserted populated with these. + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; + auto result = manager.setGroupState(group, true, ledsAssert, + ledsDeAssert); + EXPECT_EQ(true, result); + + // Need just the ledsAssserted populated with these. + // [Two] remains [ON] due to higher priority. + // [Three] remains on since it never was in [Blink] before + // [Ten] moves to [Blink] due to priority: [Blink] + std::set<Layout::LedAction> refAssert = { + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Ten",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + EXPECT_EQ(0, ledsDeAssert.size()); + + // difference of refAssert and ledsAssert must be null. + Manager::group temp {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + } + { + // DeAssert Set-B + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; + auto result = manager.setGroupState(group, false, ledsAssert, + ledsDeAssert); + EXPECT_EQ(false, result); + + // Need just the ledsAssserted populated with these. + // [Ten] remains [Blink] due to priority. std::set<Layout::LedAction> refDeAssert = { - {"One",phosphor::led::Layout::On}, - {"Four",phosphor::led::Layout::On}, + {"Five",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Six",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, }; EXPECT_EQ(refDeAssert.size(), ledsDeAssert.size()); + // difference of refDeAssert and ledsDeAssert must be null. + Manager::group temp {}; + std::set_difference(ledsDeAssert.begin(), ledsDeAssert.end(), + refDeAssert.begin(), refDeAssert.end(), + std::inserter(temp, temp.begin())); + EXPECT_EQ(0, temp.size()); + + // Need just the ledsAssert populated with these. + // [Two] will move to [Blink] + std::set<Layout::LedAction> refAssert = { + {"Two",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + }; + EXPECT_EQ(refAssert.size(), ledsAssert.size()); + // difference of refAssert and ledsAssert must be null. - temp.clear(); + Manager::group temp1 {}; + std::set_difference(ledsAssert.begin(), ledsAssert.end(), + refAssert.begin(), refAssert.end(), + std::inserter(temp1, temp1.begin())); + EXPECT_EQ(0, temp1.size()); + } + { + // DeAssert Set-A + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsASet"; + auto result = manager.setGroupState(group, false, ledsAssert, + ledsDeAssert); + EXPECT_EQ(false, result); + + // Need just the ledsAssserted populated with these. + std::set<Layout::LedAction> refDeAssert = { + {"One",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Two",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::On}, + {"Three",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::Blink}, + {"Four",phosphor::led::Layout::On, 0, + 0, phosphor::led::Layout::On}, + {"Ten",phosphor::led::Layout::Blink, 0, + 0, phosphor::led::Layout::Blink}, + }; + EXPECT_EQ(refDeAssert.size(), ledsDeAssert.size()); + EXPECT_EQ(0, ledsAssert.size()); + + // difference of refDeAssert and ledsDeAssert must be null. + Manager::group temp {}; std::set_difference(ledsDeAssert.begin(), ledsDeAssert.end(), refDeAssert.begin(), refDeAssert.end(), std::inserter(temp, temp.begin())); EXPECT_EQ(0, temp.size()); } + { + // DeAssert Set-B again and make sure we get all empty + Manager::group ledsAssert {}; + Manager::group ledsDeAssert {}; + + auto group ="/xyz/openbmc_project/ledmanager/groups/MultipleLedsBSet"; + auto result = manager.setGroupState(group, false, ledsAssert, + ledsDeAssert); + EXPECT_EQ(false, result); + EXPECT_EQ(0, ledsDeAssert.size()); + EXPECT_EQ(0, ledsAssert.size()); + } } |