[RICPLT-1854] Refactor X2/ENDC Setup/Setup Failure Response
[ric-plt/e2mgr.git] / E2Manager / handlers / rmrmsghandlers / setup_response_notification_handler_test.go
1 package rmrmsghandlers
2
3 import (
4         "e2mgr/logger"
5         "e2mgr/managers"
6         "e2mgr/mocks"
7         "e2mgr/models"
8         "e2mgr/rNibWriter"
9         "fmt"
10         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
11         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
12         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader"
13         "github.com/pkg/errors"
14         "github.com/stretchr/testify/assert"
15         "github.com/stretchr/testify/mock"
16         "testing"
17 )
18
19 const (
20         RanName                           = "test"
21         X2SetupResponsePackedPdu          = "2006002a000002001500080002f82900007a8000140017000000630002f8290007ab50102002f829000001000133"
22         EndcSetupResponsePackedPdu        = "202400808e00000100f600808640000200fc00090002f829504a952a0a00fd007200010c0005001e3f271f2e3d4ff03d44d34e4f003e4e5e4400010000150400000a000211e148033e4e5e4c0005001e3f271f2e3d4ff03d44d34e4f003e4e5e4400010000150400000a00021a0044033e4e5e000000002c001e3f271f2e3d4ff0031e3f274400010000150400000a00020000"
23         X2SetupFailureResponsePackedPdu   = "4006001a0000030005400200000016400100001140087821a00000008040"
24         EndcSetupFailureResponsePackedPdu = "4024001a0000030005400200000016400100001140087821a00000008040"
25 )
26
27 type setupResponseTestContext struct {
28         logger               *logger.Logger
29         readerMock           *mocks.RnibReaderMock
30         writerMock           *mocks.RnibWriterMock
31         rnibReaderProvider   func() reader.RNibReader
32         rnibWriterProvider   func() rNibWriter.RNibWriter
33         setupResponseManager managers.ISetupResponseManager
34 }
35
36 func NewSetupResponseTestContext(manager managers.ISetupResponseManager) *setupResponseTestContext {
37         logger, _ := logger.InitLogger(logger.InfoLevel)
38         readerMock := &mocks.RnibReaderMock{}
39         writerMock := &mocks.RnibWriterMock{}
40
41         return &setupResponseTestContext{
42                 logger:     logger,
43                 readerMock: readerMock,
44                 writerMock: writerMock,
45                 rnibReaderProvider: func() reader.RNibReader {
46                         return readerMock
47                 },
48                 rnibWriterProvider: func() rNibWriter.RNibWriter {
49                         return writerMock
50                 },
51                 setupResponseManager: manager,
52         }
53 }
54
55 func TestSetupResponseGetNodebFailure(t *testing.T) {
56         notificationRequest := models.NotificationRequest{RanName: RanName}
57         testContext := NewSetupResponseTestContext(nil)
58         handler := NewSetupResponseNotificationHandler(testContext.rnibReaderProvider, testContext.rnibWriterProvider, &managers.X2SetupResponseManager{}, "X2 Setup Response")
59         testContext.readerMock.On("GetNodeb", RanName).Return(&entities.NodebInfo{}, common.NewInternalError(errors.New("Error")))
60         handler.Handle(testContext.logger, nil, &notificationRequest, nil)
61         testContext.readerMock.AssertCalled(t, "GetNodeb", RanName)
62         testContext.writerMock.AssertNotCalled(t, "SaveNodeb")
63 }
64
65 func TestSetupResponseInvalidConnectionStatus(t *testing.T) {
66         ranName := "test"
67         notificationRequest := models.NotificationRequest{RanName: ranName}
68         testContext := NewSetupResponseTestContext(nil)
69         handler := NewSetupResponseNotificationHandler(testContext.rnibReaderProvider, testContext.rnibWriterProvider, &managers.X2SetupResponseManager{}, "X2 Setup Response")
70         var rnibErr error
71         testContext.readerMock.On("GetNodeb", ranName).Return(&entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_SHUT_DOWN}, rnibErr)
72         handler.Handle(testContext.logger, nil, &notificationRequest, nil)
73         testContext.readerMock.AssertCalled(t, "GetNodeb", ranName)
74         testContext.writerMock.AssertNotCalled(t, "SaveNodeb")
75 }
76
77 func executeHandleSuccessSetupResponse(t *testing.T, packedPdu string, setupResponseManager managers.ISetupResponseManager, notificationType string, saveNodebMockReturnValue error) (*setupResponseTestContext, *entities.NodebInfo) {
78         var payload []byte
79         _, err := fmt.Sscanf(packedPdu, "%x", &payload)
80         if err != nil {
81                 t.Fatalf("Failed converting packed pdu. Error: %v\n", err)
82         }
83
84         notificationRequest := models.NotificationRequest{RanName: RanName, Payload: payload}
85         testContext := NewSetupResponseTestContext(setupResponseManager)
86
87         handler := NewSetupResponseNotificationHandler(testContext.rnibReaderProvider, testContext.rnibWriterProvider, testContext.setupResponseManager, notificationType)
88
89         var rnibErr error
90
91         nodebInfo := &entities.NodebInfo{
92                 ConnectionStatus:   entities.ConnectionStatus_CONNECTING,
93                 ConnectionAttempts: 1,
94                 RanName:            RanName,
95                 Ip:                 "10.0.2.2",
96                 Port:               1231,
97         }
98
99         testContext.readerMock.On("GetNodeb", RanName).Return(nodebInfo, rnibErr)
100         testContext.writerMock.On("SaveNodeb", mock.Anything, mock.Anything).Return(saveNodebMockReturnValue)
101         handler.Handle(testContext.logger, nil, &notificationRequest, nil)
102
103         return testContext, nodebInfo
104 }
105
106 func TestX2SetupResponse(t *testing.T) {
107         var rnibErr error
108         testContext, nodebInfo := executeHandleSuccessSetupResponse(t, X2SetupResponsePackedPdu, &managers.X2SetupResponseManager{}, "X2 Setup Response", rnibErr)
109         testContext.readerMock.AssertCalled(t, "GetNodeb", RanName)
110         testContext.writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo)
111         assert.EqualValues(t, entities.ConnectionStatus_CONNECTED, nodebInfo.ConnectionStatus)
112         assert.EqualValues(t, 0, nodebInfo.ConnectionAttempts)
113         assert.EqualValues(t, entities.Node_ENB, nodebInfo.NodeType)
114
115         assert.IsType(t, &entities.NodebInfo_Enb{}, nodebInfo.Configuration)
116         i, _ := nodebInfo.Configuration.(*entities.NodebInfo_Enb)
117         assert.NotNil(t, i.Enb)
118 }
119
120 func TestX2SetupFailureResponse(t *testing.T) {
121         var rnibErr error
122         testContext, nodebInfo := executeHandleSuccessSetupResponse(t, X2SetupFailureResponsePackedPdu, &managers.X2SetupFailureResponseManager{}, "X2 Setup Failure Response", rnibErr)
123         testContext.readerMock.AssertCalled(t, "GetNodeb", RanName)
124         testContext.writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo)
125         assert.EqualValues(t, entities.ConnectionStatus_CONNECTED_SETUP_FAILED, nodebInfo.ConnectionStatus)
126         assert.EqualValues(t, 0, nodebInfo.ConnectionAttempts)
127         assert.EqualValues(t, entities.Failure_X2_SETUP_FAILURE, nodebInfo.FailureType)
128         assert.NotNil(t, nodebInfo.SetupFailure)
129 }
130
131 func TestEndcSetupResponse(t *testing.T) {
132         var rnibErr error
133         testContext, nodebInfo := executeHandleSuccessSetupResponse(t, EndcSetupResponsePackedPdu, &managers.EndcSetupResponseManager{}, "ENDC Setup Response", rnibErr)
134         testContext.readerMock.AssertCalled(t, "GetNodeb", RanName)
135         testContext.writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo)
136         assert.EqualValues(t, entities.ConnectionStatus_CONNECTED, nodebInfo.ConnectionStatus)
137         assert.EqualValues(t, 0, nodebInfo.ConnectionAttempts)
138         assert.EqualValues(t, entities.Node_GNB, nodebInfo.NodeType)
139         assert.IsType(t, &entities.NodebInfo_Gnb{}, nodebInfo.Configuration)
140
141         i, _ := nodebInfo.Configuration.(*entities.NodebInfo_Gnb)
142         assert.NotNil(t, i.Gnb)
143 }
144 func TestEndcSetupFailureResponse(t *testing.T) {
145         var rnibErr error
146         testContext, nodebInfo := executeHandleSuccessSetupResponse(t, EndcSetupFailureResponsePackedPdu, &managers.EndcSetupFailureResponseManager{}, "ENDC Setup Failure Response", rnibErr)
147         testContext.readerMock.AssertCalled(t, "GetNodeb", RanName)
148         testContext.writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo)
149         assert.EqualValues(t, entities.ConnectionStatus_CONNECTED_SETUP_FAILED, nodebInfo.ConnectionStatus)
150         assert.EqualValues(t, 0, nodebInfo.ConnectionAttempts)
151         assert.EqualValues(t, entities.Failure_ENDC_X2_SETUP_FAILURE, nodebInfo.FailureType)
152         assert.NotNil(t, nodebInfo.SetupFailure)
153 }
154
155 func TestSetupResponseInvalidPayload(t *testing.T) {
156         ranName := "test"
157         notificationRequest := models.NotificationRequest{RanName: ranName, Payload: []byte("123")}
158         testContext := NewSetupResponseTestContext(nil)
159         handler := NewSetupResponseNotificationHandler(testContext.rnibReaderProvider, testContext.rnibWriterProvider, &managers.X2SetupResponseManager{}, "X2 Setup Response")
160         var rnibErr error
161         testContext.readerMock.On("GetNodeb", ranName).Return(&entities.NodebInfo{ConnectionStatus: entities.ConnectionStatus_CONNECTING, ConnectionAttempts: 1}, rnibErr)
162         handler.Handle(testContext.logger, nil, &notificationRequest, nil)
163         testContext.readerMock.AssertCalled(t, "GetNodeb", ranName)
164         testContext.writerMock.AssertNotCalled(t, "SaveNodeb")
165 }
166
167 func TestSetupResponseSaveNodebFailure(t *testing.T) {
168         rnibErr := common.NewInternalError(errors.New("Error"))
169         testContext, nodebInfo := executeHandleSuccessSetupResponse(t, X2SetupResponsePackedPdu, &managers.X2SetupResponseManager{},"X2 Setup Response", rnibErr)
170         testContext.readerMock.AssertCalled(t, "GetNodeb", RanName)
171         testContext.writerMock.AssertCalled(t, "SaveNodeb", mock.Anything, nodebInfo)
172 }