# O-RAN C++ Hello World xApp Note
###### tags: `ORAN`

## :notebook_with_decorative_cover: Table Of Contents
:::info
- [x] Hello World xApp General Introduction
- [x] Hello World xApp Deployment
- [x] Studying Hello World xApp To Understand How xApp Access DB
- [x] Studying Hello World xApp To Understand How xApp Handle E2SM + E2AP
- [x] Hello World xApp Unit Test Deployment
- [x] Hello World xApp Unit Test Complete Logs
:::
<br>
## :notebook_with_decorative_cover: Main Page
---
### <center>Hello World xApp General Introduction</center>
---
:::info
The RIC platform provides set of functions that the xApps can use to accomplish their tasks. Hello World xApp is envisioned to provide xApp developers, examples of implementing these sets of functions.
:::
<br>
---
### <center>Hello World xApp Deployment</center>
---
>[color=#ffa700]1. First we have to pull Hello World xApp repository from github by using this command.
```
sudo -i
git clone "https://gerrit.o-ran-sc.org/r/ric-app/hw" -b master
```

<br>
>[color=#ffa700]2. After that, we have to build the dockerfile by using this command.
```
cd hw
docker build -t nexus3.o-ran-sc.org:10002/o-ran-sc/ric-app-hw:1.0.6 .
```

<br>
>[color=#ffa700]3. Then we can continue to the onboarding part by following these commands below and change the ip according to your own kong ip address result.
```
sudo kubectl get service -A | grep 32080
echo '{"config-file.json_url": "https://gerrit.o-ran-sc.org/r/gitweb?p=ric-app/hw.git;a=blob_plain;f=init/config-file.json;hb=refs/heads/master" }' > onboard.hw.url
curl --location --request POST "http://10.97.87.206:32080/onboard/api/v1/onboard/download" --header 'Content-Type: application/json' --data-binary "@./onboard.hw.url"
```


<br>
>[color=#ffa700]4. If status is created already we can continue to deploy HW xApp by using.
```
curl --location --request POST "http://10.97.87.206:32080/appmgr/ric/v1/xapps" --header 'Content-Type: application/json' --data-raw '{"xappName": "hwxapp"}' -v
```

<br>
>[color=#ffa700]5. To make sure our pod is deployed already we can take a look if there any ricxapp-hwxapp pod deployed by using
```
kubectl get pods -n ricxapp
```

<br>
---
### <center>Studying Hello World xApp To Understand How xApp Access DB</center>
---
:::info
Hello World xApp DB test is separated into two parts, the first one is to check if RNIB is working or not, and the second test is to check if SDL is working or not.
:::

:::info
For the first test the main job is to set gnblist to RNIB, there are two ids that will be used named as **test1** and **test2**
:::

<center>Fig.1. Data Sent By HW xApp To RNIB [1] </center>
<br>
:::info
After HW xApp set some data, it will try to retrieve the data by using get gnblist and will print every gnb id stored on the RNIB side. If **test1** and **test2** are printed in means that RNIB is working fine.
:::

<center>Fig.2. Data Retrieved By HW xApp From RNIB [1] </center>
<br>
:::info
For the second test it will try to set a data to Redis through SDL. HW xApp will set **abc** as a key and as **e** the value.
:::


<center>Fig.3. Data Sent By HW xApp Through SDL [1] </center>
<br>
:::info
And after that HW xApp will try to get the value of **abc** key from Redis through SDL. If the result is equal to **e** it means SDL is working fine.
:::

<center>Fig.4. Data Retrieved By HW xApp Through SDL [1] </center>
<br>
---
### <center>Hello World xApp Unit Test Deployment</center>
---
>[color=#ffa700]1. First we have to pull Hello World xApp repository from github by using this command.
```
sudo -i
git clone "https://gerrit.o-ran-sc.org/r/ric-app/hw" -b master\
```

<br>
>[color=#ffa700]2. After that, we have to rename **Dockerfile** to another name and **Dockerfile-Unit-Test** To **Dockerfile**
```
cd hw
mv Dockerfile Docker1
mv Dockerfile-Unit-Tests Dockerfile
docker build --no-cache -t hw-xapp-test .
```

<br>
>[color=#ffa700]3. Make sure that we can see the image we made before by using.
```
docker images
```

<br>
>[color=#ffa700]4. After that, we have to run the docker image we made by using this command.
```
docker run --net host -it --rm -v "/root/hw/init:/opt/ric/config" --name "HW-xAPP" hw-xapp-test:latest
```
<br>
>[color=#ffa700]5. After we run the image a test should ran and if the test result is ok it will show **RUN** and then **OK**

<br>
---
### <center>Studying Hello World xApp To Understand How xApp Handle E2SM + E2AP</center>
---
<br>
:::info
In Hello World xApp unit test, they try to test E2AP Class 1 Procedure and Class 2 Procedure. All the procedure on E2AP could be seen on the image below.
:::

<center>Fig.5. E2AP Class 1 Elementary Procedures [2]</center>
<br>

<center>Fig.6. E2AP Class 2 Elementary Procedures [2]</center>
<br>
:::info
Based on Hello World xApp Unit test for E2AP they ran several tests to check the functionality of E2AP. It is separated to several tests, the related test code could be seen on the image below.
:::

<br>
:::info
First it will try to make a dummy xApp first using the flow below.
:::

<br>
<br>
---
### <center>Unit Testing Function</center>
---
:::info
**<i class="fa fa-book fa-fw"></i> test_cntrl.h**
:::
:::success
On this test they try to check E2AP class 1 elementary procedure called as **RIC control request.** This test has 1 test case named as :
- ControlMessage
:::

<br>
:::warning
**ControlMessage**
:::
:::success
RIC control request made, and the value for every message will be set for every variable to match the **actual RIC control request message** standard from E2AP.
:::


<center>Fig.7. E2AP RIC Control Request Message [2]</center>
<br>
<br>
:::info
**<i class="fa fa-book fa-fw"></i> test_e2ap.h**
:::
:::success
On this test they try to check E2AP class 1 elementary procedures called as **RIC Control, RIC Subscription Delete, and RIC Subscription.** This test has 13 test cases named as :
- ControlAcknowledgementEncode
- ControlAcknowledgementDecode
- ControlFailureEncode
- ControlFailureDecode
- SubscriptionDeleteRequest
- SubDelResponseEncode
- SubDelResponseDecode
- SubDelFailureEncode
- SubDelFailureDecode
- SubResponseEncode
- SubResponseDecode
- SubFailureEncode
- SubFailureDecode
:::

<br>
:::warning
**ControlAcknowledgementEncode**
:::
:::success
RIC control acknowledgement file made and then it is written into **controlack1.per** with encoding function. Variable used is the same as the actual **E2AP Control Acknowledgement Message**.
:::


<center>Fig.8. E2AP RIC Control Acknowledge Message [2]</center>
<br>
<br>
:::warning
**ControlAcknowledgementDecode**
:::
:::success
This test is made to decode the previous ControlAcknowledgementEncode message by reading the **controlack1.per** file
:::

<br>
<br>
:::warning
**ControlFailureEncode**
:::
:::success
RIC control failure file made and then it is written into **controlfail1.per** with encoding function. Variable used is the same as the actual **E2AP Control Failure Message**.
:::


<center>Fig.9. E2AP RIC Control Failure Message [2]</center>
<br>
<br>
:::warning
**ControlFailureDecode**
:::
:::success
This test is made to decode the previous ControlFailureEncode message by reading the **controlfail1.per** file
:::

<br>
<br>
:::warning
**SubscriptionDeleteRequest**
:::
:::success
RIC delete request made in this function. Variable used is the same as the actual **E2AP Subscription Delete Request**.
:::


<center>Fig.10. E2AP RIC Subscription Delete Request Message [2]</center>
<br>
<br>
:::warning
**SubDelResponseEncode**
:::
:::success
RIC subscription delete response file made and then it is written into **subdelresponse1.per** with encoding function. Variable used is the same as the actual **E2AP Subscription Delete Response**.
:::


<center>Fig.11. E2AP Subscription Delete Response Message [2]</center>
<br>
<br>
:::warning
**SubDelResponseDecode**
:::
:::success
This test is made to decode the previous SubDelResponseEncode message by reading the **subdelresponse1.per** file
:::

<br>
<br>
:::warning
**SubDelFailureEncode**
:::
:::success
RIC subscription delete response file made and then it is written into **subdelfailure2.per** with encoding function. Variable used is the same as the actual **E2AP Subscription Delete Failure**.
:::


<center>Fig.12. E2AP Subscription Delete Failure Message [2]</center>
<br>
<br>
:::warning
**SubDelFailureDecode**
:::
:::success
This test is made to decode the previous SubDelFailureEncode message by reading the **subdelfailure2.per** file
:::

<br>
<br>
:::warning
**SubResponseEncode**
:::
:::success
RIC subscription delete response file made and then it is written into **subresponse1.per** with encoding function. Variable used is the same as the actual **E2AP Subscription Response**.
:::


<center>Fig.13. E2AP Subscription Response Message [2]</center>
<br>
<br>
:::warning
**SubResponseDecode**
:::
:::success
This test is made to decode the previous SubResponseEncode message by reading the **subresponse1.per** file
:::

<br>
<br>
:::warning
**SubFailureEncode**
:::
:::success
RIC subscription delete response file made and then it is written into **subfailure1.per** with encoding function. Variable used is the same as the actual **E2AP Subscription Failure**.
:::


<center>Fig.14. E2AP Subscription Failure Message [2]</center>
<br>
<br>
:::warning
**SubFailureDecode**
:::
:::success
This test is made to decode the previous SubFailureEncode message by reading the **subfailure1.per** file
:::

<br>
<br>
:::info
**<i class="fa fa-book fa-fw"></i> test_indc.h**
:::
:::success
On this test they try to check E2AP class 1 and class 2 elementary procedures called as **RIC Indication and RIC Subscription.** This test has 2 test cases named as :
- IndicationMessageEncode
- IndicationMessageDecode
:::

<br>
:::warning
**IndicationMessageEncode**
:::
:::success
RIC indication file made and then it is written into **indication1.per** with encoding function. Variable used is the same as the actual **E2AP Indication Message**.
:::


<center>Fig.15. E2AP Indication Message [2]</center>
<br>
<br>
:::warning
**IndicationMessageDecode**
:::
:::success
This test is made to decode the previous IndicationMessageEncode message by reading the **indication1.per** file
:::

<br>
<br>
:::info
**<i class="fa fa-book fa-fw"></i> test_subs.h**
:::
:::success
On this test they try to check E2AP class 1 elementary procedures called as **RIC Subscription.**
:::

<br>
---
### <center>Hello World xApp Unit Test Complete Logs</center>
---
:::success
**xApp Creation**
:::

<br>
:::success
**E2AP Control Acknowledgement Encode**
:::

<br>
:::success
**E2AP Control Acknowledgement Decode**
:::

<br>
:::success
**E2AP Control Failure Encode**
:::

<br>
:::success
**E2AP Control Failure Decode**
:::

<br>
:::success
**E2AP Subscription Delete Request**
:::

<br>
:::success
**E2AP Subscription Delete Response Encode**
:::

<br>
:::success
**E2AP Subscription Delete Response Decode**
:::

<br>
:::success
**E2AP Subscription Delete Failure Encode**
:::


<br>
:::success
**E2AP Subscription Delete Failure Decode**
:::

<br>
:::success
**E2AP Subscription Response Encode**
:::


<br>
:::success
**E2AP Subscription Response Decode**
:::

<br>
:::success
**Complete Log**
:::
```=shell
Xapp Name is: hwxapp
{"ts":1632483588312,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Xapp Name set to hwxapp from environment varia ble"}
{"ts":1632483588312,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Xapp ID set to hwxapp from environment variabl e"}
{"ts":1632483588312,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Ports set to 4560 from environment variable"}
1632483588 8/RMR [INFO] ric message routing library on SI95/g mv=3 flg=00 (84423e6 4.4.6 built: Dec 4 2020)
{"ts":1632483588314,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":">>> waiting for RMR, file= ../src/xapp-utils/x app_rmr.cc, line=59"}
{"ts":1632483589315,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"RMR Context is Ready, file= ../src/xapp-utils/ xapp_rmr.cc, line=63"}
Note: Google Test filter = E2AP*
[==========] Running 13 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 13 tests from E2AP
[ RUN ] E2AP.ControlAcknowledgementEncode
<E2AP-PDU>
<successfulOutcome>
<procedureCode>4</procedureCode>
<criticality><reject/></criticality>
<value>
<RICcontrolAcknowledge>
<protocolIEs>
<RICcontrolAcknowledge-IEs>
<id>29</id>
<criticality><reject/></criticality>
<value>
<RICrequestID>
<ricRequestorID>1</ricRequestorID>
<ricInstanceID>1</ricInstanceID>
</RICrequestID>
</value>
</RICcontrolAcknowledge-IEs>
<RICcontrolAcknowledge-IEs>
<id>5</id>
<criticality><reject/></criticality>
<value>
<RANfunctionID>1</RANfunctionID>
</value>
</RICcontrolAcknowledge-IEs>
<RICcontrolAcknowledge-IEs>
<id>24</id>
<criticality><reject/></criticality>
<value>
<RICcontrolStatus><rejected/></RICcontrolStatus>
</value>
</RICcontrolAcknowledge-IEs>
<RICcontrolAcknowledge-IEs>
<id>20</id>
<criticality><reject/></criticality>
<value>
<RICcallProcessID>43 61 6C 6C 50 72 6F 63 65 73 73 49 44</RICcallProcessID>
</value>
</RICcontrolAcknowledge-IEs>
<RICcontrolAcknowledge-IEs>
<id>20</id>
<criticality><reject/></criticality>
<value>
<RICcontrolOutcome>43 6F 6E 74 72 6F 6C 4F 75 74 63 6F 6D 65</RICcontrolOutcome>
</value>
</RICcontrolAcknowledge-IEs>
</protocolIEs>
</RICcontrolAcknowledge>
</value>
</successfulOutcome>
</E2AP-PDU>
1632483589 8/RMR [INFO] sends: ts=1632483589 src=ric:38000 target=service-ricplt-e2term-rmr-alpha.ricplt:38000 open=0 succ=0 fail=0 (hard=0 soft=0)
1632483589 8/RMR [INFO] sends: ts=1632483589 src=ric:38000 target=service-ricplt-a1mediator-rmr.ricplt:4562 open=0 su cc=0 fail=0 (hard=0 soft=0)
{"ts":1632483591317,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing E2AP Control Response object memory"}
{"ts":1632483591317,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed E2AP Control Response object memory"}
[ OK ] E2AP.ControlAcknowledgementEncode (2002 ms)
[ RUN ] E2AP.ControlAcknowledgementDecode
e2ap buffer size: 64
{"ts":1632483591317,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Successfully decoded: RIC Control Ack Message" }
{"ts":1632483591317,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing E2AP Control Response object memory"}
{"ts":1632483591317,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed E2AP Control Response object memory"}
[ OK ] E2AP.ControlAcknowledgementDecode (0 ms)
[ RUN ] E2AP.ControlFailureEncode
<E2AP-PDU>
<unsuccessfulOutcome>
<procedureCode>4</procedureCode>
<criticality><reject/></criticality>
<value>
<RICcontrolFailure>
<protocolIEs>
<RICcontrolFailure-IEs>
<id>29</id>
<criticality><reject/></criticality>
<value>
<RICrequestID>
<ricRequestorID>1</ricRequestorID>
<ricInstanceID>1</ricInstanceID>
</RICrequestID>
</value>
</RICcontrolFailure-IEs>
<RICcontrolFailure-IEs>
<id>5</id>
<criticality><reject/></criticality>
<value>
<RANfunctionID>1</RANfunctionID>
</value>
</RICcontrolFailure-IEs>
<RICcontrolFailure-IEs>
<id>1</id>
<criticality><ignore/></criticality>
<value>
<Cause>
<ricRequest><action-not-supported/></ricRequest>
</Cause>
</value>
</RICcontrolFailure-IEs>
<RICcontrolFailure-IEs>
<id>20</id>
<criticality><reject/></criticality>
<value>
<RICcallProcessID>43 61 6C 6C 50 72 6F 63 65 73 73 49 44</RICcallProcessID>
</value>
</RICcontrolFailure-IEs>
<RICcontrolFailure-IEs>
<id>20</id>
<criticality><reject/></criticality>
<value>
<RICcontrolOutcome>43 6F 6E 74 72 6F 6C 4F 75 74 63 6F 6D 65</RICcontrolOutcome>
</value>
</RICcontrolFailure-IEs>
</protocolIEs>
</RICcontrolFailure>
</value>
</unsuccessfulOutcome>
</E2AP-PDU>
{"ts":1632483593318,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing E2AP Control Response object memory"}
{"ts":1632483593318,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed E2AP Control Response object memory"}
[ OK ] E2AP.ControlFailureEncode (2001 ms)
[ RUN ] E2AP.ControlFailureDecode
e2ap buffer size: 65
{"ts":1632483593318,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Successfully decoded: RIC Control Ack Message" }
{"ts":1632483593318,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing E2AP Control Response object memory"}
{"ts":1632483593318,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed E2AP Control Response object memory"}
[ OK ] E2AP.ControlFailureDecode (0 ms)
[ RUN ] E2AP.SubscriptionDeleteRequest
<E2AP-PDU>
<initiatingMessage>
<procedureCode>9</procedureCode>
<criticality><reject/></criticality>
<value>
<RICsubscriptionDeleteRequest>
<protocolIEs>
<RICsubscriptionDeleteRequest-IEs>
<id>29</id>
<criticality><reject/></criticality>
<value>
<RICrequestID>
<ricRequestorID>3</ricRequestorID>
<ricInstanceID>1</ricInstanceID>
</RICrequestID>
</value>
</RICsubscriptionDeleteRequest-IEs>
<RICsubscriptionDeleteRequest-IEs>
<id>5</id>
<criticality><reject/></criticality>
<value>
<RANfunctionID>1</RANfunctionID>
</value>
</RICsubscriptionDeleteRequest-IEs>
</protocolIEs>
</RICsubscriptionDeleteRequest>
</value>
</initiatingMessage>
</E2AP-PDU>
{"ts":1632483593318,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object me mory"}
{"ts":1632483593318,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memo ry"}
[ OK ] E2AP.SubscriptionDeleteRequest (0 ms)
[ RUN ] E2AP.SubDelResponseEncode
<E2AP-PDU>
<successfulOutcome>
<procedureCode>9</procedureCode>
<criticality><reject/></criticality>
<value>
<RICsubscriptionDeleteResponse>
<protocolIEs>
<RICsubscriptionDeleteResponse-IEs>
<id>29</id>
<criticality><reject/></criticality>
<value>
<RICrequestID>
<ricRequestorID>1</ricRequestorID>
<ricInstanceID>1</ricInstanceID>
</RICrequestID>
</value>
</RICsubscriptionDeleteResponse-IEs>
<RICsubscriptionDeleteResponse-IEs>
<id>5</id>
<criticality><reject/></criticality>
<value>
<RANfunctionID>1</RANfunctionID>
</value>
</RICsubscriptionDeleteResponse-IEs>
</protocolIEs>
</RICsubscriptionDeleteResponse>
</value>
</successfulOutcome>
</E2AP-PDU>
{"ts":1632483595322,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object me mory"}
{"ts":1632483595322,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memo ry"}
[ OK ] E2AP.SubDelResponseEncode (2004 ms)
[ RUN ] E2AP.SubDelResponseDecode
e2ap buffer size: 22
{"ts":1632483605323,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Successfully decoded: RIC Subscription Delete Response"}
{"ts":1632483605323,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object me mory"}
{"ts":1632483605323,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memo ry"}
[ OK ] E2AP.SubDelResponseDecode (10001 ms)
[ RUN ] E2AP.SubDelFailureEncode
<E2AP-PDU>
<unsuccessfulOutcome>
<procedureCode>9</procedureCode>
<criticality><reject/></criticality>
<value>
<RICsubscriptionDeleteFailure>
<protocolIEs>
<RICsubscriptionDeleteFailure-IEs>
<id>29</id>
<criticality><reject/></criticality>
<value>
<RICrequestID>
<ricRequestorID>102</ricRequestorID>
<ricInstanceID>101</ricInstanceID>
</RICrequestID>
</value>
</RICsubscriptionDeleteFailure-IEs>
<RICsubscriptionDeleteFailure-IEs>
<id>5</id>
<criticality><reject/></criticality>
<value>
<RANfunctionID>1</RANfunctionID>
</value>
</RICsubscriptionDeleteFailure-IEs>
<RICsubscriptionDeleteFailure-IEs>
<id>1</id>
<criticality><ignore/></criticality>
<value>
<Cause>
<ricRequest><excessive-actions/></ricRequest>
</Cause>
</value>
</RICsubscriptionDeleteFailure-IEs>
<RICsubscriptionDeleteFailure-IEs>
<id>2</id>
<criticality><ignore/></criticality>
<value>
<CriticalityDiagnostics>
<procedureCode>10</procedureCode>
<triggeringMessage><successful-outcome/></triggeringMessage>
<procedureCriticality><reject/></procedureCriticality>
<ricRequestorID>
<ricRequestorID>0</ricRequestorID>
<ricInstanceID>0</ricInstanceID>
</ricRequestorID>
<iEsCriticalityDiagnostics>
<CriticalityDiagnostics-IE-Item>
<iECriticality><notify/></iECriticality>
<iE-ID>1</iE-ID>
<typeOfError><missing/></typeOfError>
</CriticalityDiagnostics-IE-Item>
<CriticalityDiagnostics-IE-Item>
<iECriticality><ignore/></iECriticality>
<iE-ID>1</iE-ID>
<typeOfError><missing/></typeOfError>
</CriticalityDiagnostics-IE-Item>
</iEsCriticalityDiagnostics>
</CriticalityDiagnostics>
</value>
</RICsubscriptionDeleteFailure-IEs>
</protocolIEs>
</RICsubscriptionDeleteFailure>
</value>
</unsuccessfulOutcome>
</E2AP-PDU>
{"ts":1632483607334,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object me mory"}
{"ts":1632483607334,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memo ry"}
[ OK ] E2AP.SubDelFailureEncode (2011 ms)
[ RUN ] E2AP.SubDelFailureDecode
e2ap buffer size: 47
{"ts":1632483617336,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Unsuccessfully decoded: RIC Subscription Delet e Failure"}
Procedure Code: 10
Procedure Criticality: 0
Size OF LIST :2
Typ Error:::1
iEcriticality:::2
ieID:::1
Typ Error:::1
iEcriticality:::1
ieID:::1
{"ts":1632483617336,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object me mory"}
{"ts":1632483617336,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memo ry"}
[ OK ] E2AP.SubDelFailureDecode (10002 ms)
[ RUN ] E2AP.SubResponseEncode
<E2AP-PDU>
<successfulOutcome>
<procedureCode>8</procedureCode>
<criticality><reject/></criticality>
<value>
<RICsubscriptionResponse>
<protocolIEs>
<RICsubscriptionResponse-IEs>
<id>29</id>
<criticality><reject/></criticality>
<value>
<RICrequestID>
<ricRequestorID>1</ricRequestorID>
<ricInstanceID>1</ricInstanceID>
</RICrequestID>
</value>
</RICsubscriptionResponse-IEs>
<RICsubscriptionResponse-IEs>
<id>5</id>
<criticality><reject/></criticality>
<value>
<RANfunctionID>1</RANfunctionID>
</value>
</RICsubscriptionResponse-IEs>
<RICsubscriptionResponse-IEs>
<id>17</id>
<criticality><reject/></criticality>
<value>
<RICaction-Admitted-List>
<ProtocolIE-SingleContainer>
<id>14</id>
<criticality><ignore/></criticality>
<value>
<RICaction-Admitted-Item>
<ricActionID>1</ricActionID>
</RICaction-Admitted-Item>
</value>
</ProtocolIE-SingleContainer>
<ProtocolIE-SingleContainer>
<id>14</id>
<criticality><ignore/></criticality>
<value>
<RICaction-Admitted-Item>
<ricActionID>2</ricActionID>
</RICaction-Admitted-Item>
</value>
</ProtocolIE-SingleContainer>
</RICaction-Admitted-List>
</value>
</RICsubscriptionResponse-IEs>
<RICsubscriptionResponse-IEs>
<id>18</id>
<criticality><reject/></criticality>
<value>
<RICaction-NotAdmitted-List>
<ProtocolIE-SingleContainer>
<id>16</id>
<criticality><ignore/></criticality>
<value>
<RICaction-NotAdmitted-Item>
<ricActionID>2</ricActionID>
<cause>
<ricRequest><duplicate-action/></ricRequest>
</cause>
</RICaction-NotAdmitted-Item>
</value>
</ProtocolIE-SingleContainer>
<ProtocolIE-SingleContainer>
<id>16</id>
<criticality><ignore/></criticality>
<value>
<RICaction-NotAdmitted-Item>
<ricActionID>2</ricActionID>
<cause>
<ricRequest><action-not-supported/></ricRequest>
</cause>
</RICaction-NotAdmitted-Item>
</value>
</ProtocolIE-SingleContainer>
</RICaction-NotAdmitted-List>
</value>
</RICsubscriptionResponse-IEs>
</protocolIEs>
</RICsubscriptionResponse>
</value>
</successfulOutcome>
</E2AP-PDU>
{"ts":1632483617336,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed Subscription Response Object memory"}
[ OK ] E2AP.SubResponseEncode (0 ms)
[ RUN ] E2AP.SubResponseDecode
1632483620 8/RMR [INFO] sends: ts=1632483620 src=ric:38000 target=service-ricplt-e2term-rmr-alpha.ricplt:38000 open=0 succ=0 fail=0 (hard=0 soft=0)
1632483620 8/RMR [INFO] sends: ts=1632483620 src=ric:38000 target=service-ricplt-a1mediator-rmr.ricplt:4562 open=0 su cc=0 fail=0 (hard=0 soft=0)
subresponse2.per: No such file or directory
XaPP terminated via signal -1
root@ric:~/hw# docker run --net host -it --rm -v "/root/hw/init:/opt/ric/config" --name "HW-xAPP" hw-xapp-test:latest
Xapp Name is: hwxapp
{"ts":1632483756957,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Xapp Name set to hwxapp from environment variable"}
{"ts":1632483756957,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Xapp ID set to hwxapp from environment variable"}
{"ts":1632483756957,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Ports set to 4560 from environment variable"}
1632483756 8/RMR [INFO] ric message routing library on SI95/g mv=3 flg=00 (84423e6 4.4.6 built: Dec 4 2020)
{"ts":1632483756958,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":">>> waiting for RMR, file= ../src/xapp-utils/xapp_rmr.cc, line=59"}
{"ts":1632483757961,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"RMR Context is Ready, file= ../src/xapp-utils/xapp_rmr.cc, line=63"}
1632483757 8/RMR [INFO] sends: ts=1632483757 src=ric:38000 target=service-ricplt-e2term-rmr-alpha.ricplt:38000 open=0 succ=0 fail=0 (hard=0 soft=0)
1632483757 8/RMR [INFO] sends: ts=1632483757 src=ric:38000 target=service-ricplt-a1mediator-rmr.ricplt:4562 open=0 succ=0 fail=0 (hard=0 soft=0)
Note: Google Test filter = E2AP*
[==========] Running 13 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 13 tests from E2AP
[ RUN ] E2AP.ControlAcknowledgementEncode
<E2AP-PDU>
<successfulOutcome>
<procedureCode>4</procedureCode>
<criticality><reject/></criticality>
<value>
<RICcontrolAcknowledge>
<protocolIEs>
<RICcontrolAcknowledge-IEs>
<id>29</id>
<criticality><reject/></criticality>
<value>
<RICrequestID>
<ricRequestorID>1</ricRequestorID>
<ricInstanceID>1</ricInstanceID>
</RICrequestID>
</value>
</RICcontrolAcknowledge-IEs>
<RICcontrolAcknowledge-IEs>
<id>5</id>
<criticality><reject/></criticality>
<value>
<RANfunctionID>1</RANfunctionID>
</value>
</RICcontrolAcknowledge-IEs>
<RICcontrolAcknowledge-IEs>
<id>24</id>
<criticality><reject/></criticality>
<value>
<RICcontrolStatus><rejected/></RICcontrolStatus>
</value>
</RICcontrolAcknowledge-IEs>
<RICcontrolAcknowledge-IEs>
<id>20</id>
<criticality><reject/></criticality>
<value>
<RICcallProcessID>43 61 6C 6C 50 72 6F 63 65 73 73 49 44</RICcallProcessID>
</value>
</RICcontrolAcknowledge-IEs>
<RICcontrolAcknowledge-IEs>
<id>20</id>
<criticality><reject/></criticality>
<value>
<RICcontrolOutcome>43 6F 6E 74 72 6F 6C 4F 75 74 63 6F 6D 65</RICcontrolOutcome>
</value>
</RICcontrolAcknowledge-IEs>
</protocolIEs>
</RICcontrolAcknowledge>
</value>
</successfulOutcome>
</E2AP-PDU>
{"ts":1632483759961,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing E2AP Control Response object memory"}
{"ts":1632483759961,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed E2AP Control Response object memory"}
[ OK ] E2AP.ControlAcknowledgementEncode (2000 ms)
[ RUN ] E2AP.ControlAcknowledgementDecode
e2ap buffer size: 64
{"ts":1632483759961,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Successfully decoded: RIC Control Ack Message"}
{"ts":1632483759961,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing E2AP Control Response object memory"}
{"ts":1632483759961,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed E2AP Control Response object memory"}
[ OK ] E2AP.ControlAcknowledgementDecode (0 ms)
[ RUN ] E2AP.ControlFailureEncode
<E2AP-PDU>
<unsuccessfulOutcome>
<procedureCode>4</procedureCode>
<criticality><reject/></criticality>
<value>
<RICcontrolFailure>
<protocolIEs>
<RICcontrolFailure-IEs>
<id>29</id>
<criticality><reject/></criticality>
<value>
<RICrequestID>
<ricRequestorID>1</ricRequestorID>
<ricInstanceID>1</ricInstanceID>
</RICrequestID>
</value>
</RICcontrolFailure-IEs>
<RICcontrolFailure-IEs>
<id>5</id>
<criticality><reject/></criticality>
<value>
<RANfunctionID>1</RANfunctionID>
</value>
</RICcontrolFailure-IEs>
<RICcontrolFailure-IEs>
<id>1</id>
<criticality><ignore/></criticality>
<value>
<Cause>
<ricRequest><action-not-supported/></ricRequest>
</Cause>
</value>
</RICcontrolFailure-IEs>
<RICcontrolFailure-IEs>
<id>20</id>
<criticality><reject/></criticality>
<value>
<RICcallProcessID>43 61 6C 6C 50 72 6F 63 65 73 73 49 44</RICcallProcessID>
</value>
</RICcontrolFailure-IEs>
<RICcontrolFailure-IEs>
<id>20</id>
<criticality><reject/></criticality>
<value>
<RICcontrolOutcome>43 6F 6E 74 72 6F 6C 4F 75 74 63 6F 6D 65</RICcontrolOutcome>
</value>
</RICcontrolFailure-IEs>
</protocolIEs>
</RICcontrolFailure>
</value>
</unsuccessfulOutcome>
</E2AP-PDU>
{"ts":1632483761962,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing E2AP Control Response object memory"}
{"ts":1632483761962,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed E2AP Control Response object memory"}
[ OK ] E2AP.ControlFailureEncode (2001 ms)
[ RUN ] E2AP.ControlFailureDecode
e2ap buffer size: 65
{"ts":1632483761962,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Successfully decoded: RIC Control Ack Message"}
{"ts":1632483761962,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing E2AP Control Response object memory"}
{"ts":1632483761962,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed E2AP Control Response object memory"}
[ OK ] E2AP.ControlFailureDecode (0 ms)
[ RUN ] E2AP.SubscriptionDeleteRequest
<E2AP-PDU>
<initiatingMessage>
<procedureCode>9</procedureCode>
<criticality><reject/></criticality>
<value>
<RICsubscriptionDeleteRequest>
<protocolIEs>
<RICsubscriptionDeleteRequest-IEs>
<id>29</id>
<criticality><reject/></criticality>
<value>
<RICrequestID>
<ricRequestorID>3</ricRequestorID>
<ricInstanceID>1</ricInstanceID>
</RICrequestID>
</value>
</RICsubscriptionDeleteRequest-IEs>
<RICsubscriptionDeleteRequest-IEs>
<id>5</id>
<criticality><reject/></criticality>
<value>
<RANfunctionID>1</RANfunctionID>
</value>
</RICsubscriptionDeleteRequest-IEs>
</protocolIEs>
</RICsubscriptionDeleteRequest>
</value>
</initiatingMessage>
</E2AP-PDU>
{"ts":1632483761962,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object memory"}
{"ts":1632483761962,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memory"}
[ OK ] E2AP.SubscriptionDeleteRequest (0 ms)
[ RUN ] E2AP.SubDelResponseEncode
<E2AP-PDU>
<successfulOutcome>
<procedureCode>9</procedureCode>
<criticality><reject/></criticality>
<value>
<RICsubscriptionDeleteResponse>
<protocolIEs>
<RICsubscriptionDeleteResponse-IEs>
<id>29</id>
<criticality><reject/></criticality>
<value>
<RICrequestID>
<ricRequestorID>1</ricRequestorID>
<ricInstanceID>1</ricInstanceID>
</RICrequestID>
</value>
</RICsubscriptionDeleteResponse-IEs>
<RICsubscriptionDeleteResponse-IEs>
<id>5</id>
<criticality><reject/></criticality>
<value>
<RANfunctionID>1</RANfunctionID>
</value>
</RICsubscriptionDeleteResponse-IEs>
</protocolIEs>
</RICsubscriptionDeleteResponse>
</value>
</successfulOutcome>
</E2AP-PDU>
{"ts":1632483763963,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object memory"}
{"ts":1632483763963,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memory"}
[ OK ] E2AP.SubDelResponseEncode (2001 ms)
[ RUN ] E2AP.SubDelResponseDecode
e2ap buffer size: 22
{"ts":1632483773964,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Successfully decoded: RIC Subscription Delete Response"}
{"ts":1632483773964,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object memory"}
{"ts":1632483773964,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memory"}
[ OK ] E2AP.SubDelResponseDecode (10001 ms)
[ RUN ] E2AP.SubDelFailureEncode
<E2AP-PDU>
<unsuccessfulOutcome>
<procedureCode>9</procedureCode>
<criticality><reject/></criticality>
<value>
<RICsubscriptionDeleteFailure>
<protocolIEs>
<RICsubscriptionDeleteFailure-IEs>
<id>29</id>
<criticality><reject/></criticality>
<value>
<RICrequestID>
<ricRequestorID>102</ricRequestorID>
<ricInstanceID>101</ricInstanceID>
</RICrequestID>
</value>
</RICsubscriptionDeleteFailure-IEs>
<RICsubscriptionDeleteFailure-IEs>
<id>5</id>
<criticality><reject/></criticality>
<value>
<RANfunctionID>1</RANfunctionID>
</value>
</RICsubscriptionDeleteFailure-IEs>
<RICsubscriptionDeleteFailure-IEs>
<id>1</id>
<criticality><ignore/></criticality>
<value>
<Cause>
<ricRequest><excessive-actions/></ricRequest>
</Cause>
</value>
</RICsubscriptionDeleteFailure-IEs>
<RICsubscriptionDeleteFailure-IEs>
<id>2</id>
<criticality><ignore/></criticality>
<value>
<CriticalityDiagnostics>
<procedureCode>10</procedureCode>
<triggeringMessage><successful-outcome/></triggeringMessage>
<procedureCriticality><reject/></procedureCriticality>
<ricRequestorID>
<ricRequestorID>0</ricRequestorID>
<ricInstanceID>0</ricInstanceID>
</ricRequestorID>
<iEsCriticalityDiagnostics>
<CriticalityDiagnostics-IE-Item>
<iECriticality><notify/></iECriticality>
<iE-ID>1</iE-ID>
<typeOfError><missing/></typeOfError>
</CriticalityDiagnostics-IE-Item>
<CriticalityDiagnostics-IE-Item>
<iECriticality><ignore/></iECriticality>
<iE-ID>1</iE-ID>
<typeOfError><missing/></typeOfError>
</CriticalityDiagnostics-IE-Item>
</iEsCriticalityDiagnostics>
</CriticalityDiagnostics>
</value>
</RICsubscriptionDeleteFailure-IEs>
</protocolIEs>
</RICsubscriptionDeleteFailure>
</value>
</unsuccessfulOutcome>
</E2AP-PDU>
{"ts":1632483775969,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object memory"}
{"ts":1632483775969,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memory"}
[ OK ] E2AP.SubDelFailureEncode (2005 ms)
[ RUN ] E2AP.SubDelFailureDecode
e2ap buffer size: 47
{"ts":1632483785970,"crit":"INFO","id":"hw_unit_tests","mdc":{},"msg":"Unsuccessfully decoded: RIC Subscription Delete Failure"}
Procedure Code: 10
Procedure Criticality: 0
Size OF LIST :2
Typ Error:::1
iEcriticality:::2
ieID:::1
Typ Error:::1
iEcriticality:::1
ieID:::1
{"ts":1632483785970,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freeing subscription delete request object memory"}
{"ts":1632483785970,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed subscription delete request object memory"}
[ OK ] E2AP.SubDelFailureDecode (10001 ms)
[ RUN ] E2AP.SubResponseEncode
<E2AP-PDU>
<successfulOutcome>
<procedureCode>8</procedureCode>
<criticality><reject/></criticality>
<value>
<RICsubscriptionResponse>
<protocolIEs>
<RICsubscriptionResponse-IEs>
<id>29</id>
<criticality><reject/></criticality>
<value>
<RICrequestID>
<ricRequestorID>1</ricRequestorID>
<ricInstanceID>1</ricInstanceID>
</RICrequestID>
</value>
</RICsubscriptionResponse-IEs>
<RICsubscriptionResponse-IEs>
<id>5</id>
<criticality><reject/></criticality>
<value>
<RANfunctionID>1</RANfunctionID>
</value>
</RICsubscriptionResponse-IEs>
<RICsubscriptionResponse-IEs>
<id>17</id>
<criticality><reject/></criticality>
<value>
<RICaction-Admitted-List>
<ProtocolIE-SingleContainer>
<id>14</id>
<criticality><ignore/></criticality>
<value>
<RICaction-Admitted-Item>
<ricActionID>1</ricActionID>
</RICaction-Admitted-Item>
</value>
</ProtocolIE-SingleContainer>
<ProtocolIE-SingleContainer>
<id>14</id>
<criticality><ignore/></criticality>
<value>
<RICaction-Admitted-Item>
<ricActionID>2</ricActionID>
</RICaction-Admitted-Item>
</value>
</ProtocolIE-SingleContainer>
</RICaction-Admitted-List>
</value>
</RICsubscriptionResponse-IEs>
<RICsubscriptionResponse-IEs>
<id>18</id>
<criticality><reject/></criticality>
<value>
<RICaction-NotAdmitted-List>
<ProtocolIE-SingleContainer>
<id>16</id>
<criticality><ignore/></criticality>
<value>
<RICaction-NotAdmitted-Item>
<ricActionID>2</ricActionID>
<cause>
<ricRequest><duplicate-action/></ricRequest>
</cause>
</RICaction-NotAdmitted-Item>
</value>
</ProtocolIE-SingleContainer>
<ProtocolIE-SingleContainer>
<id>16</id>
<criticality><ignore/></criticality>
<value>
<RICaction-NotAdmitted-Item>
<ricActionID>2</ricActionID>
<cause>
<ricRequest><action-not-supported/></ricRequest>
</cause>
</RICaction-NotAdmitted-Item>
</value>
</ProtocolIE-SingleContainer>
</RICaction-NotAdmitted-List>
</value>
</RICsubscriptionResponse-IEs>
</protocolIEs>
</RICsubscriptionResponse>
</value>
</successfulOutcome>
</E2AP-PDU>
{"ts":1632483785971,"crit":"DEBUG","id":"hw_unit_tests","mdc":{},"msg":"Freed Subscription Response Object memory"}
[ OK ] E2AP.SubResponseEncode (1 ms)
[ RUN ] E2AP.SubResponseDecode
1632483788 8/RMR [INFO] sends: ts=1632483788 src=ric:38000 target=service-ricplt-e2term-rmr-alpha.ricplt:38000 open=0 succ=0 fail=0 (hard=0 soft=0)
1632483788 8/RMR [INFO] sends: ts=1632483788 src=ric:38000 target=service-ricplt-a1mediator-rmr.ricplt:4562 open=0 succ=0 fail=0 (hard=0 soft=0)
```
---
### <center>References</center>
---
:::info
[1]. [O-RAN HW xApp Demo Bronze Release](https://wiki.o-ran-sc.org/download/attachments/20873608/%20it-ricdemo-20200423.mp4?version=1&modificationDate=1588303633035&api=v2)
[2]. [O-RAN.WG3.E2AP-v01.01](https://drive.google.com/file/d/1MvrXtRW4wMlB44VmXKQQPvJYwSv-hIYc/view?usp=sharing)