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