1 /*******************************************************************************
3 * Copyright (c) 2019 AT&T Intellectual Property.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 *******************************************************************************/
20 * This source code is part of the near-RT RIC (RAN Intelligent Controller)
21 * platform project (RICP).
35 * Unpack a response returned from RAN.
36 * Verify it matches the want pdu.
39 func TestResourceStatusResponseConverter(t *testing.T) {
40 logger, _ := logger.InitLogger(logger.DebugLevel)
41 unpacker := NewX2apPduUnpacker(logger, e2pdus.MaxAsn1CodecMessageBufferSize)
42 rsConverters := NewResourceStatusResponseConverter(unpacker)
44 var testCases = []struct {
49 response: "ENB1_Measurement_ID: 15, ENB2_Measurement_ID: 13, MeasurementInitiationResults:[ CellId: 02f829:0007ab50, MeasurementFailureCauses: [ ] ]",
51 SuccessfulOutcome ::= {
53 criticality: 0 (reject)
54 value: ResourceStatusResponse ::= {
55 protocolIEs: ProtocolIE-Container ::= {
56 ResourceStatusResponse-IEs ::= {
58 criticality: 0 (reject)
61 ResourceStatusResponse-IEs ::= {
63 criticality: 0 (reject)
66 ResourceStatusResponse-IEs ::= {
68 criticality: 1 (ignore)
69 value: MeasurementInitiationResult-List ::= {
70 ProtocolIE-Single-Container ::= {
72 criticality: 1 (ignore)
73 value: MeasurementInitiationResult-Item ::= {
75 pLMN-Identity: 02 F8 29
76 eUTRANcellIdentifier: 00 07 AB 50 (4 bits unused)
87 packedPdu: "200900220000030027000300000e0028000300000c0041400d00004240080002f8290007ab50",
89 {response: "ENB1_Measurement_ID: 1, ENB2_Measurement_ID: 75, MeasurementInitiationResults:[ CellId: 133023:02b030a0, MeasurementFailureCauses: [ MeasurementFailedReportCharacteristics: 02000000 MeasurementFailedReportCharacteristics: 04000000 MeasurementFailedReportCharacteristics: 08000000 MeasurementFailedReportCharacteristics: 20000000 MeasurementFailedReportCharacteristics: 40000000 MeasurementFailedReportCharacteristics: 80000000 ] ]",
91 SuccessfulOutcome ::= {
93 criticality: 0 (reject)
94 value: ResourceStatusResponse ::= {
95 protocolIEs: ProtocolIE-Container ::= {
96 ResourceStatusResponse-IEs ::= {
98 criticality: 0 (reject)
101 ResourceStatusResponse-IEs ::= {
103 criticality: 0 (reject)
106 ResourceStatusResponse-IEs ::= {
108 criticality: 1 (ignore)
109 value: MeasurementInitiationResult-List ::= {
110 ProtocolIE-Single-Container ::= {
112 criticality: 1 (ignore)
113 value: MeasurementInitiationResult-Item ::= {
115 pLMN-Identity: 13 30 23
116 eUTRANcellIdentifier: 02 B0 30 A0 (4 bits unused)
118 measurementFailureCause-List: MeasurementFailureCause-List ::= {
119 ProtocolIE-Single-Container ::= {
121 criticality: 1 (ignore)
122 value: MeasurementFailureCause-Item ::= {
123 measurementFailedReportCharacteristics: 02 00 00 00
124 cause: 20 (measurement-temporarily-not-available)
127 ProtocolIE-Single-Container ::= {
129 criticality: 1 (ignore)
130 value: MeasurementFailureCause-Item ::= {
131 measurementFailedReportCharacteristics: 04 00 00 00
132 cause: 20 (measurement-temporarily-not-available)
135 ProtocolIE-Single-Container ::= {
137 criticality: 1 (ignore)
138 value: MeasurementFailureCause-Item ::= {
139 measurementFailedReportCharacteristics: 08 00 00 00
140 cause: 20 (measurement-temporarily-not-available)
143 ProtocolIE-Single-Container ::= {
145 criticality: 1 (ignore)
146 value: MeasurementFailureCause-Item ::= {
147 measurementFailedReportCharacteristics: 20 00 00 00
148 cause: 20 (measurement-temporarily-not-available)
151 ProtocolIE-Single-Container ::= {
153 criticality: 1 (ignore)
154 value: MeasurementFailureCause-Item ::= {
155 measurementFailedReportCharacteristics: 40 00 00 00
156 cause: 20 (measurement-temporarily-not-available)
159 ProtocolIE-Single-Container ::= {
161 criticality: 1 (ignore)
162 value: MeasurementFailureCause-Item ::= {
163 measurementFailedReportCharacteristics: 80 00 00 00
164 cause: 20 (measurement-temporarily-not-available)
176 packedPdu: "20090065000003002700030000000028000300004a00414050000042404b4013302302b030a2800043400700020000000a000043400700040000000a000043400700080000000a000043400700200000000a000043400700400000000a000043400700800000000a00"},
179 for _, tc := range testCases {
180 t.Run(tc.packedPdu, func(t *testing.T) {
183 _, err := fmt.Sscanf(tc.packedPdu, "%x", &payload)
185 t.Errorf("convert inputPayloadAsStr to payloadAsByte. Error: %v\n", err)
188 response, err := rsConverters.Convert(payload)
190 t.Errorf("want: success, got: unpack failed. Error: %v\n", err)
193 got := response.String()
194 if len(tc.response) != len(got) {
195 t.Errorf("\nwant :\t[%s]\n got: \t\t[%s]\n", tc.response, response)
197 if strings.Compare(tc.response, got) != 0 {
198 t.Errorf("\nwant :\t[%s]\n got: \t\t[%s]\n", tc.response, got)
206 func TestResourceStatusResponseConverterError(t *testing.T) {
207 logger, _ := logger.InitLogger(logger.InfoLevel)
208 unpacker := NewX2apPduUnpacker(logger, e2pdus.MaxAsn1CodecMessageBufferSize)
209 rsConverters := NewResourceStatusResponseConverter(unpacker)
211 wantError := "unpacking error: #src/asn1codec_utils.c.unpack_pdu_aux - Failed to decode E2AP-PDU (consumed 0), error = 0 Success"
212 //--------------------2006002a
213 inputPayloadAsStr := "2006002b000002001500080002f82900007a8000140017000000630002f8290007ab50102002f829000001000133"
215 _, err := fmt.Sscanf(inputPayloadAsStr, "%x", &payload)
217 t.Errorf("convert inputPayloadAsStr to payloadAsByte. Error: %v\n", err)
220 _, err = rsConverters.Convert(payload)
222 if 0 != strings.Compare(fmt.Sprintf("%s", err), wantError) {
223 t.Errorf("want failure: %s, got: %s", wantError, err)
226 t.Errorf("want failure: %s, got: success", wantError)
231 func TestResourceStatusResponseConverterPduOfFailure(t *testing.T) {
232 logger, _ := logger.InitLogger(logger.InfoLevel)
233 unpacker := NewX2apPduUnpacker(logger, e2pdus.MaxAsn1CodecMessageBufferSize)
234 rsConverters := NewResourceStatusResponseConverter(unpacker)
236 wantError := "unexpected PDU, 3"
237 inputPayloadAsStr := "400900170000030027000300000000280003000049000540020a80"
239 _, err := fmt.Sscanf(inputPayloadAsStr, "%x", &payload)
241 t.Errorf("convert inputPayloadAsStr to payloadAsByte. Error: %v\n", err)
244 _, err = rsConverters.Convert(payload)
246 if 0 != strings.Compare(fmt.Sprintf("%s", err), wantError) {
247 t.Errorf("want failure: %s, got: %s", wantError, err)
250 t.Errorf("want failure: %s, got: success", wantError)
255 func TestResourceStatusResponseConverterWrongPdu(t *testing.T) {
256 logger, _ := logger.InitLogger(logger.InfoLevel)
257 unpacker := NewX2apPduUnpacker(logger, e2pdus.MaxAsn1CodecMessageBufferSize)
258 rsConverters := NewResourceStatusResponseConverter(unpacker)
260 wantError := "unexpected PDU - not a resource status response"
261 inputPayloadAsStr := "2006002a000002001500080002f82900007a8000140017000000630002f8290007ab50102002f829000001000133"
263 _, err := fmt.Sscanf(inputPayloadAsStr, "%x", &payload)
265 t.Errorf("convert inputPayloadAsStr to payloadAsByte. Error: %v\n", err)
268 _, err = rsConverters.Convert(payload)
270 if 0 != strings.Compare(fmt.Sprintf("%s", err), wantError) {
271 t.Errorf("want failure: %s, got: %s", wantError, err)
274 t.Errorf("want failure: %s, got: success", wantError)