From 2fad9594349af0a8369c8f70d32ebab1b29b69ca Mon Sep 17 00:00:00 2001
From: reinaortega <miguelangel.reinaortega@etsi.org>
Date: Fri, 17 Aug 2018 11:34:01 +0200
Subject: [PATCH] CSE deregistration to be first started by Registrar (TS),
 then, if no success, by the Registree

Signed-off-by: reinaortega <miguelangel.reinaortega@etsi.org>
---
 LibOneM2M/OneM2M_Functions.ttcn     | 91 ++++++++++++++++++++++++-----
 LibOneM2M/OneM2M_Templates.ttcn     | 37 ++++++++++++
 OneM2M_Testcases_CSE_Release_1.ttcn | 16 ++---
 3 files changed, 121 insertions(+), 23 deletions(-)

diff --git a/LibOneM2M/OneM2M_Functions.ttcn b/LibOneM2M/OneM2M_Functions.ttcn
index 4b7bd0e..5a7e396 100644
--- a/LibOneM2M/OneM2M_Functions.ttcn
+++ b/LibOneM2M/OneM2M_Functions.ttcn
@@ -805,7 +805,10 @@ module OneM2M_Functions {
 				var integer i;
 				var XSD.ID v_resourceAddress;
 				var RequestPrimitive v_request;
-	
+				var boolean v_deregistrationPerformed := false;
+				var template UtTriggerPrimitive v_utRequest := m_utDelete;
+				var universal charstring v_action := __SCOPE__ & ": Please, perform deregistration by sending a valid DELETE Request for remoteCSE to ";
+					
 				if (PX_RUN_POSTAMBLE) {
 					
 					if(vc_config == e_cf02CseSimuMaster) {
@@ -816,8 +819,9 @@ module OneM2M_Functions {
 		
 					for(i := lengthof(vc_resourcesIndexToBeDeleted) -1; i >=0; i := i - 1) {
 			
-						if(ischosen(vc_resourcesList[vc_resourcesIndexToBeDeleted[i]].resource.remoteCSE) and PX_MN_CSE) {
+						if(ischosen(vc_resourcesList[vc_resourcesIndexToBeDeleted[i]].resource.remoteCSE)) {
 							v_resourceAddress := f_getResourceAddress(vc_resourcesIndexToBeDeleted[i], e_nonHierarchical, e_spRelative);
+							v_deregistrationPerformed := true;
 						} else {
 							v_resourceAddress := f_getResourceAddress(vc_resourcesIndexToBeDeleted[i]);
 						} 
@@ -840,8 +844,68 @@ module OneM2M_Functions {
 								log(__SCOPE__&" INFO: No answer while deleting resource " & v_request.to_);
 							}	
 						}	
-			
 					}
+					
+					if(not(v_deregistrationPerformed)) {
+						if(vc_localRemoteCseIndex != -1) {
+							//Deregistration by Registrar (Test System)
+							mccPort.send(f_getMsgOutPrimitive(m_request(m_retrieveChildReferences(f_getResourceAddress(), f_getOriginator(vc_remoteCseIndex), {int16}))));
+							tc_ac.start;
+							alt {
+								[] mccPort.receive(mw_response(mw_responsePrimitiveOK)) -> value vc_response {
+									tc_ac.stop;
+									log(__SCOPE__&":INFO: Resource retrieved successfuly");
+									v_resourceAddress := vc_response.primitive.responsePrimitive.primitiveContent.cSEBase.choice.childResource_list[0].base;
+									v_request := valueof(m_delete(v_resourceAddress, PX_CSE1_ID));
+
+									mccPort.send(f_getMsgOutPrimitive(m_request(v_request)));
+
+									tc_ac.start;
+									alt {
+										[] mccPort.receive(mw_response(mw_responsePrimitiveOK)) {
+											tc_ac.stop;
+											log(__SCOPE__&" INFO: Resource " & v_request.to_ & " deleted");
+											v_deregistrationPerformed := true;
+										}
+										[] mccPort.receive(mw_response(mw_responsePrimitiveKO)) {
+											tc_ac.stop;
+											log(__SCOPE__&" INFO: Error while deleting resource " & v_request.to_);
+										}
+										[] tc_ac.timeout {
+											log(__SCOPE__&" INFO: No answer while deleting resource " & v_request.to_);
+										}	
+									}		
+								}
+								[] mccPort.receive(mw_response(mw_responsePrimitiveKO)) -> value vc_response {
+									tc_ac.stop;
+									log(__SCOPE__&":INFO: Error while retrieving resource");
+								}
+								[] tc_ac.timeout {
+									log(__SCOPE__&":INFO: No answer while retrieving resource");
+								}
+							}
+							
+							if(not(v_deregistrationPerformed)) {
+								//Deregistration by Registree (IUT)
+								//Send trigger message for deregistration
+								v_utRequest.requestPrimitive.to_ := f_getLocalResourceAddress(vc_localRemoteCseIndex);
+								f_sendUtPrimitive(v_utRequest, v_action & f_getLocalResourceAddress(vc_localRemoteCseIndex));	
+								
+								tc_ac.start;
+								alt {
+									[] mccPortIn.receive(mw_request(mw_delete(f_getLocalResourceAddress(vc_localRemoteCseIndex)))) -> value vc_request {
+										tc_ac.stop;
+										f_processDeleteRequestPrimitive(vc_request.primitive.requestPrimitive);
+										mccPortIn.send(f_getMsgOutPrimitive(m_response(vc_response.primitive.responsePrimitive)));
+										log(__SCOPE__&": INFO: Deregistration performed successfully");
+									}
+									[] tc_ac.timeout {
+										log(__SCOPE__&": INFO: No deregistration performed");
+									}
+								}
+							}
+						}
+					}					
 				}
 			
 			}			
@@ -1870,7 +1934,7 @@ module OneM2M_Functions {
     			
 				var MsgIn v_response;
 				var RequestPrimitive v_request;
-				var PrimitiveContent v_remoteCSEResource;
+				var PrimitiveContent v_localRemoteCSEResource;
 				
 				//Activate defaults when running on a PTC
 				f_cse_activateDefaults_cse1();
@@ -1885,8 +1949,8 @@ module OneM2M_Functions {
 						setverdict(pass, __SCOPE__&":INFO: Resource type remoteCSE created successfuly");
 						f_checkAttributesToBeSaved(int16, v_request, v_response.primitive.responsePrimitive);
 						vc_remoteCseIndex := f_setResource(v_response.primitive.responsePrimitive.primitiveContent, int16, -1);
-						v_remoteCSEResource := f_generateLocalResource(v_response.primitive.responsePrimitive.primitiveContent, vc_cSEBaseIndex, int16);
-						vc_localRemoteCseIndex := f_setLocalResource(v_remoteCSEResource, int16, vc_cSEBaseIndex);
+						v_localRemoteCSEResource := f_generateLocalResource(valueof(m_primitiveContentRemoteCSE(m_contentLocalRemoteCSEResource)), vc_cSEBaseIndex, int16);
+						vc_localRemoteCseIndex := f_setLocalResource(v_localRemoteCSEResource, int16, vc_cSEBaseIndex);
 					}
 					[] mccPort.receive(mw_response(mw_responsePrimitiveKO)) {
 						tc_ac.stop;
@@ -1916,15 +1980,12 @@ module OneM2M_Functions {
     			
 				var MsgIn v_request;
 				var ResponsePrimitive v_response;
-				var PrimitiveContent v_remoteCSEResource;
+				var PrimitiveContent v_localRemoteCSEResource;
 				var integer v_resourceIndex := -1;
 				var template UtTriggerPrimitive v_utRequest := m_utCreateRemoteCSE;
 				var charstring v_action := "Please, send a CSE registration request";
-				var integer v_parentIndex := vc_localRemoteCseIndex;
 				var ResponsePrimitive v_responsePrimitive;
-				var PrimitiveContent v_announcedResource;
 				var boolean v_remoteCSERegistered:=false;
-				var integer v_ResourceIndex := -1;
 				
 				//Activate defaults when running on a PTC
 				f_cse_activateDefaults_cse1();			
@@ -1937,8 +1998,8 @@ module OneM2M_Functions {
 					[not v_remoteCSERegistered] mccPortIn.receive(mw_request(p_requestPrimitive)) -> value v_request {
 						tc_ac.stop;
 						setverdict(pass, __SCOPE__&":INFO: Resource type remoteCSE created successfuly");
-						v_remoteCSEResource := f_generateLocalResource(v_request.primitive.requestPrimitive.primitiveContent, vc_cSEBaseIndex, int16);//TODO Get index from v_request.primitive.requestPrimitive.to_
-						vc_localRemoteCseIndex := f_setLocalResource(v_remoteCSEResource, int16, vc_cSEBaseIndex);
+						v_localRemoteCSEResource := f_generateLocalResource(v_request.primitive.requestPrimitive.primitiveContent, vc_cSEBaseIndex, int16);//TODO Get index from v_request.primitive.requestPrimitive.to_
+						vc_localRemoteCseIndex := f_setLocalResource(v_localRemoteCSEResource, int16, vc_cSEBaseIndex);
 						
 						v_response := valueof(m_responsePrimitive(int2001,v_request.primitive.requestPrimitive.requestIdentifier));
 						v_response.from_ := PX_CSE1_ID;
@@ -1946,7 +2007,7 @@ module OneM2M_Functions {
 						v_response.primitiveContent.remoteCSE := vc_localResourcesList[vc_localRemoteCseIndex].resource.remoteCSE;
 						mccPortIn.send(f_getMsgOutPrimitive(m_response(v_response)));
 						
-						vc_remoteCseIndex := f_setResource(valueof(m_primitiveContentRemoteCSE(m_contentMyRemoteCSEResource)), int16, -1);
+						vc_remoteCseIndex := f_setResource(valueof(m_primitiveContentRemoteCSE(m_contentMyRemoteCSEResource)), int16, -1, false);
 						v_resourceIndex := vc_remoteCseIndex;
 						v_remoteCSERegistered:=true;
 						tc_ac.start(10.0);
@@ -2333,7 +2394,7 @@ module OneM2M_Functions {
 					
 					v_localResourceIndex := f_processCreateRequestPrimitive(v_request.primitive.requestPrimitive);
 	
-					mccPortIn.send(f_getMsgOutPrimitive(m_response(v_response)));
+					mccPortIn.send(f_getMsgOutPrimitive(m_response(vc_response.primitive.responsePrimitive)));
 					tc_ac.start(10.0);
 					repeat;
 				}
@@ -2375,7 +2436,7 @@ module OneM2M_Functions {
 					//Send response in any case
 					v_response := valueof(m_responseNotification(int2000, omit));
 					v_response.requestIdentifier := vc_request.primitive.requestPrimitive.requestIdentifier;
-					mcaPortIn.send(f_getMsgOutPrimitive(m_response(v_response)));
+					mccPortIn.send(f_getMsgOutPrimitive(m_response(v_response)));
 					tc_ac.start(10.0);
 					repeat;
 				}
diff --git a/LibOneM2M/OneM2M_Templates.ttcn b/LibOneM2M/OneM2M_Templates.ttcn
index 96cf028..7d79c38 100644
--- a/LibOneM2M/OneM2M_Templates.ttcn
+++ b/LibOneM2M/OneM2M_Templates.ttcn
@@ -123,6 +123,33 @@ module OneM2M_Templates {
 				discoveryResultType := omit
 			};
 			
+			/**
+			 * @desc RETRIEVE request primitive for child references
+			 * @param p_targetResourceAddress Target resource address
+			 * @param p_originator Originator (from)
+			 */
+			template (value) RequestPrimitive m_retrieveChildReferences(XSD.ID p_targetResourceAddress, in XSD.ID p_originator, template (omit) ResourceTypeList p_resourceTypeList := omit) modifies m_retrieve := {
+				resultContent := int6, 
+				filterCriteria := {
+					createdBefore := omit,
+					createdAfter := omit,
+					modifiedSince := omit,
+					unmodifiedSince := omit,
+					stateTagSmaller := omit,
+					stateTagBigger := omit,
+					expireBefore := omit,
+					expireAfter := omit,
+					labels := omit,
+					resourceType := p_resourceTypeList,
+					sizeAbove := omit,
+					sizeBelow := omit,
+					contentType_list := {},
+					attribute_list := {},
+					filterUsage := omit,
+					limit := omit
+				}
+			};
+			
 			/**
 			 * @desc Base Receive RETRIEVE request primitive
 			 * @param p_targetResourceAddress Target resource address
@@ -2910,6 +2937,16 @@ module OneM2M_Templates {
 			requestReachability := true//M
 		};
 		
+		template RemoteCSE_optional m_contentLocalRemoteCSEResource modifies m_contentRemoteCSE_allOmit := {
+			resourceName := PX_CSE_NAME,//M
+			resourceType := int16,//M
+			resourceID := PX_CSE_RESOURCE_ID,//M
+			pointOfAccess := {PX_SUT_ADDRESS},//O
+			cSEBase := PX_CSE_ID & "/" & PX_CSE_NAME,//M
+			cSE_ID := PX_CSE_ID,//M
+			requestReachability := true//M
+		};
+		
 		template RemoteCSE_optional mw_contentRemoteCSEBase := {
 			resourceName := ?,//M
 			resourceType := ?,//M
diff --git a/OneM2M_Testcases_CSE_Release_1.ttcn b/OneM2M_Testcases_CSE_Release_1.ttcn
index cd7b3ca..953378e 100644
--- a/OneM2M_Testcases_CSE_Release_1.ttcn
+++ b/OneM2M_Testcases_CSE_Release_1.ttcn
@@ -1819,6 +1819,7 @@ module OneM2M_Testcases_CSE_Release_1 {
 					var PrimitiveContent v_localResource;
 					var integer v_parentResourceIndex := -1;
 					var integer v_localResourceIndex := -1;
+					var boolean v_cseRegistered := false;
 					var template UtTriggerPrimitive v_utRequest := m_utCreateRemoteCSE;
 					var universal charstring v_action :=  __SCOPE__ & ": Please, send a CSE registration request with attributes multiplicity equals to 1";
 	   
@@ -1840,7 +1841,7 @@ module OneM2M_Testcases_CSE_Release_1 {
 					// Test Body
 					tc_ac.start;
 					alt {
-						[] mccPortIn.receive(mw_request(mw_createRemoteCSEBase)) -> value v_request {
+						[not(v_cseRegistered)] mccPortIn.receive(mw_request(mw_createRemoteCSEBase)) -> value v_request {
 							tc_ac.stop;
 							setverdict(pass, __SCOPE__&":INFO: CREATE remoteCSE request received");
 							v_parentResourceIndex := f_getResourceIndex(v_request.primitive.requestPrimitive.to_);
@@ -1850,20 +1851,19 @@ module OneM2M_Testcases_CSE_Release_1 {
 						
 							} else {
 								v_localResource := f_generateLocalResource(v_request.primitive.requestPrimitive.primitiveContent, v_parentResourceIndex, v_request.primitive.requestPrimitive.resourceType);
-								v_localResourceIndex := f_setLocalResource(v_localResource, v_request.primitive.requestPrimitive.resourceType, v_parentResourceIndex);
+								vc_localRemoteCseIndex := f_setLocalResource(v_localResource, v_request.primitive.requestPrimitive.resourceType, v_parentResourceIndex);
 	
 								v_response := valueof(m_responsePrimitive(int2001,v_request.primitive.requestPrimitive.requestIdentifier));
-								v_response.primitiveContent := vc_localResourcesList[v_localResourceIndex].resource;
+								v_response.primitiveContent := vc_localResourcesList[vc_localRemoteCseIndex].resource;
+								v_cseRegistered := true;
 							}
 							v_response.from_ := PX_CSE1_ID;
 							v_response.to_ := v_request.primitive.requestPrimitive.from_;
 							mccPortIn.send(f_getMsgOutPrimitive(m_response(v_response)));				}
-						[] mccPortIn.receive {
-							tc_ac.stop;
-							setverdict(fail, __SCOPE__&":INFO: Unexpected message received");
-						}
 						[] tc_ac.timeout {
-							setverdict(fail, __SCOPE__&":INFO: No request received for creating resource type remoteCSE");
+							if(not(v_cseRegistered)) {
+								setverdict(fail, __SCOPE__&":INFO: No request received for creating resource type remoteCSE");
+							}
 						}
 					}	
 					// Postamble
-- 
GitLab