9ed35fb207b777f9d28aaa83912d9eb0844f3e70
[nonrtric/rapp/ransliceassurance.git] / smoversion / internal / structures / sliceassurance_test.go
1 // -
2 //   ========================LICENSE_START=================================
3 //   O-RAN-SC
4 //   %%
5 //   Copyright (C) 2021: Nordix Foundation
6 //   %%
7 //   Licensed under the Apache License, Version 2.0 (the "License");
8 //   you may not use this file except in compliance with the License.
9 //   You may obtain a copy of the License at
10 //
11 //        http://www.apache.org/licenses/LICENSE-2.0
12 //
13 //   Unless required by applicable law or agreed to in writing, software
14 //   distributed under the License is distributed on an "AS IS" BASIS,
15 //   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 //   See the License for the specific language governing permissions and
17 //   limitations under the License.
18 //   ========================LICENSE_END===================================
19 //
20
21 package structures
22
23 import (
24         "testing"
25
26         "github.com/stretchr/testify/assert"
27         "github.com/stretchr/testify/require"
28         "oransc.org/usecase/oduclosedloop/messages"
29 )
30
31 func TestAddMetric(t *testing.T) {
32         assertions := require.New(t)
33         type args struct {
34                 meas messages.Measurement
35         }
36         tests := []struct {
37                 name string
38                 args args
39         }{
40                 {
41                         name: "Test adding new metric",
42                         args: args{
43                                 meas: messages.Measurement{
44                                         MeasurementTypeInstanceReference: "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements[performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
45                                         Value:                            51232,
46                                         Unit:                             "kbit/s",
47                                 },
48                         },
49                 },
50                 {
51                         name: "Test with invalid input",
52                         args: args{
53                                 meas: messages.Measurement{
54                                         MeasurementTypeInstanceReference: "/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements[performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
55                                         Value:                            51232,
56                                         Unit:                             "kbit/s",
57                                 },
58                         },
59                 },
60         }
61
62         sliceAssuranceMeas := NewSliceAssuranceMeas()
63         assertions.Equal(0, len(sliceAssuranceMeas.Metrics), "Metrics is not empty, got: %d, want: %d.", len(sliceAssuranceMeas.Metrics), 0)
64
65         for i, tt := range tests {
66                 t.Run(tt.name, func(t *testing.T) {
67
68                         if i == 0 {
69                                 sliceAssuranceMeas.AddOrUpdateMetric(tt.args.meas)
70                                 assertions.Equal(1, len(sliceAssuranceMeas.Metrics), "Metrics must have one new metric, got: %d, want: %d.", len(sliceAssuranceMeas.Metrics), 1)
71
72                                 testMapKey := MapKey{"O-DU-1211", 1, 1}
73                                 assertions.Contains(sliceAssuranceMeas.Metrics, testMapKey, "Metric added with wrong values , got: %v.", sliceAssuranceMeas.Metrics[testMapKey])
74                         }
75                         if i == 1 {
76                                 _, got := sliceAssuranceMeas.AddOrUpdateMetric(tt.args.meas)
77                                 assertions.EqualError(got, " wrong format for MeasurementTypeInstanceReference")
78                         }
79                 })
80         }
81 }
82
83 func TestUpdateExistingMetric(t *testing.T) {
84         assertions := require.New(t)
85         meas := messages.Measurement{
86                 MeasurementTypeInstanceReference: "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements[performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
87                 Value:                            51232,
88                 Unit:                             "kbit/s",
89         }
90
91         updateMeas := messages.Measurement{
92                 MeasurementTypeInstanceReference: "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements[performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
93                 Value:                            897,
94                 Unit:                             "kbit/s",
95         }
96
97         sliceAssuranceMeas := NewSliceAssuranceMeas()
98         assertions.Equal(0, len(sliceAssuranceMeas.Metrics), "Metrics is not empty, got: %d, want: %d.", len(sliceAssuranceMeas.Metrics), 0)
99
100         sliceAssuranceMeas.AddOrUpdateMetric(meas)
101         assertions.Equal(1, len(sliceAssuranceMeas.Metrics), "Metrics must have one new metric, got: %d, want: %d.", len(sliceAssuranceMeas.Metrics), 1)
102
103         sliceAssuranceMeas.AddOrUpdateMetric(updateMeas)
104         assertions.Equal(1, len(sliceAssuranceMeas.Metrics), "Metrics must have one updated metric, got: %d, want: %d.", len(sliceAssuranceMeas.Metrics), 1)
105
106         testMapKey := MapKey{"O-DU-1211", 1, 1}
107         metricName := "user-equipment-average-throughput-uplink"
108         newMetricValue := 897
109         if sliceAssuranceMeas.Metrics[testMapKey].PM[metricName] != newMetricValue {
110                 t.Errorf("Metric value was not update properly, got: %d, want: %d.", sliceAssuranceMeas.Metrics[testMapKey].PM[metricName], newMetricValue)
111         }
112
113 }
114
115 func TestDeleteMetricWhenValueLessThanThreshold(t *testing.T) {
116
117         meas := messages.Measurement{
118                 MeasurementTypeInstanceReference: "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements[performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
119                 Value:                            51232,
120                 Unit:                             "kbit/s",
121         }
122
123         newMeas := messages.Measurement{
124                 MeasurementTypeInstanceReference: "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements[performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
125                 Value:                            50,
126                 Unit:                             "kbit/s",
127         }
128
129         sliceAssuranceMeas := NewSliceAssuranceMeas()
130         assert.Equal(t, 0, len(sliceAssuranceMeas.Metrics), "Metrics is not empty, got: %d, want: %d.", len(sliceAssuranceMeas.Metrics), 0)
131
132         sliceAssuranceMeas.AddOrUpdateMetric(meas)
133         assert.Equal(t, 1, len(sliceAssuranceMeas.Metrics), "Metrics must have one new metric, got: %d, want: %d.", len(sliceAssuranceMeas.Metrics), 1)
134
135         sliceAssuranceMeas.AddOrUpdateMetric(newMeas)
136         assert.Equal(t, 0, len(sliceAssuranceMeas.Metrics), "Metrics must have been deleted, got: %d, want: %d.", len(sliceAssuranceMeas.Metrics), 0)
137
138 }
139
140 func TestAddPolicy(t *testing.T) {
141
142         meas := messages.Measurement{
143                 MeasurementTypeInstanceReference: "/o-ran-sc-du-hello-world:network-function/distributed-unit-functions[id='O-DU-1211']/cell[id='cell-1']/supported-measurements[performance-measurement-type='user-equipment-average-throughput-uplink']/supported-snssai-subcounter-instances[slice-differentiator='1'][slice-service-type='1']",
144                 Value:                            51232,
145                 Unit:                             "kbit/s",
146         }
147         sliceAssuranceMeas := NewSliceAssuranceMeas()
148         sliceAssuranceMeas.AddOrUpdateMetric(meas)
149
150         duid := "O-DU-1211"
151         rrmPolicyRatio := messages.RRMPolicyRatio{
152                 Id:                      "id",
153                 AdmState:                "locked",
154                 UserLabel:               "user_label",
155                 RRMPolicyMaxRatio:       0,
156                 RRMPolicyMinRatio:       0,
157                 RRMPolicyDedicatedRatio: 0,
158                 ResourceType:            "prb",
159                 RRMPolicyMembers: []messages.RRMPolicyMember{{
160                         MobileCountryCode:   "046",
161                         MobileNetworkCode:   "651",
162                         SliceDifferentiator: 1,
163                         SliceServiceType:    1,
164                 }},
165         }
166         assert.Equal(t, 0, len(sliceAssuranceMeas.Policies), "Policies is not empty, got: %d, want: %d.", len(sliceAssuranceMeas.Policies), 0)
167
168         sliceAssuranceMeas.AddNewPolicy(duid, rrmPolicyRatio)
169         assert.Equal(t, 1, len(sliceAssuranceMeas.Policies), "Policies must have one new policy, got: %d, want: %d.", len(sliceAssuranceMeas.Policies), 1)
170
171         sliceAssuranceMeas.PrintStructures()
172 }