blob: 20f8a35d473301ae5ea3a8fa8f0f3a59a845074c [file] [log] [blame]
Matteo Scandolo992a23e2021-02-04 15:35:04 -08001/*
2 * Copyright 2018-present Open Networking Foundation
3
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7
8 * http://www.apache.org/licenses/LICENSE-2.0
9
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package devices
18
19import (
Holger Hildebrandtc10bab12021-04-27 09:23:48 +000020 "testing"
21
Matteo Scandolo4b077aa2021-02-16 17:33:37 -080022 "github.com/google/gopacket"
Matteo Scandolo992a23e2021-02-04 15:35:04 -080023 bbsim "github.com/opencord/bbsim/internal/bbsim/types"
24 omcilib "github.com/opencord/bbsim/internal/common/omci"
25 "github.com/opencord/omci-lib-go"
26 me "github.com/opencord/omci-lib-go/generated"
27 "github.com/opencord/voltha-protos/v4/go/openolt"
28 "gotest.tools/assert"
Matteo Scandolo992a23e2021-02-04 15:35:04 -080029)
30
31var mockAttr = me.AttributeValueMap{
Matteo Scandolo992a23e2021-02-04 15:35:04 -080032 "PortId": 0,
33 "TContPointer": 0,
34 "Direction": 0,
35 "TrafficManagementPointerForUpstream": 0,
36 "TrafficDescriptorProfilePointerForUpstream": 0,
37 "PriorityQueuePointerForDownStream": 0,
38 "TrafficDescriptorProfilePointerForDownstream": 0,
39 "EncryptionKeyRing": 0,
40}
41
42func makeOmciCreateRequest(t *testing.T) []byte {
43 omciReq := &omci.CreateRequest{
44 MeBasePacket: omci.MeBasePacket{
45 EntityClass: me.GemPortNetworkCtpClassID,
46 EntityInstance: 12,
47 },
48 Attributes: mockAttr,
49 }
Matteo Scandolo4b077aa2021-02-16 17:33:37 -080050
Matteo Scandolo992a23e2021-02-04 15:35:04 -080051 omciPkt, err := omcilib.Serialize(omci.CreateRequestType, omciReq, 66)
52 if err != nil {
53 t.Fatal(err.Error())
54 }
55
56 omciPkt, _ = omcilib.HexEncode(omciPkt)
57
58 return omciPkt
59}
60
61func makeOmciSetRequest(t *testing.T) []byte {
62 omciReq := &omci.SetRequest{
63 MeBasePacket: omci.MeBasePacket{
64 EntityClass: me.GemPortNetworkCtpClassID,
65 EntityInstance: 12,
66 },
67 Attributes: mockAttr,
68 }
69 omciPkt, err := omcilib.Serialize(omci.SetRequestType, omciReq, 66)
70 if err != nil {
71 t.Fatal(err.Error())
72 }
73
74 omciPkt, _ = omcilib.HexEncode(omciPkt)
75
76 return omciPkt
77}
78
79func makeOmciDeleteRequest(t *testing.T) []byte {
80 omciReq := &omci.DeleteRequest{
81 MeBasePacket: omci.MeBasePacket{
82 EntityClass: me.GemPortNetworkCtpClassID,
83 EntityInstance: 12,
84 },
85 }
86 omciPkt, err := omcilib.Serialize(omci.DeleteRequestType, omciReq, 66)
87 if err != nil {
88 t.Fatal(err.Error())
89 }
90
91 omciPkt, _ = omcilib.HexEncode(omciPkt)
92
93 return omciPkt
94}
95
96func makeOmciMibResetRequest(t *testing.T) []byte {
97 omciReq := &omci.MibResetRequest{
98 MeBasePacket: omci.MeBasePacket{
99 EntityClass: me.OnuDataClassID,
100 },
101 }
102 omciPkt, err := omcilib.Serialize(omci.MibResetRequestType, omciReq, 66)
103 if err != nil {
104 t.Fatal(err.Error())
105 }
106
107 omciPkt, _ = omcilib.HexEncode(omciPkt)
108
109 return omciPkt
110}
111
112func makeOmciMessage(t *testing.T, onu *Onu, pkt []byte) bbsim.OmciMessage {
Matteo Scandolob5913142021-03-19 16:10:18 -0700113 omciPkt, omciMsg, err := omcilib.ParseOpenOltOmciPacket(pkt)
114 if err != nil {
115 t.Fatal(err.Error())
116 }
Matteo Scandolo992a23e2021-02-04 15:35:04 -0800117 return bbsim.OmciMessage{
Matteo Scandolob5913142021-03-19 16:10:18 -0700118 OnuSN: onu.SerialNumber,
119 OnuID: onu.ID,
120 OmciPkt: omciPkt,
121 OmciMsg: omciMsg,
Matteo Scandolo992a23e2021-02-04 15:35:04 -0800122 }
123}
124
Matteo Scandolo4b077aa2021-02-16 17:33:37 -0800125func omciBytesToMsg(t *testing.T, data []byte) (*omci.OMCI, *gopacket.Packet) {
126 packet := gopacket.NewPacket(data, omci.LayerTypeOMCI, gopacket.NoCopy)
127 if packet == nil {
128 t.Fatal("could not decode rxMsg as OMCI")
129 }
130 omciLayer := packet.Layer(omci.LayerTypeOMCI)
131 if omciLayer == nil {
132 t.Fatal("could not decode omci layer")
133 }
134 omciMsg, ok := omciLayer.(*omci.OMCI)
135 if !ok {
136 t.Fatal("could not assign omci layer")
137 }
138 return omciMsg, &packet
139}
140
141func omciToCreateResponse(t *testing.T, omciPkt *gopacket.Packet) *omci.CreateResponse {
142 msgLayer := (*omciPkt).Layer(omci.LayerTypeCreateResponse)
143 if msgLayer == nil {
144 t.Fatal("omci Msg layer could not be detected for CreateResponse - handling of MibSyncChan stopped")
145 }
146 msgObj, msgOk := msgLayer.(*omci.CreateResponse)
147 if !msgOk {
148 t.Fatal("omci Msg layer could not be assigned for CreateResponse - handling of MibSyncChan stopped")
149 }
150 return msgObj
151}
152
Matteo Scandolo992a23e2021-02-04 15:35:04 -0800153func Test_MibDataSyncIncrease(t *testing.T) {
154 onu := createMockOnu(1, 1)
155
156 assert.Equal(t, onu.MibDataSync, uint8(0))
157
158 stream := &mockStream{
159 Calls: make(map[int]*openolt.Indication),
160 }
161
162 // send a Create and check that MDS has been increased
163 onu.handleOmciRequest(makeOmciMessage(t, onu, makeOmciCreateRequest(t)), stream)
164 assert.Equal(t, onu.MibDataSync, uint8(1))
165
166 // send a Set and check that MDS has been increased
167 onu.handleOmciRequest(makeOmciMessage(t, onu, makeOmciSetRequest(t)), stream)
168 assert.Equal(t, onu.MibDataSync, uint8(2))
169
170 // send a Delete and check that MDS has been increased
171 onu.handleOmciRequest(makeOmciMessage(t, onu, makeOmciDeleteRequest(t)), stream)
172 assert.Equal(t, onu.MibDataSync, uint8(3))
173
174 // TODO once supported MDS should increase for:
175 // - Start software download
176 // - End software download
177 // - Activate software
178 // - Commit software
179}
180
181func Test_MibDataSyncReset(t *testing.T) {
182 onu := createMockOnu(1, 1)
183 onu.MibDataSync = 192
184 assert.Equal(t, onu.MibDataSync, uint8(192))
185
186 stream := &mockStream{
187 Calls: make(map[int]*openolt.Indication),
188 }
189
190 // send a MibReset and check that MDS has reset to 0
191 onu.handleOmciRequest(makeOmciMessage(t, onu, makeOmciMibResetRequest(t)), stream)
192 assert.Equal(t, onu.MibDataSync, uint8(0))
193}
194
195func Test_MibDataSyncRotation(t *testing.T) {
196 onu := createMockOnu(1, 1)
197 onu.MibDataSync = 255
198 assert.Equal(t, onu.MibDataSync, uint8(255))
199
200 stream := &mockStream{
201 Calls: make(map[int]*openolt.Indication),
202 }
203
204 // send a request that increases the MDS, but once we're at 255 we should go back to 0 (8bit)
205 onu.handleOmciRequest(makeOmciMessage(t, onu, makeOmciDeleteRequest(t)), stream)
206 assert.Equal(t, onu.MibDataSync, uint8(0))
207}
Matteo Scandolo4b077aa2021-02-16 17:33:37 -0800208
209func Test_GemPortValidation(t *testing.T) {
210
211 // setup
212 onu := createMockOnu(1, 1)
213
214 stream := &mockStream{
215 Calls: make(map[int]*openolt.Indication),
216 }
217
218 // create a gem port via OMCI (gemPortId 12)
219 onu.handleOmciRequest(makeOmciMessage(t, onu, makeOmciCreateRequest(t)), stream)
220
221 // the first time we created the gemPort
222 // the MDS should be incremented
223 assert.Equal(t, stream.CallCount, 1)
224 assert.Equal(t, onu.MibDataSync, uint8(1))
225
226 // and the OMCI response status should be me.Success
227 indication := stream.Calls[1].GetOmciInd()
228 _, omciPkt := omciBytesToMsg(t, indication.Pkt)
229 responseLayer := omciToCreateResponse(t, omciPkt)
230 assert.Equal(t, responseLayer.Result, me.Success)
231
232 // send a request to create the same gem port via OMCI (gemPortId 12)
233 onu.handleOmciRequest(makeOmciMessage(t, onu, makeOmciCreateRequest(t)), stream)
234
235 // this time the MDS should not be incremented
236 assert.Equal(t, stream.CallCount, 2)
237 assert.Equal(t, onu.MibDataSync, uint8(1))
238
239 // and the OMCI response status should be me.ProcessingError
240 _, omciPkt = omciBytesToMsg(t, stream.Calls[2].GetOmciInd().Pkt)
241 responseLayer = omciToCreateResponse(t, omciPkt)
242 assert.Equal(t, responseLayer.Result, me.ProcessingError)
243}
Holger Hildebrandtc10bab12021-04-27 09:23:48 +0000244
245func Test_OmciResponseRate(t *testing.T) {
246
247 onu := createMockOnu(1, 1)
248
249 for onu.OmciResponseRate = 0; onu.OmciResponseRate <= maxOmciMsgCounter; onu.OmciResponseRate++ {
250 //t.Logf("onu.OmciResponseRate: %d", onu.OmciResponseRate)
251 stream := &mockStream{
252 Calls: make(map[int]*openolt.Indication),
253 }
254 //send ten OMCI requests and check if number of responses is only equal to onu.OmciResponseRate
255 for i := 0; i < 10; i++ {
256 onu.handleOmciRequest(makeOmciMessage(t, onu, makeOmciSetRequest(t)), stream)
257 //t.Logf("stream.CallCount: %d", stream.CallCount)
258 }
259 assert.Equal(t, stream.CallCount, int(onu.OmciResponseRate))
260 }
261}