| /* |
| * Copyright (c) 2015, Intel Corporation |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without modification, |
| * are permitted provided that the following conditions are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright notice, this |
| * list of conditions and the following disclaimer. |
| * |
| * 2. Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation and/or |
| * other materials provided with the distribution. |
| * |
| * 3. Neither the name of the copyright holder nor the names of its contributors |
| * may be used to endorse or promote products derived from this software without |
| * specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
| * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR |
| * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
| * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #include "Test.hpp" |
| #include "Config.hpp" |
| #include "StoreLogger.hpp" |
| #include "ParameterFramework.hpp" |
| |
| #include <catch.hpp> |
| |
| #include <list> |
| #include <string> |
| |
| #include <cstdio> |
| |
| namespace parameterFramework |
| { |
| |
| SCENARIO_METHOD(ParameterFramework, "Default logger", "[log]") |
| { |
| WHEN ("No logger is set") { |
| THEN ("Start should succeed") { |
| CHECK_NOTHROW(start()); |
| } |
| } |
| } |
| |
| SCENARIO_METHOD(ParameterFramework, "No Logger", "[log]") |
| { |
| WHEN ("A nullptr logger is set") { |
| setLogger(nullptr); |
| THEN ("Start should succeed") { |
| CHECK_NOTHROW(start()); |
| } |
| } |
| } |
| |
| SCENARIO("Logger should receive info and warnings", "[log]") |
| { |
| GIVEN ("A logger that stores logs") { |
| /* Instantiating logger first to ensure that its lifetime is longer than the pfw's one, |
| * because the pfw references the logger. */ |
| StoreLogger logger{}; |
| GIVEN ("A parameter framework") { |
| WarningPF pfw; |
| GIVEN ("Config files that emit warnings") { |
| WHEN ("The record logger is set") { |
| pfw.setLogger(&logger); |
| THEN ("Start should succeed") { |
| REQUIRE_NOTHROW(pfw.start()); |
| AND_THEN ("The logger should have stored info and warning log") { |
| using Logs = StoreLogger::Logs; |
| using Level = StoreLogger::Log::Level; |
| CHECK(logger.filter(Level::warning) != Logs{}); |
| CHECK(logger.getLogs() != Logs{}); |
| } |
| } |
| AND_WHEN ("A nullptr logger is set") { |
| pfw.setLogger(nullptr); |
| THEN ("Start should succeed") { |
| REQUIRE_NOTHROW(pfw.start()); |
| AND_THEN ("The record logger should NOT have stored any info or " |
| "warning log") { |
| CHECK(logger.getLogs() == StoreLogger::Logs{}); |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| SCENARIO_METHOD(LazyPF, "Tuning OK", "[properties][remote interface]") |
| { |
| } |
| |
| SCENARIO_METHOD(LazyPF, "Invalid XML configuration") |
| { |
| for (auto &xmlT : Tests<std::string>{{"an unknown tag", "<unknown_tag/>"}, |
| {"an unclosed tag", "<unclosed>"}}) { |
| auto invalidXml = xmlT.payload; |
| GIVEN ("An invalid xml: containing " + xmlT.title) { |
| Config::Plugins ps{}; |
| for (auto &&configT : Tests<Config>{ |
| {"top config", {&Config::plugins, Config::Plugins{{"", {invalidXml}}}}}, |
| {"structure", {&Config::instances, invalidXml}}, |
| {"settings", {&Config::domains, invalidXml}}}) { |
| WHEN ("Used in the " + configT.title) { |
| create(std::move(configT.payload)); |
| THEN ("Start should fail") { |
| CHECK_THROWS_AS(mPf->start(), Exception); |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| SCENARIO_METHOD(LazyPF, "Plugin OK", "[properties][missing plugin policy]") |
| { |
| for (auto &pluginNameT : |
| Tests<std::string>{{"an non existing plugin", "libdonetexist.so"}, |
| {"an existing library but invalid (linux) PF plugin", "libc.so.6"}}) { |
| GIVEN ("An" + pluginNameT.title) { |
| create({&Config::plugins, Config::Plugins{{"", {pluginNameT.payload}}}}); |
| WHEN ("The missing subsystem policy is left to default") { |
| THEN ("Start should fail") { |
| CHECK_THROWS_AS(mPf->start(), Exception); |
| } |
| } |
| WHEN ("The missing subsystem policy is set to failure") { |
| mPf->setFailureOnMissingSubsystem(true); |
| THEN ("Start should fail") { |
| CHECK_THROWS_AS(mPf->start(), Exception); |
| } |
| } |
| WHEN ("The missing subsystem policy is set to ignore") { |
| mPf->setFailureOnMissingSubsystem(false); |
| THEN ("Start should success") { |
| CHECK_NOTHROW(mPf->start()); |
| } |
| } |
| } |
| } |
| } |
| |
| SCENARIO_METHOD(LazyPF, "Invalid domains", "[properties]") |
| { |
| GIVEN ("An invalid domain file") { |
| create({&Config::domains, "<Domain name='Invalid'/>"}); |
| THEN ("Start should fail") { |
| CHECK_THROWS_AS(mPf->start(), Exception); |
| } |
| WHEN ("Changing failure setting load policy to ignore") { |
| mPf->setFailureOnFailedSettingsLoad(false); |
| THEN ("Start should succeed") { |
| CHECK_NOTHROW(mPf->start()); |
| } |
| } |
| } |
| } |
| |
| SCENARIO_METHOD(ParameterFramework, "Raw value space") |
| { |
| WHEN ("Raw value space is set") { |
| setRawValueSpace(true); |
| THEN ("Value space should be raw") { |
| CHECK(isValueSpaceRaw() == true); |
| } |
| } |
| } |
| |
| } // namespace parameterFramework |