PFW: Add test means

BZ: 12873

In order to test the parameter-framework, new means have been developped.
they consist in 2 distinct interfaces:
- Simulate platform behavior through command-line
- Simulate HW behavior through test-plugin performing R/W in file system.

Change-Id: I6efc9b5489155d9f334a72d7ed65324c3e52690f
Signed-off-by: Guillaume Denneulin <guillaumex.denneulin@intel.com>
Reviewed-on: http://android.intel.com:8080/35904
Reviewed-by: Barthes, FabienX <fabienx.barthes@intel.com>
Tested-by: Barthes, FabienX <fabienx.barthes@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
diff --git a/test/test-platform/TestPlatform.cpp b/test/test-platform/TestPlatform.cpp
new file mode 100644
index 0000000..3e6148b
--- /dev/null
+++ b/test/test-platform/TestPlatform.cpp
@@ -0,0 +1,195 @@
+/* <auto_header>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright  2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intels prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ *  AUTHOR: Guillaume Denneulin (guillaumex.denneulin@intel.com)
+ * CREATED: 2011-11-25
+ * UPDATED: 2011-11-25
+ *
+ *
+ * </auto_header>
+ */
+#include <strings.h>
+#include <iostream>
+#include <stdlib.h>
+#include <sstream>
+#include "TestPlatform.h"
+#include "ParameterMgrPlatformConnector.h"
+#include "RemoteProcessorServer.h"
+
+class CParameterMgrPlatformConnectorLogger : public CParameterMgrPlatformConnector::ILogger
+{
+public:
+    CParameterMgrPlatformConnectorLogger() {}
+
+    virtual void log(const string& strLog) {
+
+        cout << strLog << endl;
+    }
+};
+
+
+CTestPlatform::CTestPlatform(const string& strClass) :
+    _pParameterMgrPlatformConnector(new CParameterMgrPlatformConnector(strClass)),
+    _pParameterMgrPlatformConnectorLogger(new CParameterMgrPlatformConnectorLogger)
+{
+    _pCommandHandler = new CCommandHandler(this);
+
+    // Add command parsers
+    _pCommandHandler->addCommandParser("createExclusiveSelectionCriterion", &CTestPlatform::createExclusiveSelectionCriterionCommandProcess, 2, "<name> <nbStates>", "Create inclusive selection criterion");
+    _pCommandHandler->addCommandParser("createInclusiveSelectionCriterion", &CTestPlatform::createInclusiveSelectionCriterionCommandProcess, 2, "<name> <nbStates>", "Create exclusive selection criterion");
+    _pCommandHandler->addCommandParser("start", &CTestPlatform::startParameterMgrCommandProcess, 0, "", "Start ParameterMgr");
+    _pCommandHandler->addCommandParser("setCriterionState", &CTestPlatform::setCriterionStateCommandProcess, 2, "<name> <state>", "Set the current state of a selection criterion");
+    _pCommandHandler->addCommandParser("applyConfigurations", &CTestPlatform::applyConfigurationsCommandProcess, 0, "", "Apply configurations selected by current selection criteria states");
+
+    // Create server
+    _pRemoteProcessorServer = new CRemoteProcessorServer(5001, _pCommandHandler);
+
+    _pParameterMgrPlatformConnector->setLogger(_pParameterMgrPlatformConnectorLogger);
+}
+
+CTestPlatform::~CTestPlatform()
+{
+    delete _pRemoteProcessorServer;
+    delete _pCommandHandler;
+    delete _pParameterMgrPlatformConnectorLogger;
+    delete _pParameterMgrPlatformConnector;
+}
+
+bool CTestPlatform::load(std::string& strError)
+{
+    // Start remote processor server
+    if (!_pRemoteProcessorServer->start()) {
+
+        strError = "Unable to start remote processor server";
+
+        return false;
+    }
+
+    return true;
+}
+
+//////////////// Remote command parsers
+/// Selection Criterion
+CTestPlatform::CCommandHandler::CommandStatus CTestPlatform::createExclusiveSelectionCriterionCommandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+    return createExclusiveSelectionCriterion(remoteCommand.getArgument(0), strtoul(remoteCommand.getArgument(1).c_str(), NULL, 0), strResult) ? CTestPlatform::CCommandHandler::EDone : CTestPlatform::CCommandHandler::EFailed;
+}
+
+CTestPlatform::CCommandHandler::CommandStatus CTestPlatform::createInclusiveSelectionCriterionCommandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+    return createInclusiveSelectionCriterion(remoteCommand.getArgument(0), strtoul(remoteCommand.getArgument(1).c_str(), NULL, 0), strResult) ? CTestPlatform::CCommandHandler::EDone : CTestPlatform::CCommandHandler::EFailed;
+}
+
+
+CTestPlatform::CCommandHandler::CommandStatus CTestPlatform::startParameterMgrCommandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+    (void)remoteCommand;
+    return _pParameterMgrPlatformConnector->start(strResult) ? CTestPlatform::CCommandHandler::EDone : CTestPlatform::CCommandHandler::EFailed;
+}
+
+CTestPlatform::CCommandHandler::CommandStatus CTestPlatform::setCriterionStateCommandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+    return setCriterionState(remoteCommand.getArgument(0), strtoul(remoteCommand.getArgument(1).c_str(), NULL, 0), strResult) ? CTestPlatform::CCommandHandler::EDone : CTestPlatform::CCommandHandler::EFailed;
+}
+
+CTestPlatform::CCommandHandler::CommandStatus CTestPlatform::applyConfigurationsCommandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+    (void)remoteCommand;
+    return _pParameterMgrPlatformConnector->applyConfigurations(strResult) ?  CTestPlatform::CCommandHandler::EDone : CTestPlatform::CCommandHandler::EFailed;
+}
+
+//////////////// Remote command handlers
+bool CTestPlatform::createExclusiveSelectionCriterion(const string& strName, uint32_t uiNbStates, string& strResult)
+{
+    ISelectionCriterionTypeInterface* pCriterionType = _pParameterMgrPlatformConnector->createSelectionCriterionType(false);
+
+    uint32_t uistate;
+
+    for (uistate = 0; uistate < uiNbStates; uistate++) {
+
+        ostringstream ostrValue;
+
+        ostrValue << "State_";
+        ostrValue << uistate;
+
+        if (!pCriterionType->addValuePair(uistate, ostrValue.str())) {
+
+            strResult = "Unable to add value: " + ostrValue.str();
+
+            return false;
+        }
+    }
+
+    _pParameterMgrPlatformConnector->createSelectionCriterion(strName, pCriterionType);
+
+    return true;
+}
+
+bool CTestPlatform::createInclusiveSelectionCriterion(const string& strName, uint32_t uiNbStates, string& strResult)
+{
+    ISelectionCriterionTypeInterface* pCriterionType = _pParameterMgrPlatformConnector->createSelectionCriterionType(true);
+
+    if (uiNbStates > 32) {
+
+        strResult = "Maximum number of states for inclusive criterion is 32";
+
+        return false;
+    }
+
+    uint32_t uiState;
+
+    for (uiState = 0; uiState < uiNbStates; uiState++) {
+
+        ostringstream ostrValue;
+
+        ostrValue << "State_0x";
+        ostrValue << (0x1 << uiState);
+
+        if (!pCriterionType->addValuePair(0x1 << uiState, ostrValue.str())) {
+
+            strResult = "Unable to add value: " + ostrValue.str();
+
+            return false;
+        }
+    }
+
+    _pParameterMgrPlatformConnector->createSelectionCriterion(strName, pCriterionType);
+
+    return true;
+}
+
+bool CTestPlatform::setCriterionState(const string& strName, uint32_t uiState, string& strResult)
+{
+    ISelectionCriterionInterface* pCriterion = _pParameterMgrPlatformConnector->getSelectionCriterion(strName);
+
+    if (!pCriterion) {
+
+        strResult = "Unable to retrieve selection criterion: " + strName;
+
+        return false;
+    }
+
+    pCriterion->setCriterionState(uiState);
+
+    return true;
+}
+
diff --git a/test/test-platform/TestPlatform.h b/test/test-platform/TestPlatform.h
new file mode 100644
index 0000000..f169cce
--- /dev/null
+++ b/test/test-platform/TestPlatform.h
@@ -0,0 +1,79 @@
+/* <auto_header>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright  2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intels prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ *  AUTHOR: Guillaume Denneulin (guillaumex.denneulin@intel.com)
+ * CREATED: 2011-11-25
+ * UPDATED: 2011-11-25
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <string>
+#include <list>
+#include "RemoteCommandHandlerTemplate.h"
+
+using namespace std;
+
+class CParameterMgrPlatformConnector;
+class CParameterMgrPlatformConnectorLogger;
+class CRemoteProcessorServer;
+class ISelectionCriterionInterface;
+
+class CTestPlatform
+{
+    typedef TRemoteCommandHandlerTemplate<CTestPlatform> CCommandHandler;
+public:
+    CTestPlatform(const string &strclass);
+    virtual ~CTestPlatform();
+
+    // Init
+    bool load(string& strError);
+
+private:
+    //////////////// Remote command parsers
+    /// Selection Criterion
+    CCommandHandler::CommandStatus createExclusiveSelectionCriterionCommandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+    CCommandHandler::CommandStatus createInclusiveSelectionCriterionCommandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+    CCommandHandler::CommandStatus startParameterMgrCommandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+    CCommandHandler::CommandStatus setCriterionStateCommandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+    CCommandHandler::CommandStatus applyConfigurationsCommandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+
+    // Commands
+    bool createExclusiveSelectionCriterion(const string& strName, uint32_t uiNbValues, string& strResult);
+    bool createInclusiveSelectionCriterion(const string& strName, uint32_t uiNbValues, string& strResult);
+    bool setCriterionState(const string& strName, uint32_t uiState, string& strResult);
+
+    // Connector
+    CParameterMgrPlatformConnector* _pParameterMgrPlatformConnector;
+
+    // Logger
+    CParameterMgrPlatformConnectorLogger* _pParameterMgrPlatformConnectorLogger;
+
+    // Command Handler
+    CCommandHandler* _pCommandHandler;
+
+    // Remote Processor Server
+    CRemoteProcessorServer* _pRemoteProcessorServer;
+};
+
diff --git a/test/test-platform/main.cpp b/test/test-platform/main.cpp
new file mode 100644
index 0000000..67d4ac6
--- /dev/null
+++ b/test/test-platform/main.cpp
@@ -0,0 +1,79 @@
+/* <auto_header>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright  2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intels prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ *  AUTHOR: Guillaume Denneulin (guillaumex.denneulin@intel.com)
+ * CREATED: 2011-11-25
+ * UPDATED: 2011-11-25
+ *
+ *
+ * </auto_header>
+ */
+#include <iostream>
+#include <semaphore.h>
+#include "TestPlatform.h"
+#include <semaphore.h>
+
+using namespace std;
+
+/*#ifdef SIMULATION
+//const char* gpcParameterFrameworkConfigurationFolderPath = "/home/pat/projects/qt/parameter-framework/XML";
+const char* gpcParameterFrameworkConfigurationFolderPath = "/home/pat/Documents/gingerbread/hardware/intel/PRIVATE/parameter-framework/XML";
+#else
+const char* gpcParameterFrameworkConfigurationFolderPath = "/etc/parameter-framework";
+#endif
+*/
+
+int main(int argc, char *argv[])
+{
+    if (argc < 2) {
+
+        cerr << "Missing arguments" << endl;
+
+        return -1;
+    }
+
+    string strError;
+
+    // Create param mgr
+    CTestPlatform testPlatform(argv[1]);
+
+    // Start platformmgr
+    if (!testPlatform.load(strError)) {
+
+        cerr << strError << endl;
+
+        return -1;
+    }
+
+    // Change criteria
+
+    // Block here
+    sem_t sem;
+
+    sem_init(&sem, false, 0);
+
+    sem_wait(&sem);
+
+    sem_destroy(&sem);
+
+    return 0;
+}