UT changes and fixes 01/6101/1
authorMarkku Virtanen <markku.virtanen@nokia.com>
Thu, 20 May 2021 08:22:04 +0000 (08:22 +0000)
committerMarkku Virtanen <markku.virtanen@nokia.com>
Thu, 20 May 2021 10:41:05 +0000 (10:41 +0000)
Change-Id: I31bb8fcfb562bf32519f0f3bd2bbcfdae7aff728
Signed-off-by: Markku Virtanen <markku.virtanen@nokia.com>
Dockerfile
pkg/control/registry.go
pkg/control/restendpoint.go
pkg/control/ut_ctrl_submgr_test.go
pkg/control/ut_messaging_test.go
pkg/control/ut_restendpoint_test.go [new file with mode: 0644]
pkg/teststube2ap/stubE2.go

index 5276ea5..0a2b217 100644 (file)
@@ -182,7 +182,7 @@ ENV RMR_SEED_RT=/opt/submgr/test/uta_rtg.rt
 RUN sed -r  "s/^(::1.*)/#\1/" /etc/hosts  > /etc/hosts.new \
     && cat /etc/hosts.new > /etc/hosts \
     && cat /etc/hosts  \
-    && go test -test.coverprofile /tmp/submgr_cover.out -count=1 -v ./pkg/control \
+    && go test -failfast -test.coverprofile /tmp/submgr_cover.out -count=1 -v ./pkg/control \
     && go tool cover -html=/tmp/submgr_cover.out -o /tmp/submgr_cover.html
 
 # test formating (not important)
index d7f8011..93a287a 100644 (file)
@@ -101,7 +101,7 @@ func (r *Registry) GetRESTSubscription(restSubId string) (*RESTSubscription, err
                        r.restSubscriptions[restSubId] = restSubscription
                        return restSubscription, nil
                } else {
-                       return restSubscription, fmt.Errorf("Registry: REST delete request is still ongoing for the endpoint=%v, restSubId=%v, SubDelReqOngoing=%v, SubReqOngoing=%v", restSubscription, restSubId, restSubscription.SubDelReqOngoing, restSubscription.SubReqOngoing)
+                       return restSubscription, fmt.Errorf("Registry: REST request is still ongoing for the endpoint=%v, restSubId=%v, SubDelReqOngoing=%v, SubReqOngoing=%v", restSubscription, restSubId, restSubscription.SubDelReqOngoing, restSubscription.SubReqOngoing)
                }
                return restSubscription, nil
        }
