2 ==================================================================================
3 Copyright (c) 2019 Nokia
4 ==================================================================================
17 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/clientmodel"
18 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/models"
19 "github.com/stretchr/testify/assert"
26 xappEventInstanceId = int64(1)
27 eventInstanceId = int64(1)
31 subsequestActioType = "continue"
34 procedureCode = int64(27)
35 typeOfMessage = int64(1)
39 clientEndpoint = clientmodel.SubscriptionParamsClientEndpoint{Host: "localhost", HTTPPort: &hPort, RMRPort: &rPort}
43 func TestSetup(t *testing.T) {
46 // Start the server to simulate SubManager
47 go Subscription.Listen(subscriptionHandler, queryHandler, deleteHandler)
48 time.Sleep(time.Duration(2) * time.Second)
51 func TestSubscriptionQueryHandling(t *testing.T) {
52 resp, err := Subscription.QuerySubscriptions()
54 assert.Equal(t, err, nil)
55 assert.Equal(t, resp[0].SubscriptionID, int64(11))
56 assert.Equal(t, resp[0].Meid, "Test-Gnb")
57 assert.Equal(t, resp[0].ClientEndpoint, []string{"127.0.0.1:4056"})
60 func TestSubscriptionHandling(t *testing.T) {
61 subscriptionParams := clientmodel.SubscriptionParams{
64 RANFunctionID: &funId,
65 ClientEndpoint: &clientEndpoint,
66 SubscriptionDetails: clientmodel.SubscriptionDetailsList{
67 &clientmodel.SubscriptionDetail{
68 XappEventInstanceID: &eventInstanceId,
69 EventTriggers: clientmodel.EventTriggerDefinition{00, 0x11, 0x12, 0x13, 0x00, 0x21, 0x22, 0x24, 0x1B, 0x80},
70 ActionToBeSetupList: clientmodel.ActionsToBeSetup{
71 &clientmodel.ActionToBeSetup{
73 ActionType: &actionType,
74 ActionDefinition: clientmodel.ActionDefinition{5, 6, 7, 8},
75 SubsequentAction: &clientmodel.SubsequentAction{
76 SubsequentActionType: &subsequestActioType,
77 TimeToWait: &timeToWait,
85 Subscription.SetResponseCB(func(resp *clientmodel.SubscriptionResponse) {
86 assert.Equal(t, len(resp.SubscriptionInstances), 1)
87 assert.Equal(t, *resp.SubscriptionInstances[0].XappEventInstanceID, int64(11))
88 assert.Equal(t, *resp.SubscriptionInstances[0].E2EventInstanceID, int64(22))
91 _, err := Subscription.Subscribe(&subscriptionParams)
92 assert.Equal(t, err, nil)
95 func TestSubscriptionWithClientProvidedIdHandling(t *testing.T) {
96 subscriptionParams := clientmodel.SubscriptionParams{
97 SubscriptionID: "myxapp",
99 RANFunctionID: &funId,
100 ClientEndpoint: &clientEndpoint,
101 SubscriptionDetails: clientmodel.SubscriptionDetailsList{
102 &clientmodel.SubscriptionDetail{
103 XappEventInstanceID: &eventInstanceId,
104 EventTriggers: clientmodel.EventTriggerDefinition{00, 0x11, 0x12, 0x13, 0x00, 0x21, 0x22, 0x24, 0x1B, 0x80},
105 ActionToBeSetupList: clientmodel.ActionsToBeSetup{
106 &clientmodel.ActionToBeSetup{
108 ActionType: &actionType,
109 ActionDefinition: clientmodel.ActionDefinition{5, 6, 7, 8},
110 SubsequentAction: &clientmodel.SubsequentAction{
111 SubsequentActionType: &subsequestActioType,
112 TimeToWait: &timeToWait,
120 Subscription.SetResponseCB(func(resp *clientmodel.SubscriptionResponse) {
121 assert.Equal(t, len(resp.SubscriptionInstances), 1)
122 assert.Equal(t, *resp.SubscriptionInstances[0].XappEventInstanceID, int64(11))
123 assert.Equal(t, *resp.SubscriptionInstances[0].E2EventInstanceID, int64(22))
126 _, err := Subscription.Subscribe(&subscriptionParams)
127 assert.Equal(t, err, nil)
130 func TestSubscriptionDeleteHandling(t *testing.T) {
131 err := Subscription.Unsubscribe(subscriptionId)
133 assert.Equal(t, err, nil)
136 func TestResponseHandler(t *testing.T) {
137 Subscription.SetResponseCB(SubscriptionRespHandler)
139 payload := []byte(`{"SubscriptionInstances":[{"tXappEventInstanceID": 1}]`)
140 req, err := http.NewRequest("POST", "/ric/v1/subscriptions/response", bytes.NewBuffer(payload))
145 rr := httptest.NewRecorder()
146 handler := http.HandlerFunc(Subscription.ResponseHandler)
147 handler.ServeHTTP(rr, req)
149 if status := rr.Code; status != http.StatusOK {
150 t.Errorf("handler returned wrong status code: got %v want %v", status, http.StatusOK)
152 time.Sleep(time.Duration(2) * time.Second)
156 func SubscriptionRespHandler(resp *clientmodel.SubscriptionResponse) {
159 func processSubscriptions(subscriptionId string) {
160 // Generate requestorId, instanceId
161 xappInstanceId := int64(11)
162 e2InstanceId := int64(22)
164 resp := &models.SubscriptionResponse{
165 SubscriptionID: &subscriptionId,
166 SubscriptionInstances: []*models.SubscriptionInstance{
168 XappEventInstanceID: &xappInstanceId,
169 E2EventInstanceID: &e2InstanceId,
174 // Notify the client: don't worry about errors ... Notify() will handle retries, etc.
175 Subscription.Notify(resp, models.SubscriptionParamsClientEndpoint{Host: "localhost", HTTPPort: &hPort, RMRPort: &rPort})
178 func subscriptionHandler(params interface{}) (*models.SubscriptionResponse, error) {
179 p := params.(*models.SubscriptionParams)
181 assert.Equal(suite, meid, *p.Meid)
182 assert.Equal(suite, funId, *p.RANFunctionID)
183 assert.Equal(suite, clientEndpoint.Host, p.ClientEndpoint.Host)
184 assert.Equal(suite, clientEndpoint.HTTPPort, p.ClientEndpoint.HTTPPort)
185 assert.Equal(suite, clientEndpoint.RMRPort, p.ClientEndpoint.RMRPort)
187 assert.Equal(suite, xappEventInstanceId, *p.SubscriptionDetails[0].XappEventInstanceID)
188 et := []int64{00, 0x11, 0x12, 0x13, 0x00, 0x21, 0x22, 0x24, 0x1B, 0x80}
189 assert.ElementsMatch(suite, et, p.SubscriptionDetails[0].EventTriggers)
190 assert.Equal(suite, actionId, *p.SubscriptionDetails[0].ActionToBeSetupList[0].ActionID)
191 assert.Equal(suite, actionType, *p.SubscriptionDetails[0].ActionToBeSetupList[0].ActionType)
193 assert.Equal(suite, subsequestActioType, *p.SubscriptionDetails[0].ActionToBeSetupList[0].SubsequentAction.SubsequentActionType)
194 assert.Equal(suite, timeToWait, *p.SubscriptionDetails[0].ActionToBeSetupList[0].SubsequentAction.TimeToWait)
195 assert.ElementsMatch(suite, []int64{5, 6, 7, 8}, p.SubscriptionDetails[0].ActionToBeSetupList[0].ActionDefinition)
197 // Generate a unique subscriptionId
198 subscriptionId = fmt.Sprintf("%s-%s", meid, clientEndpoint.Host)
200 // Process subscriptions on the background
201 go processSubscriptions(subscriptionId)
203 // and send response immediately
204 return &models.SubscriptionResponse{
205 SubscriptionID: &subscriptionId,
209 func queryHandler() (models.SubscriptionList, error) {
210 resp := models.SubscriptionList{
211 &models.SubscriptionData{
214 ClientEndpoint: []string{"127.0.0.1:4056"},
220 func deleteHandler(ep string) error {
221 assert.Equal(suite, subscriptionId, ep)