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 TestValidateXappCallbackDataInvalid (t *testing.T) {
85 data := models.XappCallbackData{}
86 err := validateXappCallbackData(&data)
91 func TestValidateXappSubscriptionsData(t *testing.T) {
93 ep := make(map[string]*rtmgr.Endpoint)
94 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}
96 data := models.XappSubscriptionData{
97 Address: swag.String("10.1.1.1"),
99 SubscriptionID: swag.Int32(123456)}
102 err = validateXappSubscriptionData(&data)
107 data1 := models.XappSubscriptionData{
108 Address: swag.String(""),
110 SubscriptionID: swag.Int32(123456)}
111 err = validateXappSubscriptionData(&data1)
115 data2 := models.E2tData{
116 E2TAddress: swag.String(""),
118 /*err = validateE2tData(&data2)*/
120 e2tchannel := make(chan *models.E2tData, 10)
121 _ = createNewE2tHandleHandlerImpl(e2tchannel, &data2)
122 defer close(e2tchannel)
124 //test case for provideXappSubscriptionHandleImp
125 datachannel := make(chan *models.XappSubscriptionData, 10)
126 _ = provideXappSubscriptionHandleImpl(datachannel, &data1)
127 defer close(datachannel)
129 //test case for deleteXappSubscriptionHandleImpl
130 _ = deleteXappSubscriptionHandleImpl(datachannel, &data1)
132 data3 := models.XappSubscriptionData{
133 Address: swag.String("10.55.55.5"),
135 SubscriptionID: swag.Int32(123456)}
136 //test case for deleteXappSubscriptionHandleImpl
137 _ = deleteXappSubscriptionHandleImpl(datachannel, &data3)
140 func TestValidateE2tDataEmpty(t *testing.T) {
141 data := models.E2tData{
142 E2TAddress: swag.String(""),
144 err := validateE2tData(&data)
148 func TestValidateE2tDataDNSLookUPfails(t *testing.T) {
149 data := models.E2tData{
150 E2TAddress: swag.String("e2t.1com:1234"),
152 err := validateE2tData(&data)
156 func TestValidateE2tDataInvalid(t *testing.T) {
157 data := models.E2tData{
158 E2TAddress: swag.String("10.101.01.1"),
160 err := validateE2tData(&data)
164 func TestValidateE2tDatavalid(t *testing.T) {
165 data := models.E2tData{
166 E2TAddress: swag.String("10.101.01.1:8098"),
170 err := validateE2tData(&data)
175 func TestValidateE2tDatavalidEndpointPresent(t *testing.T) {
176 data := models.E2tData{
177 E2TAddress: swag.String("10.101.01.1:8098"),
180 // insert endpoint for testing purpose
181 uuid := "10.101.01.1:8098"
182 ep := &rtmgr.Endpoint{
187 err := validateE2tData(&data)
190 // delete endpoint for at end of test case
191 delete(rtmgr.Eps, uuid);
196 func TestValidateDeleteE2tData(t *testing.T) {
199 data := models.E2tDeleteData{
200 E2TAddress: swag.String(""),
203 err := validateDeleteE2tData(&data)
204 if (err.Error() != "E2TAddress is empty!!!") {
210 data = models.E2tDeleteData{
211 E2TAddress: swag.String("10.101.01.1:8098"),
214 err = validateDeleteE2tData(&data)
220 //################ Create End Point dummy entry
221 uuid := "10.101.01.1:8098"
222 ep := &rtmgr.Endpoint{
226 //#####################
228 data = models.E2tDeleteData{
229 E2TAddress: swag.String("10.101.01.1:8098"),
230 RanAssocList: models.RanE2tMap{
231 {E2TAddress: swag.String("10.101.01.1:8098")},
235 err = validateDeleteE2tData(&data)
240 // delete endpoint for at end of test case
241 //################ Delete End Point dummy entry
242 delete(rtmgr.Eps, uuid);
243 //#####################
247 //################ Create End Point dummy entry
248 uuid = "10.101.01.1:9991"
249 ep = &rtmgr.Endpoint{
254 uuid = "10.101.01.1:9992"
255 ep = &rtmgr.Endpoint{
259 //#####################
261 data = models.E2tDeleteData{
262 E2TAddress: swag.String("10.101.01:8098"),
263 RanAssocList: models.RanE2tMap{
264 {E2TAddress: swag.String("10.101.01.1:9991")},
265 {E2TAddress: swag.String("10.101.01.1:9992")},
269 err = validateDeleteE2tData(&data)
273 //################ Delete End Point dummy entry
274 delete(rtmgr.Eps, "10.101.01.1:9991")
275 delete(rtmgr.Eps, "10.101.01.1:9992")
276 //#####################
280 data = models.E2tDeleteData{
281 E2TAddress: swag.String("10.101.01:8098"),
282 RanAssocList: models.RanE2tMap{
283 {E2TAddress: swag.String("10.101.01.19991")},
287 err = validateDeleteE2tData(&data)
288 if ( err.Error() != "E2T Delete - RanAssocList E2TAddress is not a proper format like ip:port, 10.101.01.19991") {
294 func TestValidateE2TAddressRANListData(t *testing.T) {
296 data := models.RanE2tMap{
298 E2TAddress: swag.String(""),
301 err := validateE2TAddressRANListData(data)
306 data = models.RanE2tMap{
308 E2TAddress: swag.String("10.101.01.1:8098"),
311 err = validateE2TAddressRANListData(data)
318 func TestAssociateRanToE2THandlerImpl(t *testing.T) {
320 associateranchan := make(chan models.RanE2tMap, 10)
321 data := models.RanE2tMap{
323 E2TAddress: swag.String("10.101.01.1:8098"),
326 err := associateRanToE2THandlerImpl(associateranchan, data)
331 //################ Create End Point dummy entry
332 uuid := "10.101.01.1:8098"
333 ep := &rtmgr.Endpoint{
337 //#####################
339 data = models.RanE2tMap{
341 E2TAddress: swag.String("10.101.01.1:8098"),
344 err = associateRanToE2THandlerImpl(associateranchan, data)
348 data1 := <-associateranchan
351 //################ Delete End Point dummy entry
352 delete(rtmgr.Eps, uuid);
353 //#####################
356 func TestDisassociateRanToE2THandlerImpl(t *testing.T) {
358 disassranchan := make(chan models.RanE2tMap, 10)
360 data := models.RanE2tMap{
362 E2TAddress: swag.String("10.101.01.1:8098"),
365 err := disassociateRanToE2THandlerImpl(disassranchan, data)
369 //################ Create End Point dummy entry
370 uuid := "10.101.01.1:8098"
371 ep := &rtmgr.Endpoint{
375 //#####################
377 data = models.RanE2tMap{
379 E2TAddress: swag.String("10.101.01.1:8098"),
382 err = disassociateRanToE2THandlerImpl(disassranchan, data)
386 data1 := <-disassranchan
389 //################ Delete End Point dummy entry
390 delete(rtmgr.Eps, uuid);
391 //#####################
394 func TestDeleteE2tHandleHandlerImpl(t *testing.T) {
396 e2tdelchan := make(chan *models.E2tDeleteData, 10)
397 data := models.E2tDeleteData{
398 E2TAddress: swag.String(""),
400 err := deleteE2tHandleHandlerImpl(e2tdelchan, &data)
405 //################ Create End Point dummy entry
406 uuid := "10.101.01.1:8098"
407 ep := &rtmgr.Endpoint{
411 //#####################
413 data = models.E2tDeleteData{
414 E2TAddress: swag.String("10.101.01.1:8098"),
416 err = deleteE2tHandleHandlerImpl(e2tdelchan, &data)
420 data1 := <-e2tdelchan
423 //################ Delete End Point dummy entry
424 delete(rtmgr.Eps, uuid);
425 //#####################
428 func TestSubscriptionExists(t *testing.T) {
430 data := models.XappSubscriptionData{
431 Address: swag.String("10.0.0.0"),
433 SubscriptionID: swag.Int32(1234)}
435 rtmgr.Subs = *stub.ValidSubscriptions
437 yes_no := subscriptionExists(&data)
438 yes_no = addSubscription(&rtmgr.Subs, &data)
439 yes_no = addSubscription(&rtmgr.Subs, &data)
440 yes_no = delSubscription(&rtmgr.Subs, &data)
441 yes_no = delSubscription(&rtmgr.Subs, &data)
445 func TestAddSubscriptions(t *testing.T) {
447 subdata := models.XappSubscriptionData{
448 Address: swag.String("10.0.0.0"),
450 SubscriptionID: swag.Int32(1234)}
452 rtmgr.Subs = *stub.ValidSubscriptions
453 yes_no := addSubscription(&rtmgr.Subs, &subdata)
458 func TestHttpInstance(t *testing.T) {
459 sdlEngine, _ := sdl.GetSdl("file")
460 rpeEngine, _ := rpe.GetRpe("rmrpush")
461 httpinstance := NewHttpRestful()
462 err := httpinstance.Terminate()
465 triggerSBI := make(chan bool)
466 createMockPlatformComponents()
467 //ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, nil)
471 err = httpinstance.Initialize(XMURL, "httpgetter", "rt.json", "config.json", sdlEngine, rpeEngine, triggerSBI, &m)
474 func TestXappCallbackDataChannelwithdata(t *testing.T) {
475 data := models.XappCallbackData{
476 XApps: *swag.String("[]"),
477 Version: *swag.Int64(1),
478 Event: *swag.String("someevent"),
479 ID: *swag.String("123456")}
480 datach := make(chan *models.XappCallbackData, 1)
481 go func() { _, _ = recvXappCallbackData(datach) }()
485 func TestXappCallbackDataChannelNodata(t *testing.T) {
486 datach := make(chan *models.XappCallbackData, 1)
487 go func() { _, _ = recvXappCallbackData(datach) }()
491 func TestE2TChannelwithData(t *testing.T) {
492 data2 := models.E2tData{
493 E2TAddress: swag.String("1.2.3.4"),
494 RanNamelist: []string{"ran1","ran2"},
496 dataChannel := make(chan *models.E2tData, 10)
497 go func() { _, _,_ = recvNewE2Tdata(dataChannel) }()
498 defer close(dataChannel)
499 dataChannel <- &data2
502 func TestE2TChannelwithNoData(t *testing.T) {
503 dataChannel := make(chan *models.E2tData, 10)
504 go func() { _, _ ,_= recvNewE2Tdata(dataChannel) }()
505 defer close(dataChannel)
508 func TestProvideXappSubscriptionHandleImpl(t *testing.T) {
510 data := models.XappSubscriptionData{
511 Address: swag.String("10.0.0.0"),
513 SubscriptionID: swag.Int32(1234)}
514 datachannel := make(chan *models.XappSubscriptionData, 10)
515 go func() { _ = provideXappSubscriptionHandleImpl(datachannel, &data) }()
516 defer close(datachannel)
522 func createMockAppmgrWithData(url string, g []byte, p []byte) *httptest.Server {
523 l, err := net.Listen("tcp", url)
525 fmt.Println("Failed to create listener: " + err.Error())
527 ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
528 if r.Method == "GET" && r.URL.String() == "/ric/v1/xapps" {
529 w.Header().Add("Content-Type", "application/json")
530 w.WriteHeader(http.StatusOK)
533 if r.Method == "POST" && r.URL.String() == "/ric/v1/subscriptions" {
534 w.Header().Add("Content-Type", "application/json")
535 w.WriteHeader(http.StatusCreated)
545 func createMockPlatformComponents() {
546 var filename = "config.json"
547 file, _ := json.MarshalIndent(stub.ValidPlatformComponents, "", "")
548 filestr := string(file)
549 filestr = "{\"PlatformComponents\":" + filestr + "}"
550 file = []byte(filestr)
551 _ = ioutil.WriteFile(filename, file, 644)
554 func TestRecvXappCallbackData(t *testing.T) {
555 data := models.XappCallbackData{
556 XApps: *swag.String("[]"),
557 Version: *swag.Int64(1),
558 Event: *swag.String("any"),
559 ID: *swag.String("123456"),
562 ch := make(chan *models.XappCallbackData)
564 httpRestful := NewHttpRestful()
565 go func() { ch <- &data }()
566 time.Sleep(1 * time.Second)
567 t.Log(string(len(ch)))
568 xappList, err := httpRestful.RecvXappCallbackData(ch)
570 t.Error("Receive failed: " + err.Error())
573 t.Error("Expected an XApp notification list")
580 func TestProvideXappHandleHandlerImpl(t *testing.T) {
581 datach := make(chan *models.XappCallbackData, 10)
583 data := models.XappCallbackData{
584 XApps: *swag.String("[]"),
585 Version: *swag.Int64(1),
586 Event: *swag.String("someevent"),
587 ID: *swag.String("123456")}
588 var httpRestful, _ = GetNbi("httpRESTful")
589 err := httpRestful.(*HttpRestful).ProvideXappHandleHandlerImpl(datach, &data)
591 t.Error("Error occured: " + err.Error())
595 t.Error("Something gone wrong: " + err.Error())
598 t.Error("Malformed data on channel")
603 //Empty XappCallbackdata
604 data1 := models.XappCallbackData{}
605 err = httpRestful.(*HttpRestful).ProvideXappHandleHandlerImpl(datach, &data1)
608 func TestValidateXappCallbackData(t *testing.T) {
609 data := models.XappCallbackData{
610 XApps: *swag.String("[]"),
611 Version: *swag.Int64(1),
612 Event: *swag.String("someevent"),
613 ID: *swag.String("123456")}
615 err := validateXappCallbackData(&data)
617 t.Error("Invalid XApp callback data: " + err.Error())
621 func TestValidateXappCallbackDataWithInvalidData(t *testing.T) {
622 data := models.XappCallbackData{
623 XApps: *swag.String("{}"),
624 Version: *swag.Int64(1),
625 Event: *swag.String("someevent"),
626 ID: *swag.String("123456")}
628 err := validateXappCallbackData(&data)
630 t.Error("Invalid XApp callback data: " + err.Error())
634 func TestHttpGetXAppsInvalidData(t *testing.T) {
635 _, err := httpGetXApps(XMURL)
637 t.Error("No XApp data received: " + err.Error())
641 func TestHttpGetXAppsWithValidData(t *testing.T) {
643 ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, nil)
647 xapplist, err := httpGetXApps(XMURL)
649 t.Error("Error occured: " + err.Error())
651 if len(*xapplist) != expected {
652 t.Error("Invalid XApp data: got " + string(len(*xapplist)) + ", expected " + string(expected))
658 func TestRetrieveStartupDataTimeout(t *testing.T) {
659 sdlEngine, _ := sdl.GetSdl("file")
660 createMockPlatformComponents()
661 err := retrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", sdlEngine)
663 t.Error("Cannot retrieve startup data: " + err.Error())
666 os.Remove("config.json")
669 func TestRetrieveStartupData(t *testing.T) {
670 ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, SubscriptionResp)
673 sdlEngine, _ := sdl.GetSdl("file")
674 var httpRestful, _ = GetNbi("httpRESTful")
675 createMockPlatformComponents()
676 err := httpRestful.(*HttpRestful).RetrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", sdlEngine)
677 //err := retrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", sdlEngine)
679 t.Error("Cannot retrieve startup data: " + err.Error())
682 os.Remove("config.json")
685 func TestRetrieveStartupDataWithInvalidSubResp(t *testing.T) {
686 ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, InvalidSubResp)
689 sdlEngine, _ := sdl.GetSdl("file")
690 var httpRestful, _ = GetNbi("httpRESTful")
691 createMockPlatformComponents()
692 err := httpRestful.(*HttpRestful).RetrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", sdlEngine)
694 t.Error("Cannot retrieve startup data: " + err.Error())
697 os.Remove("config.json")
700 func TestInvalidarguments(t *testing.T) {
701 _ = PostSubReq("\n","nbifinterface")
702 _ = PostSubReq("xmurl","\n")