2 ==================================================================================
3 Copyright (c) 2019 AT&T Intellectual Property.
4 Copyright (c) 2019 Nokia
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 See the License for the specific language governing permissions and
16 limitations under the License.
19 This source code is part of the near-RT RIC (RAN Intelligent Controller)
20 platform project (RICP).
22 ==================================================================================
25 Mnemonic: httprestful_test.go
26 Abstract: HTTPRestful unit tests
40 "routing-manager/pkg/models"
41 "routing-manager/pkg/rpe"
42 "routing-manager/pkg/rtmgr"
43 "routing-manager/pkg/sdl"
44 "routing-manager/pkg/stub"
48 "github.com/go-openapi/swag"
51 var BasicXAppLists = []byte(`[
53 "name":"xapp-01","status":"unknown","version":"1.2.3",
55 {"name":"xapp-01-instance-01","status":"pending","ip":"172.16.1.103","port":4555,
56 "txMessages":["ControlIndication"],
57 "rxMessages":["LoadIndication","Reset"]
59 {"name":"xapp-01-instance-02","status":"pending","ip":"10.244.1.12","port":4561,
60 "txMessages":["ControlIndication","SNStatusTransfer"],
61 "rxMessages":["LoadIndication","HandoverPreparation"]
67 var SubscriptionResp = []byte(`{"ID":"deadbeef1234567890", "Version":0, "EventType":"all"}`)
69 var InvalidSubResp = []byte(`{"Version":0, "EventType":all}`)
71 func TestValidateXappCallbackData_1(t *testing.T) {
72 data := models.XappCallbackData{
73 XApps: *swag.String("[]"),
74 Version: *swag.Int64(1),
75 Event: *swag.String("someevent"),
76 ID: *swag.String("123456")}
78 err := validateXappCallbackData(&data)
80 t.Error("Invalid XApp callback data: " + err.Error())
84 func TestValidateXappSubscriptionsData(t *testing.T) {
86 ep := make(map[string]*rtmgr.Endpoint)
87 ep["dummy"] = &rtmgr.Endpoint{Uuid: "10.0.0.1:0", Name: "E2TERM", XAppType: "app1", Ip: "", Port: 0, TxMessages: []string{"", ""}, RxMessages: []string{"", ""}, Socket: nil, IsReady: true, Keepalive: true}
89 data := models.XappSubscriptionData{
90 Address: swag.String("10.1.1.1"),
92 SubscriptionID: swag.Int32(123456)}
95 err = validateXappSubscriptionData(&data)
100 data1 := models.XappSubscriptionData{
101 Address: swag.String(""),
103 SubscriptionID: swag.Int32(123456)}
104 err = validateXappSubscriptionData(&data1)
108 data2 := models.E2tData{
109 E2TAddress: swag.String(""),
111 /*err = validateE2tData(&data2)*/
113 e2tchannel := make(chan *models.E2tData, 10)
114 _ = createNewE2tHandleHandlerImpl(e2tchannel, &data2)
115 defer close(e2tchannel)
117 //test case for provideXappSubscriptionHandleImp
118 datachannel := make(chan *models.XappSubscriptionData, 10)
119 _ = provideXappSubscriptionHandleImpl(datachannel, &data1)
120 defer close(datachannel)
122 //test case for deleteXappSubscriptionHandleImpl
123 _ = deleteXappSubscriptionHandleImpl(datachannel, &data1)
125 data3 := models.XappSubscriptionData{
126 Address: swag.String("10.55.55.5"),
128 SubscriptionID: swag.Int32(123456)}
129 //test case for deleteXappSubscriptionHandleImpl
130 _ = deleteXappSubscriptionHandleImpl(datachannel, &data3)
133 func TestValidateE2tDataEmpty(t *testing.T) {
134 data := models.E2tData{
135 E2TAddress: swag.String(""),
137 err := validateE2tData(&data)
141 func TestValidateE2tDataInvalid(t *testing.T) {
142 data := models.E2tData{
143 E2TAddress: swag.String("10.101.01.1"),
145 err := validateE2tData(&data)
149 func TestValidateE2tDatavalid(t *testing.T) {
150 data := models.E2tData{
151 E2TAddress: swag.String("10.101.01.1:8098"),
155 err := validateE2tData(&data)
160 func TestValidateE2tDatavalidEndpointPresent(t *testing.T) {
161 data := models.E2tData{
162 E2TAddress: swag.String("10.101.01.1:8098"),
165 // insert endpoint for testing purpose
166 uuid := "10.101.01.1:8098"
167 ep := &rtmgr.Endpoint{
172 err := validateE2tData(&data)
175 // delete endpoint for at end of test case
176 delete(rtmgr.Eps, uuid);
181 func TestValidateDeleteE2tData(t *testing.T) {
184 data := models.E2tDeleteData{
185 E2TAddress: swag.String(""),
188 err := validateDeleteE2tData(&data)
189 if (err.Error() != "E2TAddress is empty!!!") {
195 data = models.E2tDeleteData{
196 E2TAddress: swag.String("10.101.01.1:8098"),
199 err = validateDeleteE2tData(&data)
205 //################ Create End Point dummy entry
206 uuid := "10.101.01.1:8098"
207 ep := &rtmgr.Endpoint{
211 //#####################
213 data = models.E2tDeleteData{
214 E2TAddress: swag.String("10.101.01.1:8098"),
215 RanAssocList: models.RanE2tMap{
216 {E2TAddress: swag.String("10.101.01.1:8098")},
220 err = validateDeleteE2tData(&data)
225 // delete endpoint for at end of test case
226 //################ Delete End Point dummy entry
227 delete(rtmgr.Eps, uuid);
228 //#####################
232 //################ Create End Point dummy entry
233 uuid = "10.101.01.1:9991"
234 ep = &rtmgr.Endpoint{
239 uuid = "10.101.01.1:9992"
240 ep = &rtmgr.Endpoint{
244 //#####################
246 data = models.E2tDeleteData{
247 E2TAddress: swag.String("10.101.01:8098"),
248 RanAssocList: models.RanE2tMap{
249 {E2TAddress: swag.String("10.101.01.1:9991")},
250 {E2TAddress: swag.String("10.101.01.1:9992")},
254 err = validateDeleteE2tData(&data)
258 //################ Delete End Point dummy entry
259 delete(rtmgr.Eps, "10.101.01.1:9991")
260 delete(rtmgr.Eps, "10.101.01.1:9992")
261 //#####################
265 data = models.E2tDeleteData{
266 E2TAddress: swag.String("10.101.01:8098"),
267 RanAssocList: models.RanE2tMap{
268 {E2TAddress: swag.String("10.101.01.19991")},
272 err = validateDeleteE2tData(&data)
273 if ( err.Error() != "E2T Delete - RanAssocList E2TAddress is not a proper format like ip:port, 10.101.01.19991") {
279 func TestValidateE2TAddressRANListData(t *testing.T) {
281 data := models.RanE2tMap{
283 E2TAddress: swag.String(""),
286 err := validateE2TAddressRANListData(data)
291 data = models.RanE2tMap{
293 E2TAddress: swag.String("10.101.01.1:8098"),
296 err = validateE2TAddressRANListData(data)
303 func TestAssociateRanToE2THandlerImpl(t *testing.T) {
305 associateranchan := make(chan models.RanE2tMap, 10)
306 data := models.RanE2tMap{
308 E2TAddress: swag.String("10.101.01.1:8098"),
311 err := associateRanToE2THandlerImpl(associateranchan, data)
316 //################ Create End Point dummy entry
317 uuid := "10.101.01.1:8098"
318 ep := &rtmgr.Endpoint{
322 //#####################
324 data = models.RanE2tMap{
326 E2TAddress: swag.String("10.101.01.1:8098"),
329 err = associateRanToE2THandlerImpl(associateranchan, data)
333 data1 := <-associateranchan
336 //################ Delete End Point dummy entry
337 delete(rtmgr.Eps, uuid);
338 //#####################
341 func TestDisassociateRanToE2THandlerImpl(t *testing.T) {
343 disassranchan := make(chan models.RanE2tMap, 10)
345 data := models.RanE2tMap{
347 E2TAddress: swag.String("10.101.01.1:8098"),
350 err := disassociateRanToE2THandlerImpl(disassranchan, data)
354 //################ Create End Point dummy entry
355 uuid := "10.101.01.1:8098"
356 ep := &rtmgr.Endpoint{
360 //#####################
362 data = models.RanE2tMap{
364 E2TAddress: swag.String("10.101.01.1:8098"),
367 err = disassociateRanToE2THandlerImpl(disassranchan, data)
371 data1 := <-disassranchan
374 //################ Delete End Point dummy entry
375 delete(rtmgr.Eps, uuid);
376 //#####################
379 func TestDeleteE2tHandleHandlerImpl(t *testing.T) {
381 e2tdelchan := make(chan *models.E2tDeleteData, 10)
382 data := models.E2tDeleteData{
383 E2TAddress: swag.String(""),
385 err := deleteE2tHandleHandlerImpl(e2tdelchan, &data)
390 //################ Create End Point dummy entry
391 uuid := "10.101.01.1:8098"
392 ep := &rtmgr.Endpoint{
396 //#####################
398 data = models.E2tDeleteData{
399 E2TAddress: swag.String("10.101.01.1:8098"),
401 err = deleteE2tHandleHandlerImpl(e2tdelchan, &data)
405 data1 := <-e2tdelchan
408 //################ Delete End Point dummy entry
409 delete(rtmgr.Eps, uuid);
410 //#####################
413 func TestSubscriptionExists(t *testing.T) {
415 data := models.XappSubscriptionData{
416 Address: swag.String("10.0.0.0"),
418 SubscriptionID: swag.Int32(1234)}
420 rtmgr.Subs = *stub.ValidSubscriptions
422 yes_no := subscriptionExists(&data)
423 yes_no = addSubscription(&rtmgr.Subs, &data)
424 yes_no = addSubscription(&rtmgr.Subs, &data)
425 yes_no = delSubscription(&rtmgr.Subs, &data)
426 yes_no = delSubscription(&rtmgr.Subs, &data)
430 func TestAddSubscriptions(t *testing.T) {
432 subdata := models.XappSubscriptionData{
433 Address: swag.String("10.0.0.0"),
435 SubscriptionID: swag.Int32(1234)}
437 rtmgr.Subs = *stub.ValidSubscriptions
438 yes_no := addSubscription(&rtmgr.Subs, &subdata)
442 func TestHttpInstance(t *testing.T) {
443 sdlEngine, _ := sdl.GetSdl("file")
444 rpeEngine, _ := rpe.GetRpe("rmrpush")
445 httpinstance := NewHttpRestful()
446 err := httpinstance.Terminate()
449 triggerSBI := make(chan bool)
450 createMockPlatformComponents()
451 //ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, nil)
455 err = httpinstance.Initialize(XMURL, "httpgetter", "rt.json", "config.json", sdlEngine, rpeEngine, triggerSBI, &m)
458 func TestXappCallbackDataChannelwithdata(t *testing.T) {
459 data := models.XappCallbackData{
460 XApps: *swag.String("[]"),
461 Version: *swag.Int64(1),
462 Event: *swag.String("someevent"),
463 ID: *swag.String("123456")}
464 datach := make(chan *models.XappCallbackData, 1)
465 go func() { _, _ = recvXappCallbackData(datach) }()
469 func TestXappCallbackDataChannelNodata(t *testing.T) {
470 datach := make(chan *models.XappCallbackData, 1)
471 go func() { _, _ = recvXappCallbackData(datach) }()
475 func TestE2TChannelwithData(t *testing.T) {
476 data2 := models.E2tData{
477 E2TAddress: swag.String(""),
479 dataChannel := make(chan *models.E2tData, 10)
480 go func() { _, _ = recvNewE2Tdata(dataChannel) }()
481 defer close(dataChannel)
482 dataChannel <- &data2
485 func TestE2TChannelwithNoData(t *testing.T) {
486 dataChannel := make(chan *models.E2tData, 10)
487 go func() { _, _ = recvNewE2Tdata(dataChannel) }()
488 defer close(dataChannel)
491 func TestProvideXappSubscriptionHandleImpl(t *testing.T) {
493 data := models.XappSubscriptionData{
494 Address: swag.String("10.0.0.0"),
496 SubscriptionID: swag.Int32(1234)}
497 datachannel := make(chan *models.XappSubscriptionData, 10)
498 go func() { _ = provideXappSubscriptionHandleImpl(datachannel, &data) }()
499 defer close(datachannel)
505 func createMockAppmgrWithData(url string, g []byte, p []byte) *httptest.Server {
506 l, err := net.Listen("tcp", url)
508 fmt.Println("Failed to create listener: " + err.Error())
510 ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
511 if r.Method == "GET" && r.URL.String() == "/ric/v1/xapps" {
512 w.Header().Add("Content-Type", "application/json")
513 w.WriteHeader(http.StatusOK)
516 if r.Method == "POST" && r.URL.String() == "/ric/v1/subscriptions" {
517 w.Header().Add("Content-Type", "application/json")
518 w.WriteHeader(http.StatusCreated)
528 func createMockPlatformComponents() {
529 var filename = "config.json"
530 file, _ := json.MarshalIndent(stub.ValidPlatformComponents, "", "")
531 filestr := string(file)
532 filestr = "{\"PlatformComponents\":" + filestr + "}"
533 file = []byte(filestr)
534 _ = ioutil.WriteFile(filename, file, 644)
537 func TestRecvXappCallbackData(t *testing.T) {
538 data := models.XappCallbackData{
539 XApps: *swag.String("[]"),
540 Version: *swag.Int64(1),
541 Event: *swag.String("any"),
542 ID: *swag.String("123456"),
545 ch := make(chan *models.XappCallbackData)
547 httpRestful := NewHttpRestful()
548 go func() { ch <- &data }()
549 time.Sleep(1 * time.Second)
550 t.Log(string(len(ch)))
551 xappList, err := httpRestful.RecvXappCallbackData(ch)
553 t.Error("Receive failed: " + err.Error())
556 t.Error("Expected an XApp notification list")
563 func TestProvideXappHandleHandlerImpl(t *testing.T) {
564 datach := make(chan *models.XappCallbackData, 10)
566 data := models.XappCallbackData{
567 XApps: *swag.String("[]"),
568 Version: *swag.Int64(1),
569 Event: *swag.String("someevent"),
570 ID: *swag.String("123456")}
571 var httpRestful, _ = GetNbi("httpRESTful")
572 err := httpRestful.(*HttpRestful).ProvideXappHandleHandlerImpl(datach, &data)
574 t.Error("Error occured: " + err.Error())
578 t.Error("Something gone wrong: " + err.Error())
581 t.Error("Malformed data on channel")
587 func TestValidateXappCallbackData(t *testing.T) {
588 data := models.XappCallbackData{
589 XApps: *swag.String("[]"),
590 Version: *swag.Int64(1),
591 Event: *swag.String("someevent"),
592 ID: *swag.String("123456")}
594 err := validateXappCallbackData(&data)
596 t.Error("Invalid XApp callback data: " + err.Error())
600 func TestValidateXappCallbackDataWithInvalidData(t *testing.T) {
601 data := models.XappCallbackData{
602 XApps: *swag.String("{}"),
603 Version: *swag.Int64(1),
604 Event: *swag.String("someevent"),
605 ID: *swag.String("123456")}
607 err := validateXappCallbackData(&data)
609 t.Error("Invalid XApp callback data: " + err.Error())
613 func TestHttpGetXAppsInvalidData(t *testing.T) {
614 _, err := httpGetXApps(XMURL)
616 t.Error("No XApp data received: " + err.Error())
620 func TestHttpGetXAppsWithValidData(t *testing.T) {
622 ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, nil)
626 xapplist, err := httpGetXApps(XMURL)
628 t.Error("Error occured: " + err.Error())
630 if len(*xapplist) != expected {
631 t.Error("Invalid XApp data: got " + string(len(*xapplist)) + ", expected " + string(expected))
635 func TestRetrieveStartupDataTimeout(t *testing.T) {
636 sdlEngine, _ := sdl.GetSdl("file")
637 createMockPlatformComponents()
638 err := retrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", sdlEngine)
640 t.Error("Cannot retrieve startup data: " + err.Error())
643 os.Remove("config.json")
646 func TestRetrieveStartupData(t *testing.T) {
647 ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, SubscriptionResp)
650 sdlEngine, _ := sdl.GetSdl("file")
651 var httpRestful, _ = GetNbi("httpRESTful")
652 createMockPlatformComponents()
653 err := httpRestful.(*HttpRestful).RetrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", sdlEngine)
654 //err := retrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", sdlEngine)
656 t.Error("Cannot retrieve startup data: " + err.Error())
659 os.Remove("config.json")
662 func TestRetrieveStartupDataWithInvalidSubResp(t *testing.T) {
663 ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, InvalidSubResp)
666 sdlEngine, _ := sdl.GetSdl("file")
667 var httpRestful, _ = GetNbi("httpRESTful")
668 createMockPlatformComponents()
669 err := httpRestful.(*HttpRestful).RetrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", sdlEngine)
671 t.Error("Cannot retrieve startup data: " + err.Error())
674 os.Remove("config.json")