diff --git a/LibOneM2M/OneM2M_Functions.ttcn b/LibOneM2M/OneM2M_Functions.ttcn index 024978d020340e9a02d54acf93b70dc4b1ea541a..ff2afac5951136e0f368c7f9a4b61f18ab99b91d 100644 --- a/LibOneM2M/OneM2M_Functions.ttcn +++ b/LibOneM2M/OneM2M_Functions.ttcn @@ -1128,6 +1128,51 @@ module OneM2M_Functions { }// end f_cse_updateResource + /** + * @desc Message exchange for the update of a resource + * @param p_resourceType Resource type of the resource to be created + * @param p_requestPrimitive UPDATE request primitive to be used + * @param p_resourceIndex Internal resource index which indicates the resource to be updated + * @verdict + */ + function f_cse_updateResourceHandler(integer p_resourceIndex, template RequestPrimitive p_request) runs on CseSimu { + + var integer v_targetResourceIndex := -1; + var ResponsePrimitive v_response; + + //Activate defaults when running on a PTC + f_cse_activateDefaults_cse1(); + + tc_ac.start; + alt { + [] mccPortIn.receive(mw_request(p_request)) -> value vc_request { + tc_ac.stop; + v_targetResourceIndex := f_getResourceIndex(vc_request.primitive.requestPrimitive.to_); + if(v_targetResourceIndex == p_resourceIndex) { + setverdict(pass, __SCOPE__&":INFO: Resource updated successfuly"); + v_response := valueof(m_responsePrimitive(int2004,vc_request.primitive.requestPrimitive.requestIdentifier)); + v_response.from_ := vc_localResourcesList[vc_cSEBaseIndex].resource.cSEBase.cSE_ID; + v_response.to_ := vc_request.primitive.requestPrimitive.from_; + f_updateLocalResource(v_targetResourceIndex, vc_request.primitive.requestPrimitive.primitiveContent); + v_response.primitiveContent := vc_localResourcesList[v_targetResourceIndex].resource; + } else { + setverdict(inconc, __SCOPE__&":INFO: Unexpected resource update"); + log(__SCOPE__&": ERROR: Resource Index not valid"); + v_response := valueof(m_responsePrimitive(int4004,vc_request.primitive.requestPrimitive.requestIdentifier)); + v_response.from_ := PX_CSE1_ID; + v_response.to_ := vc_request.primitive.requestPrimitive.from_; + } + mccPortIn.send(f_getMsgOutPrimitive(m_response(v_response))); + } + [] tc_ac.timeout { + setverdict(inconc, __SCOPE__&":INFO: No answer while updating resource"); + } + } + + f_checkCseSimuStatus(); + + }// end f_cse_updateResourceHandler + /** * @desc Message exchange for the retrieval of a resource * @param p_resourceIndex Resource index of the resource to be retrieved @@ -1888,7 +1933,7 @@ module OneM2M_Functions { * @param p_expectedResourceIndex Expected target parent resource of the announcemnet * @verdict */ - function f_cse_announcementProcedure_createHandler(template RequestPrimitive p_requestprimitive := ?, in ResponseStatusCode p_responseStatusCode := int2001, template(omit) integer p_expectedResourceIndex := omit) runs on CseSimu { + function f_cse_announcementProcedure_createHandler(template RequestPrimitive p_requestprimitive := ?, in ResponseStatusCode p_responseStatusCode := int2001, template(omit) integer p_expectedResourceIndex := omit) runs on CseSimu return integer{ // Local variables var MsgIn v_request; var integer v_parentIndex := vc_localRemoteCseIndex; @@ -1915,7 +1960,7 @@ module OneM2M_Functions { v_announcedResourceIndex := f_setLocalResource(v_announcedResource, v_request.primitive.requestPrimitive.resourceType, v_parentIndex); if(isvalue(p_expectedResourceIndex)){ - if(p_expectedResourceIndex == v_parentIndex){ + if(valueof(p_expectedResourceIndex) == v_parentIndex){ setverdict(pass, __SCOPE__ & ":INFO: Announcement Parent Resource Address matched"); v_responsePrimitive := valueof(m_responsePrimitive(p_responseStatusCode,v_request.primitive.requestPrimitive.requestIdentifier)); v_responsePrimitive.primitiveContent := vc_localResourcesList[p_expectedResourceIndex].resource; @@ -1943,6 +1988,8 @@ module OneM2M_Functions { } f_checkCseSimuStatus(); + + return v_announcedResourceIndex; } //end f_cse_announcementProcedure_createHandler @@ -2466,7 +2513,7 @@ module OneM2M_Functions { } v_myResource.contentInstance.stateTag := 0; v_myResource.contentInstance.contentSize := lengthof(v_myResource.contentInstance.content); - v_myResource.contentInstance.content := p_resource.contentInstance.content; + v_myResource.contentInstance.content := valueof(p_resource.contentInstance.content); } } @@ -2494,7 +2541,7 @@ module OneM2M_Functions { vc_localResourcesList[p_localResourceIndex].resource.remoteCSE.labels := p_resource.remoteCSE.labels; } if(ispresent(p_resource.remoteCSE.announceTo)) { - vc_localResourcesList[p_localResourceIndex].resource.remoteCSE.announceTo := p_resource.remoteCSE.announceTo; + vc_localResourcesList[p_localResourceIndex].resource.remoteCSE.announceTo := {p_resource.remoteCSE.announceTo[0] & "/" & vc_localResourcesList[vc_localRemoteCseIndex].resource.remoteCSE.resourceID & "Annc"}; } if(ispresent(p_resource.remoteCSE.announcedAttribute)) { vc_localResourcesList[p_localResourceIndex].resource.remoteCSE.announcedAttribute := p_resource.remoteCSE.announcedAttribute; @@ -3987,9 +4034,9 @@ module OneM2M_Functions { * @param MsgOut MsgOut primitive */ - function f_getMsgOutPrimitive(MsgOut p_msgOut) runs on Tester return MsgOut { + function f_getMsgOutPrimitive(template MsgOut p_msgOut) runs on Tester return MsgOut { p_msgOut.protocolBinding := vc_protocolBinding; - return p_msgOut; + return valueof(p_msgOut); } function f_sendUtPrimitive(template UtTriggerPrimitive p_utRequest, in universal charstring p_action) runs on Tester { @@ -4448,6 +4495,23 @@ module OneM2M_Functions { } return v_month; + } // end f_getMonth + + /** + * @desc Retrieve Time from a given timestamp + * @param p_timestamp Given timestamp + * @return Time + */ + function f_getTime(charstring p_timestamp) runs on Tester return integer { + + var charstring v_time := ""; + var integer i; + + for(i := 9; i <= 14; i := i+1){ + v_time := v_time & p_timestamp[i]; + } + return str2int(v_time); + } // end f_getYear /** diff --git a/LibOneM2M/OneM2M_Templates.ttcn b/LibOneM2M/OneM2M_Templates.ttcn index 6d7d07fe56a07853de5c6afc68a537236f2ee479..f89d55305a5f94695299d2be27b311e07d411246 100644 --- a/LibOneM2M/OneM2M_Templates.ttcn +++ b/LibOneM2M/OneM2M_Templates.ttcn @@ -16,9 +16,8 @@ module OneM2M_Templates { import from XSD all; import from OneM2M_Types all; import from OneM2M_TypesAndValues all; - //import from OneM2M_AdditionalTypes all; import from OneM2M_Pixits all; - import from OneM2M_Functions all; + import from OneM2M_Functions all; /** @@ -586,7 +585,15 @@ module OneM2M_Templates { requestIdentifier := "m_updateRemoteCSEBase", primitiveContent := {remoteCSE := m_contentUpdateRemoteCSE} } - + + /** + * @desc Reception template for update remoteCSE resource + */ + template RequestPrimitive mw_updateRemoteCSE(template XSD.ID p_from := *, template XSD.ID p_to := ?) modifies mw_update := { + resourceType := int16, + primitiveContent:= {remoteCSE := ?} + }; + template (value) RequestPrimitive m_updateAEAnncBase modifies m_update:= { requestIdentifier := testcasename() & "-m_updateAEAnnc", resourceType := int10002, diff --git a/OneM2M_PermutationFunctions.ttcn b/OneM2M_PermutationFunctions.ttcn index e9fe754ececfefc255d52f4d0c7a7d2d58a8f823..aefa2641180afb7354b26237c69affa44febbecc 100644 --- a/OneM2M_PermutationFunctions.ttcn +++ b/OneM2M_PermutationFunctions.ttcn @@ -394,7 +394,8 @@ module OneM2M_PermutationFunctions { f_cf03Up(); - //Send Trigger Mesf_generateLocalResource := f_ae_generateLocalResource(valueof(m_primitiveContentContainer(m_contentCreateContainer)), vc_cSEBaseIndex, int3); + //Send Trigger Message + v_localResource := f_generateLocalResource(valueof(m_primitiveContentContainer(m_contentCreateContainer)), vc_cSEBaseIndex, int3); v_auxInteger := f_setLocalResource(v_localResource, int3, vc_cSEBaseIndex); v_utRequest.requestPrimitive.to_ := f_getLocalResourceAddress(v_auxInteger, e_hierarchical, p_primitiveScope); f_sendUtPrimitive(v_utRequest,v_action); @@ -501,7 +502,8 @@ module OneM2M_PermutationFunctions { //Test component configuration f_cf03Up(); - //send triggeringf_generateLocalResourcelocalResource := f_ae_generateLocalResource(valueof(m_primitiveContentContainer(m_contentCreateContainer)), vc_cSEBaseIndex, int3); + //send triggering message + v_localResource := f_generateLocalResource(valueof(m_primitiveContentContainer(m_contentCreateContainer)), vc_cSEBaseIndex, int3); v_containerIndex := f_setLocalResource(v_localResource, int3, vc_cSEBaseIndex); p_utRequest.requestPrimitive.to_ := f_getLocalResourceAddress(v_containerIndex, -, -); p_request.to_ := p_utRequest.requestPrimitive.to_; @@ -599,7 +601,8 @@ module OneM2M_PermutationFunctions { //Preamble - //Send Trf_generateLocalResourcelResource := f_ae_generateLocalResource(valueof(m_primitiveContentAe(m_contentCreateAe(omit, omit, omit, omit))), vc_cSEBaseIndex, int2); + //Send Triggering message + v_localResource := f_generateLocalResource(valueof(m_primitiveContentAe(m_contentCreateAe(omit, omit, omit, omit))), vc_cSEBaseIndex, int2); v_resourceIndex := f_setLocalResource(v_localResource, int2, vc_cSEBaseIndex); p_utRequest.requestPrimitive.to_ := f_getLocalResourceAddress(v_resourceIndex); f_sendUtPrimitive(p_utRequest,p_action); @@ -640,7 +643,8 @@ module OneM2M_PermutationFunctions { //Test component configuration f_cf03Up(); - //send triggering f_generateLocalResourceocalResource := f_ae_generateLocalResource(valueof(m_primitiveContentContainer(m_contentCreateContainer)), vc_cSEBaseIndex, int3); + //send triggering message + v_localResource := f_generateLocalResource(valueof(m_primitiveContentContainer(m_contentCreateContainer)), vc_cSEBaseIndex, int3); v_resourceIndex := f_setLocalResource(v_localResource, int3, vc_cSEBaseIndex); p_utRequest.requestPrimitive.to_ := f_getLocalResourceAddress(v_resourceIndex); f_sendUtPrimitive(p_utRequest,p_action); @@ -690,7 +694,8 @@ module OneM2M_PermutationFunctions { //Test component configuration f_cf03Up(); - //send triggerinf_generateLocalResource_localResource := f_ae_generateLocalResource(valueof(p_primitiveContent), vc_cSEBaseIndex, p_resourceType); + //send triggering message + v_localResource := f_generateLocalResource(valueof(p_primitiveContent), vc_cSEBaseIndex, p_resourceType); v_resourceIndex := f_setLocalResource(v_localResource, p_resourceType, vc_cSEBaseIndex); v_utRequest := m_utRetrieve(f_getLocalResourceAddress(v_resourceIndex)); f_sendUtPrimitive(v_utRequest,p_action); @@ -7286,7 +7291,7 @@ module OneM2M_PermutationFunctions { tc_ac.stop; setverdict(pass, __SCOPE__, ": Resource " & int2str(enum2int(p_resourceType)) & " created successfully"); if(ispresent(v_response.primitive.responsePrimitive.primitiveContent.contentInstance.announceTo)) { - if(v_response.primitive.responsePrimitive.primitiveContent.contentInstance.announceTo != {}) { + if(lengthof(v_response.primitive.responsePrimitive.primitiveContent.contentInstance.announceTo) != 0) { setverdict(fail, __SCOPE__, ": Resource " & int2str(enum2int(p_resourceType)) & " contains the attribute announceTo"); } } @@ -7333,7 +7338,7 @@ module OneM2M_PermutationFunctions { //Preamble v_ae1.start(f_cse_createResource(int2,v_create)); - f_cse_announcementProcedure_createHandler(mw_createAEAnnc(-, -, -)); + v_aEAnncIndex := f_cse_announcementProcedure_createHandler(mw_createAEAnnc(-, -, -)); v_ae1.done; v_aeIndex := f_getLatestResourceIndex(v_ae1); @@ -7341,7 +7346,7 @@ module OneM2M_PermutationFunctions { // Test Body v_ae1.start(f_cse_createResource(p_resourceType,p_requestCreatePrimitive, v_aeIndex)); - f_cse_announcementProcedure_createHandler(p_createRequestAnnc); + f_cse_announcementProcedure_createHandler(p_createRequestAnnc, -, v_aEAnncIndex); v_ae1.done; @@ -7364,8 +7369,7 @@ module OneM2M_PermutationFunctions { var ResponsePrimitive v_responsePrimitive; var template RequestPrimitive v_create := m_createAe(PX_APP_ID, omit, omit); f_setProtocolBinding(PX_PROTOCOL_BINDING_AE1); - v_create.primitiveContent.container.announceTo := {PX_CSE1_ID}; - + // Test control // Test component configuration @@ -7373,34 +7377,23 @@ module OneM2M_PermutationFunctions { // Test adapter configuration // Register the CSE - f_cse_registerRemoteCse(m_createRemoteCSEBase); - + vc_remoteCseIndex := f_cse_registerRemoteCse(m_createRemoteCSEBase); + //Preamble v_ae1.start(f_cse_createResource(int2,v_create)); - f_cse_announcementProcedure_createHandler(mw_createRemoteCSEAnnc(-, -, -)); v_ae1.done; - + + v_aeIndex := f_getLatestResourceIndex(v_ae1); + // Test Body - v_ae1.start(f_cse_sendCreateRequestPrimitive(p_resourceType,p_requestCreatePrimitive, v_parentIndex)); - - tc_ac.start; - alt { - [] mccPortIn.receive(mw_request(p_createRequestAnnc)) -> value v_request { - tc_ac.stop; - setverdict(pass, __SCOPE__ & ":INFO: CREATE REQUEST received"); - - if(match(v_request.primitive.requestPrimitive.to_, f_getLocalResourceAddress(v_aEAnncIndex, e_hierarchical, e_spRelative)) or - match(v_request.primitive.requestPrimitive.to_, f_getLocalResourceAddress(v_aEAnncIndex, e_nonHierarchical, e_spRelative))) { - setverdict(pass, __SCOPE__ & ":matching ANNC_PARENT_RESOURCE_ADDRESS"); - } else { - setverdict(fail, __SCOPE__ & ":mis-matching ANNC_PARENT_RESOURCE_ADDRESS"); - } - - } - [] tc_ac.timeout { - setverdict(fail, __SCOPE__ & ":ERROR: No CREATE REQUEST received"); - } - } + v_ae1.start(f_cse_createResource(p_resourceType,p_requestCreatePrimitive, v_aeIndex)); + + //IUT shall announce itself by updating announceTo attribute of its remoteCSE on its registrar (CSE1) + f_cse_updateResourceHandler(vc_localRemoteCseIndex, mw_updateRemoteCSE); + + //IUT shall then create the announced resource on its remoteCSEAnnc as indicated in the announceTo attribute returned by its registrar (CSE1) + p_createRequestAnnc.to_ := vc_localResourcesList[vc_localRemoteCseIndex].resource.remoteCSE.announceTo[0]; + f_cse_announcementProcedure_createHandler(p_createRequestAnnc, -); v_ae1.done; diff --git a/OneM2M_Testcases_CSE_Release_2.ttcn b/OneM2M_Testcases_CSE_Release_2.ttcn index 736b71b151d3ee74fce5e41544dde2ebfd797064..47cfaf1dc464f2250fe1c43074cc4997edfdf66d 100644 --- a/OneM2M_Testcases_CSE_Release_2.ttcn +++ b/OneM2M_Testcases_CSE_Release_2.ttcn @@ -506,7 +506,7 @@ module OneM2M_Testcases_CSE_Release_2 { //Local variables var template RequestPrimitive v_createRequest := m_createSubscriptionBase; var ResponsePrimitive v_responsePrimitive; - var RequestPrimitive v_createAEAnnc := m_createAEAnnc(omit, omit, omit, PX_CSE1_ID); + var RequestPrimitive v_createAEAnnc := valueof(m_createAEAnnc(omit, omit, omit, PX_CSE1_ID)); var CseSimu v_cse1 := CseSimu.create("CSE1") alive; v_createRequest.primitiveContent.timeSeries.resourceName := omit; @@ -524,7 +524,7 @@ module OneM2M_Testcases_CSE_Release_2 { //Local variables var template RequestPrimitive v_createRequest := m_createContainerBase; var ResponsePrimitive v_responsePrimitive; - var RequestPrimitive v_createAEAnnc := m_createAEAnnc(omit, omit, omit, PX_CSE1_ID); + var RequestPrimitive v_createAEAnnc := valueof(m_createAEAnnc(omit, omit, omit, PX_CSE1_ID)); var CseSimu v_cse1 := CseSimu.create("CSE1") alive; v_createRequest.primitiveContent.container.resourceName := omit; @@ -543,7 +543,7 @@ module OneM2M_Testcases_CSE_Release_2 { // Local variables var template RequestPrimitive v_createRequest := m_createGroupBase; var ResponsePrimitive v_responsePrimitive; - var RequestPrimitive v_createAEAnnc := m_createAEAnnc(omit, omit, omit, PX_CSE1_ID); + var RequestPrimitive v_createAEAnnc := valueof(m_createAEAnnc(omit, omit, omit, PX_CSE1_ID)); var CseSimu v_cse1 := CseSimu.create("CSE1") alive; v_createRequest.primitiveContent.group_.resourceName := omit; @@ -561,7 +561,7 @@ module OneM2M_Testcases_CSE_Release_2 { // Local variables var template RequestPrimitive v_createRequest := m_createAcpBase; var ResponsePrimitive v_responsePrimitive; - var RequestPrimitive v_createAEAnnc := m_createAEAnnc(omit, omit, omit, PX_CSE1_ID); + var RequestPrimitive v_createAEAnnc := valueof(m_createAEAnnc(omit, omit, omit, PX_CSE1_ID)); var CseSimu v_cse1 := CseSimu.create("CSE1") alive; v_createRequest.primitiveContent.accessControlPolicy.resourceName := omit; @@ -767,7 +767,7 @@ module OneM2M_Testcases_CSE_Release_2 { // Local variables var template RequestPrimitive v_createRequest := m_createTimeSeriesBase; var ResponsePrimitive v_responsePrimitive; - var RequestPrimitive v_createAEAnnc := m_createAEAnnc(omit, omit, omit, PX_CSE1_ID); + var RequestPrimitive v_createAEAnnc := valueof(m_createAEAnnc(omit, omit, omit, PX_CSE1_ID)); var CseSimu v_cse1 := CseSimu.create("CSE1") alive; v_createRequest.primitiveContent.timeSeries.resourceName := omit; @@ -12928,7 +12928,7 @@ module OneM2M_Testcases_CSE_Release_2 { setverdict(inconc, __SCOPE__ & ": missingDataList attribute not present"); } else { if(ischosen(v_response.primitive.responsePrimitive.primitiveContent.timeSeries.missingDataList.alt_)) { - if(v_missingDataPointTimestamp < v_response.primitive.responsePrimitive.primitiveContent.timeSeries.missingDataList.alt_[0]) { + if(f_getTime(v_missingDataPointTimestamp) < f_getTime(v_response.primitive.responsePrimitive.primitiveContent.timeSeries.missingDataList.alt_[0])) { setverdict(pass, __SCOPE__ & ": missingData point inserted in missingDataList"); } else { setverdict(fail, __SCOPE__ & ": missingData point not inserted in missingDataList"); @@ -12998,7 +12998,7 @@ module OneM2M_Testcases_CSE_Release_2 { var XSD.NonNegativeInteger v_missingDataPointNumber := 1; var template PrimitiveContent v_contentNotification := {timeSeries := mw_contentTimeSeries(?,v_missingDataPointNumber)}; - v_eventNotificationCriteria.missingData := valueof(m_missingData(v_missingDataPointNumber, "1000")); + v_eventNotificationCriteria.missingData := valueof(m_missingData(v_missingDataPointNumber, "P60")); // Test control