146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard/* 246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * Copyright (c) 2015, Intel Corporation 346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * All rights reserved. 446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * 546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * Redistribution and use in source and binary forms, with or without modification, 646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * are permitted provided that the following conditions are met: 746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * 846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * 1. Redistributions of source code must retain the above copyright notice, this 946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * list of conditions and the following disclaimer. 1046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * 1146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * 2. Redistributions in binary form must reproduce the above copyright notice, 1246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * this list of conditions and the following disclaimer in the documentation and/or 1346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * other materials provided with the distribution. 1446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * 1546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * 3. Neither the name of the copyright holder nor the names of its contributors 1646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * may be used to endorse or promote products derived from this software without 1746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * specific prior written permission. 1846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * 1946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 2046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 2146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 2246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 2346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 2446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 2546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 2646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 2846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard */ 3046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 3146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard#include "ParameterFramework.h" 3246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 339368eea42a1afb01dd44110582f997115b50e742François Gaffie#include "TmpFile.hpp" 349368eea42a1afb01dd44110582f997115b50e742François Gaffie 359368eea42a1afb01dd44110582f997115b50e742François Gaffie#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() 3646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard#include <catch.hpp> 3746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 3846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard#include <string> 3946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard#include <memory> 4046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard#include <vector> 419368eea42a1afb01dd44110582f997115b50e742François Gaffie#include <array> 4246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 4346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard#include <cstring> 4446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard#include <cerrno> 4546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard#include <climits> 4646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 4746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocardstruct Test 4846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard{ 4946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard /** @return true if str is empty. */ 5046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard bool empty(const char *str) 5146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard { 5246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE(str != NULL); 5346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard return *str == '\0'; 5446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 5546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 5646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard void REQUIRE_FAILURE(bool success) 5746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard { 589368eea42a1afb01dd44110582f997115b50e742François Gaffie THEN ("It should be an error") { 5946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard INFO("Previous pfw log: \n" + logLines); 6046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard CAPTURE(pfwGetLastError(pfw)); 6146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard CHECK(not success); 6246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard CHECK(not empty(pfwGetLastError(pfw))); 6346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 6446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 6546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 6646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard void REQUIRE_SUCCESS(bool success) 6746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard { 689368eea42a1afb01dd44110582f997115b50e742François Gaffie THEN ("It should be a success") { 6946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard INFO("Previous pfw log: \n" + logLines); 7046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard CAPTURE(pfwGetLastError(pfw)); 7146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard CHECK(success); 7246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard CHECK(empty(pfwGetLastError(pfw))); 7346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 7446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 7546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 769368eea42a1afb01dd44110582f997115b50e742François Gaffie /** Wrap utility::TmpFile to add an implicit convertion to the temporary file. 779368eea42a1afb01dd44110582f997115b50e742François Gaffie * 789368eea42a1afb01dd44110582f997115b50e742François Gaffie * This avoids dozens of .getPath() in the following tests. */ 799368eea42a1afb01dd44110582f997115b50e742François Gaffie class TmpFile : private parameterFramework::utility::TmpFile 8046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard { 8146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard private: 829368eea42a1afb01dd44110582f997115b50e742François Gaffie using Base = parameterFramework::utility::TmpFile; 839368eea42a1afb01dd44110582f997115b50e742François Gaffie 849368eea42a1afb01dd44110582f997115b50e742François Gaffie public: 859368eea42a1afb01dd44110582f997115b50e742François Gaffie using Base::TmpFile; 869368eea42a1afb01dd44110582f997115b50e742François Gaffie 879368eea42a1afb01dd44110582f997115b50e742François Gaffie using Base::getPath; 889368eea42a1afb01dd44110582f997115b50e742François Gaffie /** Implicitly convert to the path of the temporary file. */ 899368eea42a1afb01dd44110582f997115b50e742François Gaffie operator const char *() const { return getPath().c_str(); } 9046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard }; 9146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 9246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard /** Log in logLines. */ 9346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard static void logCb(void *voidLogLines, PfwLogLevel level, const char *logLine) 9446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard { 9546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard std::string &logLines = *reinterpret_cast<std::string *>(voidLogLines); 969368eea42a1afb01dd44110582f997115b50e742François Gaffie switch (level) { 9746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard case pfwLogWarning: 9846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard logLines += "Warning: "; 9946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard break; 10046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard case pfwLogInfo: 10146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard logLines += "Info: "; 10246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 10346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard logLines += logLine; 10446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard logLines += '\n'; 10546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 10646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 10746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard /** Log buffer, will only be display in case of failure */ 10846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard std::string logLines; 10946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 11046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard /** Pfw handler used in the tests. */ 11146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard PfwHandler *pfw; 11246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard}; 11346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 1149368eea42a1afb01dd44110582f997115b50e742François GaffieTEST_CASE_METHOD(Test, "Parameter-framework c api use") 1159368eea42a1afb01dd44110582f997115b50e742François Gaffie{ 11646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard // Create criteria 11746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard const char *letterList[] = {"a", "b", "c", NULL}; 11846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard const char *numberList[] = {"1", "2", "3", NULL}; 11946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard const PfwCriterion criteria[] = { 1209368eea42a1afb01dd44110582f997115b50e742François Gaffie {"inclusiveCrit", true, letterList}, {"exclusiveCrit", false, numberList}, 12146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard }; 1229368eea42a1afb01dd44110582f997115b50e742François Gaffie size_t criterionNb = sizeof(criteria) / sizeof(criteria[0]); 12346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard PfwLogger logger = {&logLines, logCb}; 12446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 12546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard // Create valid pfw config file 12646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard const char *intParameterPath = "/test/system/integer"; 12746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard const char *stringParameterPath = "/test/system/string"; 12846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard TmpFile system("<?xml version='1.0' encoding='UTF-8'?>\ 1299368eea42a1afb01dd44110582f997115b50e742François Gaffie <Subsystem Name='system' Type='Virtual'>\ 13046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard <ComponentLibrary/>\ 13146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard <InstanceDefinition>\ 13246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard <IntegerParameter Name='integer' Size='32' Signed='true' Max='100'/>\ 13346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard <StringParameter Name='string' MaxLength='9'/>\ 13446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard </InstanceDefinition>\ 13546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard </Subsystem>"); 13646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard TmpFile libraries("<?xml version='1.0' encoding='UTF-8'?>\ 13746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard <SystemClass Name='test'>\ 1389368eea42a1afb01dd44110582f997115b50e742François Gaffie <SubsystemInclude Path='" + 1399368eea42a1afb01dd44110582f997115b50e742François Gaffie system.getPath() + "'/>\ 14046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard </SystemClass>"); 14146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard TmpFile config("<?xml version='1.0' encoding='UTF-8'?>\ 14246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard <ParameterFrameworkConfiguration\ 14346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard SystemClassName='test' TuningAllowed='false'>\ 14446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard <SubsystemPlugins/>\ 1459368eea42a1afb01dd44110582f997115b50e742François Gaffie <StructureDescriptionFileLocation Path='" + 1469368eea42a1afb01dd44110582f997115b50e742François Gaffie libraries.getPath() + "'/>\ 14746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard </ParameterFrameworkConfiguration>"); 14846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 1499368eea42a1afb01dd44110582f997115b50e742François Gaffie GIVEN ("A created parameter framework") { 15046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard pfw = pfwCreate(); 15146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE(pfw != NULL); 15246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 1539368eea42a1afb01dd44110582f997115b50e742François Gaffie THEN ("Error message should be empty") { 15446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard CHECK(empty(pfwGetLastError(pfw))); 15546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 15646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 1579368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("The pfw is started without an existent file") { 15846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_FAILURE(pfwStart(pfw, "/doNotExist", criteria, criterionNb, &logger)); 15946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 16046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 1619368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("The pfw is started with duplicated criterion value") { 16246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard const PfwCriterion duplicatedCriteria[] = { 1639368eea42a1afb01dd44110582f997115b50e742François Gaffie {"duplicated name", true, letterList}, {"duplicated name", false, numberList}, 16446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard }; 16546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_FAILURE(pfwStart(pfw, config, duplicatedCriteria, 2, &logger)); 16646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 1679368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("The pfw is started with duplicated criterion value state") { 1689368eea42a1afb01dd44110582f997115b50e742François Gaffie const char *values[] = {"a", "a", NULL}; 16946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard const PfwCriterion duplicatedCriteria[] = {{"name", true, values}}; 17046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 1719368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("Using test logger") { 17246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_FAILURE(pfwStart(pfw, config, duplicatedCriteria, 1, &logger)); 17346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 1749368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("Using default logger") { 17546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard // Test coverage of default logger warning 17646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_FAILURE(pfwStart(pfw, config, duplicatedCriteria, 1, NULL)); 17746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 17846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 1799368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("The pfw is started with NULL name criterion") { 18046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard const PfwCriterion duplicatedCriteria[] = {{NULL, true, letterList}}; 18146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_FAILURE(pfwStart(pfw, config, duplicatedCriteria, 1, &logger)); 18246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 1839368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("The pfw is started with NULL criterion state list") { 18446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard const PfwCriterion duplicatedCriteria[] = {{"name", true, NULL}}; 18546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_FAILURE(pfwStart(pfw, config, duplicatedCriteria, 1, &logger)); 18646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 1879368eea42a1afb01dd44110582f997115b50e742François Gaffie GIVEN ("A criteria with lots of values") { 18846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard // Build a criterion with as many value as there is bits in int. 18946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard std::vector<char> names(sizeof(int) * CHAR_BIT + 1, 'a'); 19046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard names.back() = '\0'; 19146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard std::vector<const char *> values(names.size()); 1929368eea42a1afb01dd44110582f997115b50e742François Gaffie for (size_t i = 0; i < values.size(); ++i) { 19346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard values[i] = &names[i]; 19446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 19546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard values.back() = NULL; 19646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard /* The pfw c api requires criterion values to be a NULL terminated 19746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * array of string. Each string is a pointer to a NULL terminated 19846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * array of char. The pfw requires each string to be different 19946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * from all others, ie strcmp(values[i], values[j]) != 0 for any 20046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * i j. 20146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * 20246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * In order to generate easily an array of different strings, 20346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * instantiate one string (names) big enough 20446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * (@see PfwCriterion::values). 20546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * Then instantiate an array of pointer (values), 20646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * each pointing to a different position in the previously 20746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * created string. 20846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * 20946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * Representation of the names and values vectors. 21046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * 21146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * n = number of bit in an int 21246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * <--- n+1 elements ---> 21346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * names = |a|a|a|a|...|a|a|a|\0| 21446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * ^ ^ ^ 21546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * values[0] = ´ | | 21646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * values[1] = --´ | 21746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * ... | 21846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * values[n - 1] = -----------´ 21946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * values[n] = NULL 22046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard * 22146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard */ 22246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard const PfwCriterion duplicatedCriteria[] = {{"name", true, &values[0]}}; 22346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 2249368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("The pfw is started with a too long criterion state list") { 22546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_FAILURE(pfwStart(pfw, config, duplicatedCriteria, 1, &logger)); 22646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 2279368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("The pfw is started with max length criterion state list") { 22846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard values[values.size() - 2] = NULL; // Hide last value 22946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_SUCCESS(pfwStart(pfw, config, duplicatedCriteria, 1, &logger)); 23046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 23146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 23246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 2339368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("The pfw is started with zero criteria") { 23446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_SUCCESS(pfwStart(pfw, config, criteria, 0, &logger)); 23546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 23646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 2379368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("The pfw is started twice a pfw") { 23846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_SUCCESS(pfwStart(pfw, config, criteria, criterionNb, &logger)); 23946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_FAILURE(pfwStart(pfw, config, criteria, criterionNb, &logger)); 24046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 24146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 2429368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("The pfw is started without a logger callback") { 2439368eea42a1afb01dd44110582f997115b50e742François Gaffie PfwLogger noLog = {NULL, NULL}; 24446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_SUCCESS(pfwStart(pfw, config, criteria, criterionNb, &noLog)); 24546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 2469368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("The pfw is started with default logger") { 24746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_SUCCESS(pfwStart(pfw, config, criteria, criterionNb, NULL)); 24846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 24946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 2509368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("Get criterion of a stopped pfw") { 25146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard int value; 25246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_FAILURE(pfwGetCriterion(pfw, criteria[0].name, &value)); 25346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 2549368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("Set criterion of a stopped pfw") { 25546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_FAILURE(pfwSetCriterion(pfw, criteria[0].name, 1)); 25646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 2579368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("Commit criteria of a stopped pfw") { 25846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_FAILURE(pfwApplyConfigurations(pfw)); 25946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 26046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 2619368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("Bind parameter with a stopped pfw") { 26246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE(pfwBindParameter(pfw, intParameterPath) == NULL); 26346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 26446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 2659368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("The pfw is started correctly") { 26646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_SUCCESS(pfwStart(pfw, config, criteria, criterionNb, &logger)); 26746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard int value; 26846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 2699368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("Get not existing criterion") { 27046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_FAILURE(pfwGetCriterion(pfw, "Do not exist", &value)); 27146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 2729368eea42a1afb01dd44110582f997115b50e742François Gaffie THEN ("All criterion should value 0") { 2739368eea42a1afb01dd44110582f997115b50e742François Gaffie for (size_t i = 0; i < criterionNb; ++i) { 27446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard const char *criterionName = criteria[i].name; 27546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard CAPTURE(criterionName); 27646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_SUCCESS(pfwGetCriterion(pfw, criterionName, &value)); 27746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE(value == 0); 27846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 27946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 28046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 2819368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("Set not existing criterion") { 28246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_FAILURE(pfwSetCriterion(pfw, "Do not exist", 3)); 28346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 2849368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("Set criterion value") { 2859368eea42a1afb01dd44110582f997115b50e742François Gaffie for (size_t i = 0; i < criterionNb; ++i) { 28646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard const char *criterionName = criteria[i].name; 28746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard CAPTURE(criterionName); 28846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_SUCCESS(pfwSetCriterion(pfw, criterionName, 3)); 28946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 2909368eea42a1afb01dd44110582f997115b50e742François Gaffie THEN ("Get criterion value should return what was set") { 2919368eea42a1afb01dd44110582f997115b50e742François Gaffie for (size_t i = 0; i < criterionNb; ++i) { 29246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard const char *criterionName = criteria[i].name; 29346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard CAPTURE(criterionName); 29446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_SUCCESS(pfwGetCriterion(pfw, criterionName, &value)); 29546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE(value == 3); 29646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 29746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 2989368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("Set a new value to a criterion without committing first") { 2999368eea42a1afb01dd44110582f997115b50e742François Gaffie const char *criterionName = criteria[0].name; 3009368eea42a1afb01dd44110582f997115b50e742François Gaffie REQUIRE_SUCCESS(pfwSetCriterion(pfw, criterionName, 0)); 3019368eea42a1afb01dd44110582f997115b50e742François Gaffie THEN ("A warning message should have been displayed") { 3029368eea42a1afb01dd44110582f997115b50e742François Gaffie INFO("Previous pfw log: \n" + logLines); 3039368eea42a1afb01dd44110582f997115b50e742François Gaffie size_t logPos = logLines.find("Warning: Selection criterion " 3049368eea42a1afb01dd44110582f997115b50e742François Gaffie "'inclusiveCrit' has been modified 1 time(s)" 3059368eea42a1afb01dd44110582f997115b50e742François Gaffie " without any configuration application"); 3069368eea42a1afb01dd44110582f997115b50e742François Gaffie CHECK(logPos != std::string::npos); 3079368eea42a1afb01dd44110582f997115b50e742François Gaffie } 3089368eea42a1afb01dd44110582f997115b50e742François Gaffie } 30946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 3109368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("Commit criteria of a started pfw") { 31146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_SUCCESS(pfwApplyConfigurations(pfw)); 31246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 3139368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("Bind a non existing parameter") { 31446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_FAILURE(pfwBindParameter(pfw, "do/not/exist") != NULL); 31546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 31646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 3179368eea42a1afb01dd44110582f997115b50e742François Gaffie GIVEN ("An integer parameter handle") { 31846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard PfwParameterHandler *param = pfwBindParameter(pfw, intParameterPath); 31946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_SUCCESS(param != NULL); 32046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 3219368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("Set parameter out of range") { 32246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_FAILURE(pfwSetIntParameter(param, 101)); 32346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 32446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 3259368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("Set parameter") { 32646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_SUCCESS(pfwSetIntParameter(param, 11)); 3279368eea42a1afb01dd44110582f997115b50e742François Gaffie THEN ("Get parameter should return what was set") { 32846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_SUCCESS(pfwGetIntParameter(param, &value)); 32946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE(value == 11); 33046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 33146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 33246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 33346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard pfwUnbindParameter(param); 33446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 33546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 3369368eea42a1afb01dd44110582f997115b50e742François Gaffie GIVEN ("An string parameter handle") { 33746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard PfwParameterHandler *param = pfwBindParameter(pfw, stringParameterPath); 33846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_SUCCESS(param != NULL); 33946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 3409368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("Set parameter out of range") { 34146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_FAILURE(pfwSetStringParameter(param, "ko_1234567")); 34246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 34346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 3449368eea42a1afb01dd44110582f997115b50e742François Gaffie WHEN ("Set parameter") { 3459368eea42a1afb01dd44110582f997115b50e742François Gaffie char *value; 34646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_SUCCESS(pfwSetStringParameter(param, "ok")); 3479368eea42a1afb01dd44110582f997115b50e742François Gaffie THEN ("Get parameter should return what was set") { 34846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE_SUCCESS(pfwGetStringParameter(param, &value)); 34946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard REQUIRE(value == std::string("ok")); 3509368eea42a1afb01dd44110582f997115b50e742François Gaffie pfwFree(value); 35146a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 35246a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 35346a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 35446a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard pfwUnbindParameter(param); 35546a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 35646a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 35746a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard 35846a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard pfwDestroy(pfw); 35946a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard } 36046a021d5de6e7448c79f621e0525e920a6206425Kevin Rocard} 361