2 ==================================================================================
3 Copyright (c) 2021 Samsung
5 Licensed under the Apache License, Version 2.0 (the "License");
6 you may not use this file except in compliance with the License.
7 You may obtain a copy of the License at
9 http://www.apache.org/licenses/LICENSE-2.0
11 Unless required by applicable law or agreed to in writing, software
12 distributed under the License is distributed on an "AS IS" BASIS,
13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 See the License for the specific language governing permissions and
15 limitations under the License.
17 This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 platform project (RICP).
19 ==================================================================================
30 "gerrit.o-ran-sc.org/r/ric-plt/a1/pkg/a1"
31 "gerrit.o-ran-sc.org/r/ric-plt/a1/pkg/models"
32 "github.com/stretchr/testify/assert"
33 "github.com/stretchr/testify/mock"
39 func TestMain(m *testing.M) {
40 sdlInst = new(SdlMock)
42 sdlInst.On("GetAll", "A1m_ns").Return([]string{"a1.policy_instance.1006001.qos",
43 "a1.policy_instance.20005.123456",
44 "a1.policy_instance.20005.234567",
45 "a1.policy_type.1006001",
46 "a1.policy_type.20000",
47 "a1.policy_inst_metadata.1006001.qos",
51 rh = createResthook(sdlInst)
56 func TestGetAllPolicyType(t *testing.T) {
57 resp := rh.GetAllPolicyType()
58 assert.Equal(t, 2, len(resp))
61 func TestGetPolicyType(t *testing.T) {
63 policyTypeId := models.PolicyTypeID(20001)
65 var policyTypeSchema models.PolicyTypeSchema
66 name := "admission_control_policy_mine"
67 policyTypeSchema.Name = &name
68 policytypeid := int64(20001)
69 policyTypeSchema.PolicyTypeID = &policytypeid
70 description := "various parameters to control admission of dual connection"
71 policyTypeSchema.Description = &description
72 schema := `{"$schema": "http://json-schema.org/draft-07/schema#","type":"object","properties": {"enforce": {"type":"boolean","default":"true",},"window_length": {"type": "integer","default":1,"minimum":1,"maximum":60,"description": "Sliding window length (in minutes)",},
73 "blocking_rate": {"type":"number","default":10,"minimum":1,"maximum":100,"description": "% Connections to block",},"additionalProperties": false,},}`
74 policyTypeSchema.CreateSchema = schema
75 key := a1PolicyPrefix + strconv.FormatInt((int64(policyTypeId)), 10)
79 sdlInst.On("Get", a1MediatorNs, keys[:]).Return(map[string]interface{}{key: policyTypeSchema}, nil)
80 resp := rh.GetPolicyType(policyTypeId)
81 assert.NotNil(t, resp)
83 sdlInst.AssertExpectations(t)
87 func TestCreatePolicyType(t *testing.T) {
88 var policyTypeId models.PolicyTypeID
90 var policyTypeSchema models.PolicyTypeSchema
91 name := "admission_control_policy_mine"
92 policyTypeSchema.Name = &name
93 policytypeid := int64(20001)
94 policyTypeSchema.PolicyTypeID = &policytypeid
95 description := "various parameters to control admission of dual connection"
96 policyTypeSchema.Description = &description
97 policyTypeSchema.CreateSchema = `{"$schema": "http://json-schema.org/draft-07/schema#","type":"object","properties": {"enforce": {"type":"boolean","default":"true",},"window_length": {"type": "integer","default":1,"minimum":1,"maximum":60,"description": "Sliding window length (in minutes)",},
98 "blocking_rate": {"type":"number","default":10,"minimum":1,"maximum":100,"description": "% Connections to block",},"additionalProperties": false,},}`
100 data, err := policyTypeSchema.MarshalBinary()
101 a1.Logger.Debug("error : %+v ", err)
102 a1.Logger.Debug("data : %+v ", data)
103 key := a1PolicyPrefix + strconv.FormatInt(20001, 10)
104 a1.Logger.Debug("key : %+v ", key)
106 sdlInst.On("SetIfNotExists", a1MediatorNs, key, string(data)).Return(true, nil)
108 errresp := rh.CreatePolicyType(policyTypeId, policyTypeSchema)
110 assert.Nil(t, errresp)
111 //Mock Assertion :Behavioral
112 sdlInst.AssertExpectations(t)
115 func TestCreatePolicyTypeInstance(t *testing.T) {
116 var policyInstanceID models.PolicyInstanceID
117 policyInstanceID = "123456"
118 var httpBody = `{"enforce":true,"window_length":20,"blocking_rate":20,"trigger_threshold":10}`
119 instancekey := a1InstancePrefix + strconv.FormatInt(20001, 10) + "." + string(policyInstanceID)
120 var policyTypeId models.PolicyTypeID
123 var instancedata map[string]interface{}
125 json.Unmarshal([]byte(httpBody), &instancedata)
127 data, _ := json.Marshal(instancedata)
128 a1.Logger.Debug("Marshaled data : %+v", string(data))
129 a1.Logger.Debug("instancekey : %+v", instancekey)
130 instancearr := []interface{}{instancekey, string(data)}
131 sdlInst.On("Set", "A1m_ns", instancearr).Return(nil)
133 metadatainstancekey := a1InstanceMetadataPrefix + strconv.FormatInt(20001, 10) + "." + string(policyInstanceID)
134 creation_timestamp := time.Now()
135 var metadatajson []interface{}
136 metadatajson = append(metadatajson, map[string]string{"created_at": creation_timestamp.Format("2006-01-02 15:04:05"), "has_been_deleted": "False"})
137 metadata, _ := json.Marshal(metadatajson)
138 a1.Logger.Debug("Marshaled Metadata : %+v", string(metadata))
139 a1.Logger.Debug("metadatainstancekey : %+v", metadatainstancekey)
140 metadatainstancearr := []interface{}{metadatainstancekey, string(metadata)}
141 sdlInst.On("Set", "A1m_ns", metadatainstancearr).Return(nil)
143 errresp := rh.CreatePolicyInstance(policyTypeId, policyInstanceID, instancedata)
145 assert.Nil(t, errresp)
146 sdlInst.AssertExpectations(t)
149 func TestGetPolicyInstance(t *testing.T) {
151 var policyTypeId models.PolicyTypeID
153 var policyInstanceID models.PolicyInstanceID
154 policyInstanceID = "123456"
159 "trigger_threshold":10
161 instancekey := a1PolicyPrefix + strconv.FormatInt(20001, 10) + "." + string(policyInstanceID)
162 a1.Logger.Debug("httpBody String : %+v", httpBody)
163 a1.Logger.Debug("key : %+v", instancekey)
165 keys[0] = instancekey
167 sdlInst.On("Get", a1MediatorNs, keys[:]).Return(httpBody, nil)
169 resp, err := rh.GetPolicyInstance(policyTypeId, policyInstanceID)
170 a1.Logger.Error("err : %+v", err)
171 assert.NotNil(t, resp)
173 sdlInst.AssertExpectations(t)
176 func TestGetAllPolicyIntances(t *testing.T) {
177 var policyTypeId models.PolicyTypeID
179 resp, err := rh.GetAllPolicyInstance(policyTypeId)
180 a1.Logger.Error("err : %+v", err)
181 assert.Equal(t, 2, len(resp))
184 type SdlMock struct {
188 func (s *SdlMock) GetAll(ns string) ([]string, error) {
189 args := s.MethodCalled("GetAll", ns)
190 return args.Get(0).([]string), nil
193 func (s *SdlMock) Get(ns string, keys []string) (map[string]interface{}, error) {
194 a1.Logger.Debug("Get Called ")
195 args := s.MethodCalled("Get", ns, keys)
196 a1.Logger.Debug("keys :%+v", args.Get(1))
197 policytypeid := int64(20001)
198 policyInstanceID := "123456"
199 var policySchemaString string
201 if keys[0] == "a1.policy_instance.20001.123456" {
202 policySchemaString = `{
206 "trigger_threshold":10
208 key = a1InstancePrefix + strconv.FormatInt(policytypeid, 10) + "." + string(policyInstanceID)
209 } else if keys[0] == "a1.policy_type.20001" {
210 policySchemaString = `{"name":"admission_control_policy_mine",
211 "description":"various parameters to control admission of dual connection",
212 "policy_type_id": 20001,
213 "create_schema":{"$schema": "http://json-schema.org/draft-07/schema#","type": "object",
214 "properties": {"enforce": {"type": "boolean","default": "true"},
215 "window_length": {"type":"integer","default": 1,"minimum": 1,"maximum": 60,
216 "description": "Sliding window length (in minutes)"},
217 "blocking_rate": {"type": "number","default": 10,"minimum": 1,"maximum": 1001,
218 "description": "% Connections to block"},
219 "additionalProperties": false}}}`
220 key = a1PolicyPrefix + strconv.FormatInt((policytypeid), 10)
222 a1.Logger.Error(" policy SchemaString %+v", policySchemaString)
223 policyTypeSchema, _ := json.Marshal((policySchemaString))
224 a1.Logger.Error(" policyTypeSchema %+v", string(policyTypeSchema))
225 a1.Logger.Error(" key for policy type %+v", key)
226 mp := map[string]interface{}{key: string(policyTypeSchema)}
227 a1.Logger.Error("Get Called and mp return %+v ", mp)
231 func (s *SdlMock) SetIfNotExists(ns string, key string, data interface{}) (bool, error) {
232 args := s.MethodCalled("SetIfNotExists", ns, key, data)
233 return args.Bool(0), args.Error(1)
236 func (s *SdlMock) Set(ns string, pairs ...interface{}) error {
237 args := s.MethodCalled("Set", ns, pairs)
240 func (s *SdlMock) SetIf(ns string, key string, oldData, newData interface{}) (bool, error) {
241 args := s.MethodCalled("SetIfNotExists", ns, key, oldData, newData)
242 return args.Bool(0), args.Error(1)