/* * 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); } } } } // parameterFramework