[FA_dev #1678479] No error in f_EPTF_Var_direct2content: return code added + tests

Change-Id: I5521cec0d070487e670edf2fb097631e037f0b01
Signed-off-by: József Gyürüsi <jozsef.gyurusi@ericsson.com>
diff --git a/src/Variable/EPTF_CLL_Variable_Functions.ttcn b/src/Variable/EPTF_CLL_Variable_Functions.ttcn
index 9f9d3e0..1c36642 100644
--- a/src/Variable/EPTF_CLL_Variable_Functions.ttcn
+++ b/src/Variable/EPTF_CLL_Variable_Functions.ttcn
@@ -2257,7 +2257,10 @@
     //    
     ///////////////////////////////////////////////////////////
     public function f_EPTF_Var_setContent(in integer pl_idx, in EPTF_Var_DirectContent pl_newContent) runs on EPTF_Var_CT {
-      f_EPTF_Var_direct2content(pl_newContent,v_EPTF_Vars[pl_idx].content);
+      if (not f_EPTF_Var_direct2content(pl_newContent,v_EPTF_Vars[pl_idx].content)) {
+        f_EPTF_Var_error(log2str("ERROR:","Cannot set direct content ",pl_newContent," into variable #", pl_idx, " : ", v_EPTF_Vars[pl_idx]));
+        //f_EPTF_Base_stop();
+      };
     }
 
     //////////////////////////////////////////////////////////
@@ -4174,7 +4177,9 @@
       //f_EPTF_Var_getContent(pl_idx,vl_currentContent);
       // try to set new content into current:
       var EPTF_Var_Content vl_content := {direct := vl_currentContent};
-      f_EPTF_Var_direct2content(pl_newContent,vl_content);
+      if (not f_EPTF_Var_direct2content(pl_newContent,vl_content)) {
+        return false;
+      };
 
       for(var integer i:=0; i<sizeof(v_EPTF_Vars[pl_idx].guardFns); i:=i+1) {
         if (v_EPTF_Vars[pl_idx].guardFns[i].funcRef != null) {
@@ -6415,119 +6420,124 @@
   // 
   //  Purpose:
   //    Converts a direct content of an EPTF variable to content (dereferences if it is a reference)
+  //    Returns true on success, fail on error
   ///////////////////////////////////////////////////////////
-  private function f_EPTF_Var_direct2content(in EPTF_Var_DirectContent pl_directContent, inout EPTF_Var_Content pl_content) runs on EPTF_Var_CT {
+  private function f_EPTF_Var_direct2content(in EPTF_Var_DirectContent pl_directContent, inout EPTF_Var_Content pl_content) runs on EPTF_Var_CT
+  return boolean {
     if (ischosen(pl_content.invalid)) {
       if (not ischosen(pl_directContent.unknownVal)) {
-        f_EPTF_Var_error(log2str("ERROR:","Cannot convert direct content ",pl_directContent," to invalid content."));
+        f_EPTF_Var_warning(log2str("ERROR:","Cannot convert direct content ",pl_directContent," to invalid content."));
+        return false;
         //f_EPTF_Base_stop();
       } else {
-        return; // Do nothing, leave it invalid
+        return true; // Do nothing, leave it invalid
       }
     }
     if (ischosen(pl_content.direct)) {
       if (ischosen(pl_content.direct.intVal) and ischosen(pl_directContent.intVal)) {
         pl_content.direct.intVal := pl_directContent.intVal;
-        return;
+        return true;
       }
       if (ischosen(pl_content.direct.floatVal) and ischosen(pl_directContent.floatVal)) {
         pl_content.direct.floatVal := pl_directContent.floatVal;
-        return;
+        return true;
       }
       if (ischosen(pl_content.direct.boolVal) and ischosen(pl_directContent.boolVal)) {
         pl_content.direct.boolVal := pl_directContent.boolVal;
-        return;
+        return true;
       }
       if (ischosen(pl_content.direct.charstringVal) and ischosen(pl_directContent.charstringVal)) {
         pl_content.direct.charstringVal := pl_directContent.charstringVal;
-        return;
+        return true;
       }
       if (ischosen(pl_content.direct.octetstringVal) and ischosen(pl_directContent.octetstringVal)) {
         pl_content.direct.octetstringVal := pl_directContent.octetstringVal;
-        return;
+        return true;
       }
       if (ischosen(pl_content.direct.hexstringVal) and ischosen(pl_directContent.hexstringVal)) {
         pl_content.direct.hexstringVal := pl_directContent.hexstringVal;
-        return;
+        return true;
       }
       if (ischosen(pl_content.direct.bitstringVal) and ischosen(pl_directContent.bitstringVal)) {
         pl_content.direct.bitstringVal := pl_directContent.bitstringVal;
-        return;
+        return true;
       }
       if (ischosen(pl_content.direct.integerlistVal) and ischosen(pl_directContent.integerlistVal)) {
         pl_content.direct.integerlistVal := pl_directContent.integerlistVal;
-        return;
+        return true;
       }
       if (ischosen(pl_content.direct.floatlistVal) and ischosen(pl_directContent.floatlistVal)) {
         pl_content.direct.floatlistVal := pl_directContent.floatlistVal;
-        return;
+        return true;
       }
       if (ischosen(pl_content.direct.charstringlistVal) and ischosen(pl_directContent.charstringlistVal)) {
         pl_content.direct.charstringlistVal := pl_directContent.charstringlistVal;
-        return;
+        return true;
       }
       if (ischosen(pl_content.direct.statusLEDVal) and ischosen(pl_directContent.statusLEDVal)) {
         pl_content.direct.statusLEDVal := pl_directContent.statusLEDVal;
-        return;
+        return true;
       }
       if (ischosen(pl_content.direct.unknownVal) and ischosen(pl_directContent.unknownVal)) {
         pl_content.direct.unknownVal := pl_directContent.unknownVal;
-        return;
+        return true;
       }
       //...
-      f_EPTF_Var_error(log2str("ERROR:","Cannot convert direct content ",pl_directContent," to direct content ",pl_content,". Types are incompatible"));
+      f_EPTF_Var_warning(log2str("ERROR:","Cannot convert direct content ",pl_directContent," to direct content ",pl_content,". Types are incompatible"));
+      return false;
       //f_EPTF_Base_stop();
     }
     // referenced content
     if (not f_EPTF_Base_cleanupIsInProgress()) {
-      return;// cleanup is in progress: referred variable is not modified
+      return true;// cleanup is in progress: referred variable is not modified
     }
     if ((pl_content.reference.refType == intType) and ischosen(pl_directContent.intVal)) {
       f_EPTF_Var_modifyIntRefValue(pl_content.reference.valueRef, pl_directContent.intVal);
-      return;
+      return true;
     }
     if ((pl_content.reference.refType == floatType) and ischosen(pl_directContent.floatVal)) {
       f_EPTF_Var_modifyFloatRefValue(pl_content.reference.valueRef, pl_directContent.floatVal);
-      return;
+      return true;
     }
     if ((pl_content.reference.refType == boolType) and ischosen(pl_directContent.boolVal)) {
       f_EPTF_Var_modifyBoolRefValue(pl_content.reference.valueRef, pl_directContent.boolVal);
-      return;
+      return true;
     }
     if ((pl_content.reference.refType == charstringType) and ischosen(pl_directContent.charstringVal)) {
       f_EPTF_Var_modifyCharstringRefValue(pl_content.reference.valueRef, pl_directContent.charstringVal);
-      return;
+      return true;
     }
     if ((pl_content.reference.refType == octetstringType) and ischosen(pl_directContent.octetstringVal)) {
       f_EPTF_Var_modifyOctetstringRefValue(pl_content.reference.valueRef, pl_directContent.octetstringVal);
-      return;
+      return true;
     }
     if ((pl_content.reference.refType == hexstringType) and ischosen(pl_directContent.hexstringVal)) {
       f_EPTF_Var_modifyHexstringRefValue(pl_content.reference.valueRef, pl_directContent.hexstringVal);
-      return;
+      return true;
     }
     if ((pl_content.reference.refType == bitstringType) and ischosen(pl_directContent.bitstringVal)) {
       f_EPTF_Var_modifyBitstringRefValue(pl_content.reference.valueRef, pl_directContent.bitstringVal);
-      return;
+      return true;
     }
     if ((pl_content.reference.refType == integerlistType) and ischosen(pl_directContent.integerlistVal)) {
       f_EPTF_Var_modifyIntegerlistRefValue(pl_content.reference.valueRef, pl_directContent.integerlistVal);
-      return;
+      return true;
     }
     if ((pl_content.reference.refType == floatlistType) and ischosen(pl_directContent.floatlistVal)) {
       f_EPTF_Var_modifyFloatlistRefValue(pl_content.reference.valueRef, pl_directContent.floatlistVal);
-      return;
+      return true;
     }
     if ((pl_content.reference.refType == charstringlistType) and ischosen(pl_directContent.charstringlistVal)) {
       f_EPTF_Var_modifyCharstringlistRefValue(pl_content.reference.valueRef, pl_directContent.charstringlistVal);
-      return;
+      return true;
     }
     if ((pl_content.reference.refType == statusLEDType) and ischosen(pl_directContent.statusLEDVal)) {
       f_EPTF_Var_modifyStatusLEDRefValue(pl_content.reference.valueRef, pl_directContent.statusLEDVal);
-      return;
+      return true;
     }
     //...
-    f_EPTF_Var_error(log2str("ERROR:","Cannot convert direct content ",pl_directContent," to referenced content ",pl_content));
+    f_EPTF_Var_warning(log2str("ERROR:","Cannot convert direct content ",pl_directContent," to referenced content ",pl_content));
+    return false;
     //f_EPTF_Base_stop();
   }
 
diff --git a/test/DsRestAPI/EPTF_DsRestAPI_Test_Definitions.ttcn b/test/DsRestAPI/EPTF_DsRestAPI_Test_Definitions.ttcn
index a9564fc..d55eeab 100644
--- a/test/DsRestAPI/EPTF_DsRestAPI_Test_Definitions.ttcn
+++ b/test/DsRestAPI/EPTF_DsRestAPI_Test_Definitions.ttcn
@@ -256,6 +256,9 @@
   const charstring c_DsRestAPI_Test_dataElementTcStop := "TcStop";
   const charstring c_DsRestAPI_Test_varNameTcStop := "stopTC";
 
+  // datalements level 2: for getData:
+  const charstring c_DsRestAPI_Test_dataElementTcCPS := "TcCPS";
+  const charstring c_DsRestAPI_Test_varNameTcCPS := "TcCPS";
 } // group DsRestAPI_Test_DataSource
 
 } //module
diff --git a/test/DsRestAPI/EPTF_DsRestAPI_Test_Functions.ttcn b/test/DsRestAPI/EPTF_DsRestAPI_Test_Functions.ttcn
index f83d71a..1bd4ac0 100644
--- a/test/DsRestAPI/EPTF_DsRestAPI_Test_Functions.ttcn
+++ b/test/DsRestAPI/EPTF_DsRestAPI_Test_Functions.ttcn
@@ -125,6 +125,7 @@
   if(pl_dataSource_compRef != null){
     f_EPTF_DsRestAPI_Test_getDSfromFile();
     f_EPTF_DataSourceClient_init_CT(f_EPTF_Base_selfName(), pl_dataSource_compRef);
+    f_EPTF_DataSourceClient_registerData(v_DsRestAPI_Test_DSMock.DSClientName, f_EPTF_Base_selfName(), refers(f_EPTF_DsRestAPI_Test_DSProcessGetData), pl_dataSource_compRef);
     f_EPTF_DataSourceClient_registerDataValue(v_DsRestAPI_Test_DSMock.DSClientName, f_EPTF_Base_selfName(), refers(f_EPTF_DsRestAPI_Test_DSProcessDataValue), pl_dataSource_compRef);
     f_EPTF_DataSourceClient_registerSetDataValue(v_DsRestAPI_Test_DSMock.DSClientName, f_EPTF_Base_selfName(), refers(f_EPTF_DsRestAPI_Test_DSProcessSetDataValue), pl_dataSource_compRef);
     f_EPTF_DataSourceClient_sendReady(v_DsRestAPI_Test_DSMock.DSClientName, f_EPTF_Base_selfName());
@@ -386,6 +387,49 @@
   }
 }
 
+function f_EPTF_DsRestAPI_Test_DSProcessGetData(
+  out charstring pl_dataVarName,
+  in charstring pl_source,
+  in charstring pl_ptcName,
+  in charstring pl_element,
+  in EPTF_DataSource_Params pl_params
+) runs on DsRestAPI_Test_CT return integer {
+  var integer vl_errorCode := -1;
+  var EPTF_CharstringList pl_result := {};
+  pl_dataVarName := log2str("Error: variable not found for dataSource: source: ", pl_source, " element: ", pl_element, " params: ", pl_params); // set it to error message
+  
+  select(pl_element) {
+    case (c_DsRestAPI_Test_dataElementTcCPS) {
+      if(0 == f_EPTF_DsRestAPI_Test_DSgetParams(pl_params,{c_DsRestAPI_Test_paramNameEntityGroup, c_DsRestAPI_Test_paramNameScenario, c_DsRestAPI_Test_paramNameTrafficCase}, pl_result)){
+        for(var integer j := 0; j < sizeof(v_DsRestAPI_Test_DSMock.EntityGroups); j := j + 1) {
+          if (pl_result[0] == v_DsRestAPI_Test_DSMock.EntityGroups[j].Value) {
+            for(var integer i := 0; i < sizeof(v_DsRestAPI_Test_DSMock.EntityGroups[j].Scenarios); i := i + 1) {
+              if (pl_result[1] == v_DsRestAPI_Test_DSMock.EntityGroups[j].Scenarios[i].Value) {
+                for(var integer k := 0; k < sizeof(v_DsRestAPI_Test_DSMock.EntityGroups[j].Scenarios[i].TrafficCases); k := k + 1) {
+                  if (pl_result[2] == v_DsRestAPI_Test_DSMock.EntityGroups[j].Scenarios[i].TrafficCases[k].Value) {
+                    var integer vl_idx := f_EPTF_Var_getId(c_DsRestAPI_Test_varNameTcCPS);
+                    if (-1 == vl_idx) {
+                      f_EPTF_Var_newFloat(c_DsRestAPI_Test_varNameTcCPS, 10.0, vl_idx);
+                    }
+                    pl_dataVarName := c_DsRestAPI_Test_varNameTcCPS;
+                    vl_errorCode := 0;
+                    return vl_errorCode;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    case else {
+
+    }
+  }
+  return vl_errorCode;
+}
+
+
 function f_EPTF_DsRestAPI_Test_DSProcessDataValue(out EPTF_Var_DirectContent pl_dataValue,
                                               in charstring pl_source,
                                               in charstring pl_ptcName := "",
diff --git a/test/DsRestAPI/JSON_reqResp/test48.request b/test/DsRestAPI/JSON_reqResp/test48.request
new file mode 100644
index 0000000..a28c122
--- /dev/null
+++ b/test/DsRestAPI/JSON_reqResp/test48.request
@@ -0,0 +1,23 @@
+requests.test48 = {

+    "requests" : [

+        {

+            "getData" : {

+                "source" : "DsRestAPI_Test_DataSource",

+                "element" : "TcCPS",

+                "params" : [{

+                        "paramName" : "EntityGroup",

+                        "paramValue" : "EntityGroup_0"

+                    }, {

+                        "paramName" : "Scenario",

+                        "paramValue" : "Scenario_0"

+                    }, {

+                        "paramName" : "TrafficCase",

+                        "paramValue" : "TrafficCase_0"

+                    }

+                ]

+            }

+        }

+    ]

+}

+

+descriptions.test48 = "Get data for getData handler"

diff --git a/test/DsRestAPI/JSON_reqResp/test48.response b/test/DsRestAPI/JSON_reqResp/test48.response
new file mode 100644
index 0000000..7fc2ba4
--- /dev/null
+++ b/test/DsRestAPI/JSON_reqResp/test48.response
@@ -0,0 +1,10 @@
+responses.test48 = {

+    "contentList" : [

+    {

+        "node": {

+            "val": "10.000000",

+            "tp": 2

+        }

+    }

+]

+}

diff --git a/test/DsRestAPI/JSON_reqResp/test49.request b/test/DsRestAPI/JSON_reqResp/test49.request
new file mode 100644
index 0000000..ba878e3
--- /dev/null
+++ b/test/DsRestAPI/JSON_reqResp/test49.request
@@ -0,0 +1,25 @@
+requests.test49 = {
+    "requests" : [
+        {
+            "setData" : {
+                "source" : "DsRestAPI_Test_DataSource",
+                "element" : "TcCPS",
+                "params" : [{
+                        "paramName" : "EntityGroup",
+                        "paramValue" : "EntityGroup_0"
+                    }, {
+                        "paramName" : "Scenario",
+                        "paramValue" : "Scenario_0"
+                    }, {
+                        "paramName" : "TrafficCase",
+                        "paramValue" : "TrafficCase_0"
+                    }
+                ],
+                "content": "11.0",
+                "tp": 2
+            }
+        }
+    ]
+}
+
+descriptions.test48 = "Set data for getData handler"
diff --git a/test/DsRestAPI/JSON_reqResp/test49.response b/test/DsRestAPI/JSON_reqResp/test49.response
new file mode 100644
index 0000000..8de4bf7
--- /dev/null
+++ b/test/DsRestAPI/JSON_reqResp/test49.response
@@ -0,0 +1,10 @@
+responses.test49 = {
+    "contentList" : [
+    {
+        "node": {
+            "val": "11.000000",
+            "tp": 2
+        }
+    }
+]
+}
diff --git a/test/DsRestAPI/JSON_reqResp/test50.request b/test/DsRestAPI/JSON_reqResp/test50.request
new file mode 100644
index 0000000..d022bcb
--- /dev/null
+++ b/test/DsRestAPI/JSON_reqResp/test50.request
@@ -0,0 +1,25 @@
+requests.test50 = {
+    "requests" : [
+        {
+            "setData" : {
+                "source" : "DsRestAPI_Test_DataSource",
+                "element" : "TcCPS",
+                "params" : [{
+                        "paramName" : "EntityGroup",
+                        "paramValue" : "EntityGroup_0"
+                    }, {
+                        "paramName" : "Scenario",
+                        "paramValue" : "Scenario_0"
+                    }, {
+                        "paramName" : "TrafficCase",
+                        "paramValue" : "TrafficCase_0"
+                    }
+                ],
+                "content": "12",
+                "tp": 1
+            }
+        }
+    ]
+}
+
+descriptions.test48 = "Invalid Set data for getData handler: variable type is not correct"
diff --git a/test/DsRestAPI/JSON_reqResp/test50.response b/test/DsRestAPI/JSON_reqResp/test50.response
new file mode 100644
index 0000000..70036a5
--- /dev/null
+++ b/test/DsRestAPI/JSON_reqResp/test50.response
@@ -0,0 +1,10 @@
+responses.test50 = {
+    "contentList" : [
+    {
+        "node": {
+            "val": "f_EPTF_DataSourceClient_handleSetDataValue: Invalid iterator or externalData or parameter: \nSource: \"DsRestAPI_Test_DataSource\"\nPTC : \"tc_EPTF_DsRestAPI_Test_DSServer_JSON\"\nElement Name : \"TcCPS\"\nParams: { { paramName := \"EntityGroup\", paramValue := \"EntityGroup_0\" }, { paramName := \"Scenario\", paramValue := \"Scenario_0\" }, { paramName := \"TrafficCase\", paramValue := \"TrafficCase_0\" } }\nValue to Set: { intVal := 12 }\nIndex List: { }\nReason: Source Variable \"TcCPS\" is read-only or value is not allowed",
+            "tp": 4
+        }
+    }
+]
+}