index b872c47..96df505 100644 (file)
@@ -22,6 +22,7 @@ package control
 import (
        "fmt"
        "strconv"
+       "strings"
 
        "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/models"
        "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
@@ -38,12 +39,6 @@ func ConstructEndpointAddresses(clientEndpoint models.SubscriptionParamsClientEn
        var xAppHTTPEndPoint string
        var xAppRMREndPoint string
 
-       if *clientEndpoint.HTTPPort > 0 {
-               xAppHTTPEndPoint = host + ":" + strconv.FormatInt(*clientEndpoint.HTTPPort, 10)
-       }
-       if *clientEndpoint.RMRPort > 0 {
-               xAppRMREndPoint = host + ":" + strconv.FormatInt(*clientEndpoint.RMRPort, 10)
-       }
        if host == "" || (HTTP_port == 0 && RMR_port == 0) {
                err := fmt.Errorf("ClientEndpoint aprovided no PORT numbers")
                return "INVALID_HTTP_ADDRESS:" + host + (string)(*clientEndpoint.HTTPPort),
@@ -51,6 +46,16 @@ func ConstructEndpointAddresses(clientEndpoint models.SubscriptionParamsClientEn
                        err
        }
 
+       if *clientEndpoint.HTTPPort > 0 {
+               xAppHTTPEndPoint = host + ":" + strconv.FormatInt(*clientEndpoint.HTTPPort, 10)
+       }
+       if *clientEndpoint.RMRPort > 0 {
+               if i := strings.Index(host, "http"); i != -1 {
+                       host = strings.Replace(host, "http", "rmr", -1)
+               }
+               xAppRMREndPoint = host + ":" + strconv.FormatInt(*clientEndpoint.RMRPort, 10)
+       }
+
        xapp.Logger.Info("xAppHttpEndPoint=%v, xAppRrmEndPoint=%v", xAppHTTPEndPoint, xAppRMREndPoint)
 
        return xAppHTTPEndPoint, xAppRMREndPoint, nil
index 3a0e0e4..9ffda38 100644 (file)
@@ -170,6 +170,35 @@ func (mc *testingSubmgrControl) wait_subs_clean(t *testing.T, e2SubsId uint32, s
        return false
 }
 
+func (mc *testingSubmgrControl) wait_multi_subs_clean(t *testing.T, e2SubsIds []uint32, secs int) bool {
+       var subs *Subscription
+       var purgedSubscriptions int
+       i := 1
+       k := 0
+       for ; i <= secs*2; i++ {
+               purgedSubscriptions = 0
+               for k = 0; k <= len(e2SubsIds); i++ {
+                       subs = mc.c.registry.GetSubscription(e2SubsIds[k])
+                       if subs == nil {
+                               mc.TestLog(t, "(submgr) subscriber purged for esSubsId %v", e2SubsIds[k])
+                               purgedSubscriptions += 1
+                               if purgedSubscriptions == len(e2SubsIds) {
+                                       return true
+                               } else {
+                                       continue
+                               }
+                       } else {
+                               mc.TestLog(t, "(submgr) subscriber %s no clean within %d secs: subs(N/A) - purged subscriptions %v", subs.String(), secs, purgedSubscriptions)
+                               time.Sleep(500 * time.Millisecond)
+                       }
+               }
+       }
+
+       mc.TestError(t, "(submgr) no clean within %d secs: subs(N/A) - %v/%v subscriptions found still", secs, purgedSubscriptions, len(e2SubsIds))
+
+       return false
+}
+
 func (mc *testingSubmgrControl) wait_subs_trans_clean(t *testing.T, e2SubsId uint32, secs int) bool {
        var trans TransactionIf
        i := 1
index 415c438..b91b4b8 100644 (file)
@@ -2245,16 +2245,16 @@ func TestRESTSubReqAndRouteNok(t *testing.T) {
        const parameterSet = 1
        const actionDefinitionPresent bool = true
        const actionParamCount int = 1
-       waiter := rtmgrHttp.AllocNextEvent(false)
+       // Add delay for rtmgt HTTP handling so that HTTP response is received before notify on XAPP side
+       waiter := rtmgrHttp.AllocNextSleep(50, false)
        newSubsId := mainCtrl.get_registry_next_subid(t)
 
        // Req
        params := xappConn1.GetRESTSubsReqReportParams(subReqCount, parameterSet, actionDefinitionPresent, actionParamCount)
        restSubId := xappConn1.SendRESTSubsReq(t, params)
-
+       xappConn1.ExpectRESTNotification(t, restSubId)
        waiter.WaitResult(t)
 
-       xappConn1.ExpectRESTNotification(t, restSubId)
        e2SubsId := xappConn1.WaitRESTNotification(t, restSubId)
        xapp.Logger.Info("TEST: REST notification received e2SubsId=%v", e2SubsId)
 
@@ -2424,7 +2424,7 @@ func TestRESTSubMergeDelAndRouteUpdateNok(t *testing.T) {
 //     |                 |              |
 //
 //-----------------------------------------------------------------------------
-/*
+
 func TestRESTSubReqRetransmission(t *testing.T) {
        CaseBegin("TestRESTSubReqRetransmission")
 
@@ -2476,19 +2476,18 @@ func TestRESTSubReqRetransmission(t *testing.T) {
        delreq1, delmsg1 := e2termConn1.RecvSubsDelReq(t)
        e2termConn1.SendSubsDelResp(t, delreq1, delmsg1)
 
-       // Wait that subs is cleaned
-       mainCtrl.wait_subs_clean(t, e2SubsIdA.E2SubsId, 10)
-
        // Del2
        xappConn2.SendRESTSubsDelReq(t, &restSubId2)
        delreq2, delmsg2 := e2termConn1.RecvSubsDelReq(t)
        e2termConn1.SendSubsDelResp(t, delreq2, delmsg2)
 
+       mainCtrl.wait_multi_subs_clean(t, []uint32{e2SubsIdA.E2SubsId, e2SubsIdB.E2SubsId}, 10)
+
        waitSubsCleanup(t, e2SubsIdB.E2SubsId, 10)
 
        mainCtrl.VerifyCounterValues(t)
 }
-*/
+
 func TestRESTSubDelReqRetransmission(t *testing.T) {
        CaseBegin("TestRESTSubDelReqRetransmission")
 
@@ -3448,15 +3447,14 @@ func TestRESTSubReqAndSubDelNoAnswerSameActionParallel(t *testing.T) {
        e2termConn1.RecvSubsReq(t)
 
        delreq1, delmsg1 := e2termConn1.RecvSubsDelReq(t)
-       xappConn1.ExpectRESTNotification(t, restSubId1) // or restSubId2?
-       //      xappConn2.WaitRESTNotification(t)
-       e2termConn1.SendSubsDelResp(t, delreq1, delmsg1)
 
-       e2SubsId1 := xappConn1.WaitRESTNotification(t, restSubId1)
-       xapp.Logger.Info("TEST: REST notification received e2SubsId=%v", e2SubsId1)
+       xappConn1.WaitListedRestNotifications(t, []string{restSubId1, restSubId2})
+       e2termConn1.SendSubsDelResp(t, delreq1, delmsg1)
 
-       //      e2SubsId2 := <-xappConn2.RESTNotification
-       //      xapp.Logger.Info("TEST: REST notification received e2SubsId=%v", e2SubsId2)
+       e2SubsIdA := <-xappConn1.ListedRESTNotifications
+       xapp.Logger.Info("TEST: 1.st XAPP notification received e2SubsId=%v", e2SubsIdA)
+       e2SubsIdB := <-xappConn1.ListedRESTNotifications
+       xapp.Logger.Info("TEST: 2.nd XAPP notification received e2SubsId=%v", e2SubsIdB)
 
        // Del1
        xappConn1.SendRESTSubsDelReq(t, &restSubId1)
@@ -3464,8 +3462,10 @@ func TestRESTSubReqAndSubDelNoAnswerSameActionParallel(t *testing.T) {
        // Del2
        xappConn2.SendRESTSubsDelReq(t, &restSubId2)
 
+       mainCtrl.wait_multi_subs_clean(t, []uint32{e2SubsIdA.E2SubsId, e2SubsIdB.E2SubsId}, 10)
+
        //Wait that subs is cleaned
-       waitSubsCleanup(t, e2SubsId1, 10)
+       waitSubsCleanup(t, e2SubsIdA.E2SubsId, 10)
 
        mainCtrl.VerifyCounterValues(t)
 }
@@ -4336,7 +4336,6 @@ func RESTPolicySubReqAndSubDelOk(t *testing.T, subReqCount int, actionDefinition
        mainCtrl.wait_registry_empty(t, 10)
 }
 
-/*
 func TestRESTTwoPolicySubReqAndSubDelOk(t *testing.T) {
 
        subReqCount := 2
@@ -4369,8 +4368,6 @@ func TestRESTTwoPolicySubReqAndSubDelOk(t *testing.T) {
 
        mainCtrl.VerifyCounterValues(t)
 }
-*/
-/*
 func TestRESTPolicySubReqAndSubDelOkFullAmount(t *testing.T) {
 
        subReqCount := 19
@@ -4402,8 +4399,6 @@ func TestRESTPolicySubReqAndSubDelOkFullAmount(t *testing.T) {
 
        mainCtrl.VerifyCounterValues(t)
 }
-*/
-/*
 func TestRESTTwoReportSubReqAndSubDelOk(t *testing.T) {
 
        subReqCount := 2
@@ -4439,7 +4434,7 @@ func TestRESTTwoReportSubReqAndSubDelOk(t *testing.T) {
 
        mainCtrl.VerifyCounterValues(t)
 }
-*/
+
 /*
 func TestRESTTwoReportSubReqAndSubDelOkNoActParams(t *testing.T) {
 
diff --git a/pkg/control/ut_restendpoint_test.go b/pkg/control/ut_restendpoint_test.go
new file mode 100644 (file)
index 0000000..cabae3c
--- /dev/null
@@ -0,0 +1,144 @@
+/*
+==================================================================================
+  Copyright (c) 2021 Nokia
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================================
+*/
+
+package control
+
+import (
+       "testing"
+
+       "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/models"
+)
+
+func TestRestEndpointOk(t *testing.T) {
+
+       var clientEndpoint models.SubscriptionParamsClientEndpoint
+       var httpPort int64
+       var rmrPort int64
+       var host string
+
+       httpPort = 8080
+       rmrPort = 4560
+       host = "service-ricxapp-xappname-http.ricxapp"
+
+       clientEndpoint.HTTPPort = &httpPort
+       clientEndpoint.RMRPort = &rmrPort
+       clientEndpoint.Host = host
+
+       expectedHttpEndpoint := "service-ricxapp-xappname-http.ricxapp:8080"
+       expectedRmrEndpoint := "service-ricxapp-xappname-rmr.ricxapp:4560"
+
+       httpEndPoint, rmrEndPoint, err := ConstructEndpointAddresses(clientEndpoint)
+
+       if err != nil {
+               t.Errorf("Mismatching return value: %s - ecpected NIL", err)
+       }
+       if httpEndPoint != expectedHttpEndpoint {
+               t.Errorf("Mismatching httpEndpoint: %s - ecpected %s", httpEndPoint, expectedHttpEndpoint)
+       }
+       if rmrEndPoint != expectedRmrEndpoint {
+               t.Errorf("Mismatching httpEndpoint: %s - ecpected %s", httpEndPoint, expectedHttpEndpoint)
+       }
+}
+
+func TestRestEndpointNoHttpPort(t *testing.T) {
+
+       var clientEndpoint models.SubscriptionParamsClientEndpoint
+       var httpPort int64
+       var rmrPort int64
+       var host string
+
+       httpPort = 0
+       rmrPort = 4561
+       host = "service-ricxapp-xappname-http.ricxapp"
+
+       clientEndpoint.HTTPPort = &httpPort
+       clientEndpoint.RMRPort = &rmrPort
+       clientEndpoint.Host = host
+
+       expectedHttpEndpoint := ""
+       expectedRmrEndpoint := "service-ricxapp-xappname-rmr.ricxapp:4561"
+
+       httpEndPoint, rmrEndPoint, err := ConstructEndpointAddresses(clientEndpoint)
+
+       if err != nil {
+               t.Errorf("Mismatching return value: %s - ecpected NIL", err)
+       }
+       if httpEndPoint != expectedHttpEndpoint {
+               t.Errorf("Mismatching httpEndpoint: %s - ecpected %s", httpEndPoint, expectedHttpEndpoint)
+       }
+       if rmrEndPoint != expectedRmrEndpoint {
+               t.Errorf("Mismatching httpEndpoint: %s - ecpected %s", httpEndPoint, expectedHttpEndpoint)
+       }
+}
+
+func TestRestEndpointNok(t *testing.T) {
+
+       var clientEndpoint models.SubscriptionParamsClientEndpoint
+       var httpPort int64
+       var rmrPort int64
+       var host string
+
+       httpPort = 0
+       rmrPort = 0
+       host = "service-ricxapp-xappname-http.ricxapp"
+
+       clientEndpoint.HTTPPort = &httpPort
+       clientEndpoint.RMRPort = &rmrPort
+       clientEndpoint.Host = host
+
+       _, _, err := ConstructEndpointAddresses(clientEndpoint)
+
+       if err == nil {
+               t.Errorf("Mismatching return value: - expected ERR but got NIL")
+       }
+}
+
+func TestRestEndpointNoHttpInHost(t *testing.T) {
+
+       var clientEndpoint models.SubscriptionParamsClientEndpoint
+       var httpPort int64
+       var rmrPort int64
+       var host string
+
+       httpPort = 8080
+       rmrPort = 4562
+       host = "service-ricxapp-xappname.ricxapp"
+
+       clientEndpoint.HTTPPort = &httpPort
+       clientEndpoint.RMRPort = &rmrPort
+       clientEndpoint.Host = host
+
+       expectedHttpEndpoint := "service-ricxapp-xappname.ricxapp:8080"
+       expectedRmrEndpoint := "service-ricxapp-xappname.ricxapp:4562"
+
+       httpEndPoint, rmrEndPoint, err := ConstructEndpointAddresses(clientEndpoint)
+
+       if err != nil {
+               t.Errorf("Mismatching return value: %s - ecpected NIL", err)
+       }
+       if httpEndPoint != expectedHttpEndpoint {
+               t.Errorf("Mismatching httpEndpoint: %s - ecpected %s", httpEndPoint, expectedHttpEndpoint)
+       }
+       if rmrEndPoint != expectedRmrEndpoint {
+               t.Errorf("Mismatching httpEndpoint: %s - ecpected %s", httpEndPoint, expectedHttpEndpoint)
+       }
+}
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
index b8d2350..4c8c08d 100644 (file)
@@ -764,7 +764,7 @@ func (tc *E2Stub) WaitListedRestNotifications(t *testing.T, restSubsIds []string
 //
 //-----------------------------------------------------------------------------
 func (tc *E2Stub) SendRESTSubsReq(t *testing.T, params *RESTSubsReqParams) string { // This need to be edited according to new specification
-       tc.Info("Posting REST Report subscriptions to Submgr")
+       tc.Info("======== Posting REST Report subscriptions to Submgr ======")
 
        if params == nil {
                tc.Info("SendRESTReportSubsReq: params == nil")
@@ -775,10 +775,11 @@ func (tc *E2Stub) SendRESTSubsReq(t *testing.T, params *RESTSubsReqParams) strin
        if err != nil {
                // Swagger generated code makes checks for the values that are inserted the subscription function
                // If error cause is unknown and POST is not done, the problem is in the inserted values
-               tc.Error("REST report subscriptions failed %s", err.Error())
+               tc.Error("======== REST report subscriptions failed %s ========", err.Error())
+               return ""
        }
        tc.subscriptionId = *resp.SubscriptionID
-       tc.Info("REST report subscriptions pushed successfully. SubscriptionID = %s, RequestCount = %v", *resp.SubscriptionID, tc.requestCount)
+       tc.Info("======== REST report subscriptions posted successfully. SubscriptionID = %s, RequestCount = %v ========", *resp.SubscriptionID, tc.requestCount)
        return *resp.SubscriptionID
 }