blob: 4466927cf50695fa4c55951fad20938d94a3955b [file] [log] [blame]
/*
==================================================================================
Copyright (c) 2021 Samsung
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
This source code is part of the near-RT RIC (RAN Intelligent Controller)
platform project (RICP).
==================================================================================
*/
package resthooks
import (
"encoding/json"
"os"
"strconv"
"testing"
"time"
"gerrit.o-ran-sc.org/r/ric-plt/a1/pkg/a1"
"gerrit.o-ran-sc.org/r/ric-plt/a1/pkg/models"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
)
type RmrSenderMock struct {
mock.Mock
}
var rh *Resthook
var sdlInst *SdlMock
var rmrSenderInst *RmrSenderMock
func TestMain(m *testing.M) {
sdlInst = new(SdlMock)
sdlInst.On("GetAll", "A1m_ns").Return([]string{"a1.policy_instance.1006001.qos",
"a1.policy_instance.20005.123456",
"a1.policy_instance.20005.234567",
"a1.policy_type.1006001",
"a1.policy_type.20000",
"a1.policy_inst_metadata.1006001.qos",
}, nil)
RMRclient = new(RMRClientMock)
a1.Init()
rh = createResthook(sdlInst, RMRclient)
code := m.Run()
os.Exit(code)
}
func TestGetAllPolicyType(t *testing.T) {
resp := rh.GetAllPolicyType()
assert.Equal(t, 2, len(resp))
}
func TestGetPolicyType(t *testing.T) {
policyTypeId := models.PolicyTypeID(20001)
var policyTypeSchema models.PolicyTypeSchema
name := "admission_control_policy_mine"
policyTypeSchema.Name = &name
policytypeid := int64(20001)
policyTypeSchema.PolicyTypeID = &policytypeid
description := "various parameters to control admission of dual connection"
policyTypeSchema.Description = &description
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)",},
"blocking_rate": {"type":"number","default":10,"minimum":1,"maximum":100,"description": "% Connections to block",},"additionalProperties": false,},}`
policyTypeSchema.CreateSchema = schema
key := a1PolicyPrefix + strconv.FormatInt((int64(policyTypeId)), 10)
var keys [1]string
keys[0] = key
//Setup Expectations
sdlInst.On("Get", a1MediatorNs, keys[:]).Return(map[string]interface{}{key: policyTypeSchema}, nil)
resp := rh.GetPolicyType(policyTypeId)
assert.NotNil(t, resp)
sdlInst.AssertExpectations(t)
}
func TestCreatePolicyType(t *testing.T) {
var policyTypeId models.PolicyTypeID
policyTypeId = 20001
var policyTypeSchema models.PolicyTypeSchema
name := "admission_control_policy_mine"
policyTypeSchema.Name = &name
policytypeid := int64(20001)
policyTypeSchema.PolicyTypeID = &policytypeid
description := "various parameters to control admission of dual connection"
policyTypeSchema.Description = &description
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)",},
"blocking_rate": {"type":"number","default":10,"minimum":1,"maximum":100,"description": "% Connections to block",},"additionalProperties": false,},}`
data, err := policyTypeSchema.MarshalBinary()
a1.Logger.Debug("error : %+v ", err)
a1.Logger.Debug("data : %+v ", data)
key := a1PolicyPrefix + strconv.FormatInt(20001, 10)
a1.Logger.Debug("key : %+v ", key)
//Setup Expectations
sdlInst.On("SetIfNotExists", a1MediatorNs, key, string(data)).Return(true, nil)
errresp := rh.CreatePolicyType(policyTypeId, policyTypeSchema)
//Data Assertion
assert.Nil(t, errresp)
//Mock Assertion :Behavioral
sdlInst.AssertExpectations(t)
}
func TestCreatePolicyTypeInstance(t *testing.T) {
var policyInstanceID models.PolicyInstanceID
policyInstanceID = "123456"
var httpBody = `{"enforce":true,"window_length":20,"blocking_rate":20,"trigger_threshold":10}`
instancekey := a1InstancePrefix + strconv.FormatInt(20001, 10) + "." + string(policyInstanceID)
var policyTypeId models.PolicyTypeID
policyTypeId = 20001
var instancedata map[string]interface{}
json.Unmarshal([]byte(httpBody), &instancedata)
data, _ := json.Marshal(instancedata)
a1.Logger.Debug("Marshaled data : %+v", string(data))
a1.Logger.Debug("instancekey : %+v", instancekey)
instancearr := []interface{}{instancekey, string(data)}
sdlInst.On("Set", "A1m_ns", instancearr).Return(nil)
metadatainstancekey := a1InstanceMetadataPrefix + strconv.FormatInt(20001, 10) + "." + string(policyInstanceID)
creation_timestamp := time.Now()
var metadatajson []interface{}
metadatajson = append(metadatajson, map[string]string{"created_at": creation_timestamp.Format("2006-01-02 15:04:05"), "has_been_deleted": "False"})
metadata, _ := json.Marshal(metadatajson)
a1.Logger.Debug("Marshaled Metadata : %+v", string(metadata))
a1.Logger.Debug("metadatainstancekey : %+v", metadatainstancekey)
metadatainstancearr := []interface{}{metadatainstancekey, string(metadata)}
sdlInst.On("Set", "A1m_ns", metadatainstancearr).Return(nil)
rmrSenderInst.On("RmrSendToXapp", "httpBodyString").Return(true)
errresp := rh.CreatePolicyInstance(policyTypeId, policyInstanceID, instancedata)
assert.Nil(t, errresp)
sdlInst.AssertExpectations(t)
}
func TestGetPolicyInstance(t *testing.T) {
var policyTypeId models.PolicyTypeID
policyTypeId = 20001
var policyInstanceID models.PolicyInstanceID
policyInstanceID = "123456"
httpBody := `{
"enforce":true,
"window_length":20,
"blocking_rate":20,
"trigger_threshold":10
}`
instancekey := a1InstancePrefix + strconv.FormatInt(20001, 10) + "." + string(policyInstanceID)
a1.Logger.Debug("httpBody String : %+v", httpBody)
a1.Logger.Debug("key : %+v", instancekey)
var keys [1]string
keys[0] = instancekey
//Setup Expectations
sdlInst.On("Get", a1MediatorNs, keys[:]).Return(httpBody, nil)
resp, err := rh.GetPolicyInstance(policyTypeId, policyInstanceID)
a1.Logger.Error("err : %+v", err)
assert.NotNil(t, resp)
sdlInst.AssertExpectations(t)
}
func TestGetAllPolicyIntances(t *testing.T) {
var policyTypeId models.PolicyTypeID
policyTypeId = 20005
resp, err := rh.GetAllPolicyInstance(policyTypeId)
a1.Logger.Error("err : %+v", err)
assert.Equal(t, 2, len(resp))
}
type SdlMock struct {
mock.Mock
}
func (s *SdlMock) GetAll(ns string) ([]string, error) {
args := s.MethodCalled("GetAll", ns)
return args.Get(0).([]string), nil
}
func (s *SdlMock) Get(ns string, keys []string) (map[string]interface{}, error) {
a1.Logger.Debug("Get Called ")
args := s.MethodCalled("Get", ns, keys)
a1.Logger.Debug("keys :%+v", args.Get(1))
policytypeid := int64(20001)
policyInstanceID := "123456"
var policySchemaString string
var key string
if keys[0] == "a1.policy_instance.20001.123456" {
policySchemaString = `{
"enforce":true,
"window_length":20,
"blocking_rate":20,
"trigger_threshold":10
}`
key = a1InstancePrefix + strconv.FormatInt(policytypeid, 10) + "." + string(policyInstanceID)
} else if keys[0] == "a1.policy_type.20001" {
policySchemaString = `{"create_schema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"additionalProperties":false,"blocking_rate":{"default":10,"description":"% Connections to block","maximum":1001,"minimum":1,"type":"number"},"enforce":{"default":"true","type":"boolean"},"window_length":{"default":1,"description":"Sliding window length (in minutes)","maximum":60,"minimum":1,"type":"integer"}},"type":"object"},"description":"various parameters to control admission of dual connection","name":"admission_control_policy_mine","policy_type_id":20001}`
key = a1PolicyPrefix + strconv.FormatInt((policytypeid), 10)
}
a1.Logger.Debug(" policy SchemaString %+v", policySchemaString)
policyTypeSchema, _ := json.Marshal((policySchemaString))
a1.Logger.Debug(" policyTypeSchema %+v", string(policyTypeSchema))
a1.Logger.Debug(" key for policy type %+v", key)
mp := map[string]interface{}{key: string(policySchemaString)}
a1.Logger.Debug("Get Called and mp return %+v ", mp)
return mp, nil
}
func (s *SdlMock) SetIfNotExists(ns string, key string, data interface{}) (bool, error) {
args := s.MethodCalled("SetIfNotExists", ns, key, data)
return args.Bool(0), args.Error(1)
}
func (s *SdlMock) Set(ns string, pairs ...interface{}) error {
args := s.MethodCalled("Set", ns, pairs)
return args.Error(0)
}
func (s *SdlMock) SetIf(ns string, key string, oldData, newData interface{}) (bool, error) {
args := s.MethodCalled("SetIfNotExists", ns, key, oldData, newData)
return args.Bool(0), args.Error(1)
}
func (rmr *RmrSenderMock) RmrSendToXapp(httpBodyString string) bool {
args := rmr.MethodCalled("RmrSendToXapp", httpBodyString)
return args.Bool(0)
}