From a1b8aa6313b548986ba6c9c2e35a4c4e8b361281 Mon Sep 17 00:00:00 2001 From: ns019t Date: Sun, 4 Aug 2019 17:50:36 +0300 Subject: [PATCH] [RICPLT-1832] - Rnib module changes + unit tests. After code review Change-Id: Ie01836e313ec6b9e53fa276ca860a36ebb4e446c Signed-off-by: ns019t --- common/rNibPool_test.go | 10 ++-- reader/rNibReader.go | 102 +++++++++++++++++-------------- reader/rNibReader_test.go | 149 ++++++++++++++++++++++++++++++++-------------- 3 files changed, 168 insertions(+), 93 deletions(-) diff --git a/common/rNibPool_test.go b/common/rNibPool_test.go index e7eb662..c8f0c00 100644 --- a/common/rNibPool_test.go +++ b/common/rNibPool_test.go @@ -68,21 +68,23 @@ func validateMaxLimit(size int, iterations int, t *testing.T) { ) group := sync.WaitGroup{} for i := 0; i < iterations; i++ { - go getPutInstance(group) + go func() { + group.Add(1) + getPutInstance() + group.Done() + }() } time.Sleep(time.Second) group.Wait() assert.Equal(t, int32(size), max) } -func getPutInstance(group sync.WaitGroup) { - group.Add(1) +func getPutInstance() { inst := poolGlob.Get().(instance) inst.up() time.Sleep(time.Millisecond*10) inst.down() poolGlob.Put(inst) - group.Done() } func TestNewPool(t *testing.T){ diff --git a/reader/rNibReader.go b/reader/rNibReader.go index ed87ff7..ae9dcf3 100644 --- a/reader/rNibReader.go +++ b/reader/rNibReader.go @@ -51,8 +51,15 @@ type RNibReader interface { GetCell(inventoryName string, pci uint32) (*entities.Cell, common.IRNibError) // GetCellById retrieves the cell entity from redis DB by cell type and cell Id GetCellById(cellType entities.Cell_Type, cellId string) (*entities.Cell, common.IRNibError) + // GetListNodebIds returns the full list of Nodeb identity entities + GetListNodebIds()([]*entities.NbIdentity, common.IRNibError) } +const( + EnbType = "ENB" + GnbType = "GNB" +) + /* Init initializes the infrastructure required for the RNibReader instance */ @@ -79,45 +86,21 @@ func GetRNibReader() RNibReader { } func (w *rNibReaderInstance) GetNodeb(inventoryName string) (*entities.NodebInfo, common.IRNibError) { - name, rNibErr := common.ValidateAndBuildNodeBNameKey(inventoryName) + defer readerPool.Put(w) + key, rNibErr := common.ValidateAndBuildNodeBNameKey(inventoryName) if rNibErr != nil { return nil, rNibErr } - defer readerPool.Put(w) - data, err := (*w.sdl).Get([]string{name}) - if err != nil { - return nil, common.NewInternalError(err) - } - nb := entities.NodebInfo{} - if data != nil && data[name] != nil { - err = proto.Unmarshal([]byte(data[name].(string)), &nb) - if err != nil { - return nil, common.NewInternalError(err) - } - return &nb, nil - } - return nil, common.NewResourceNotFoundError(errors.Errorf("#rNibReader.GetNodeb - responding node %s not found", inventoryName)) + return w.getNodeb(key) } func (w *rNibReaderInstance) GetNodebByGlobalNbId(nodeType entities.Node_Type, globalNbId *entities.GlobalNbId) (*entities.NodebInfo, common.IRNibError) { + defer readerPool.Put(w) key, rNibErr := common.ValidateAndBuildNodeBIdKey(nodeType.String(), globalNbId.GetPlmnId(), globalNbId.GetNbId()) if rNibErr != nil { return nil, rNibErr } - defer readerPool.Put(w) - data, err := (*w.sdl).Get([]string{key}) - if err != nil { - return nil, common.NewInternalError(err) - } - nb := entities.NodebInfo{} - if data != nil && data[key] != nil { - err = proto.Unmarshal([]byte(data[key].(string)), &nb) - if err != nil { - return nil, common.NewInternalError(err) - } - return &nb, nil - } - return nil, common.NewResourceNotFoundError(errors.Errorf("#rNibReader.GetNodebByGlobalNbId - responding node not found, global nodeb Id: %s", key)) + return w.getNodeb(key) } func (w *rNibReaderInstance) GetCellList(inventoryName string) (*entities.Cells, common.IRNibError) { @@ -140,40 +123,34 @@ func (w *rNibReaderInstance) GetCellList(inventoryName string) (*entities.Cells, func (w *rNibReaderInstance) GetListGnbIds() (*[]*entities.NbIdentity, common.IRNibError) { defer readerPool.Put(w) - data, err := (*w.sdl).GetMembers("GNB") - if err != nil { - return nil, common.NewInternalError(err) - } - return unmarshalIdentityList(data) + return w.getListNodebIdsByType(GnbType) } func (w *rNibReaderInstance) GetListEnbIds() (*[]*entities.NbIdentity, common.IRNibError) { defer readerPool.Put(w) - data, err := (*w.sdl).GetMembers("ENB") - if err != nil { - return nil, common.NewInternalError(err) - } - return unmarshalIdentityList(data) + return w.getListNodebIdsByType(EnbType) } func (w *rNibReaderInstance) GetCountGnbList() (int, common.IRNibError) { defer readerPool.Put(w) - data, err := (*w.sdl).GetMembers("GNB") + size, err := (*w.sdl).GroupSize(GnbType) if err != nil { return 0, common.NewInternalError(err) } - return len(data), nil + return int(size), nil } func (w *rNibReaderInstance) GetCell(inventoryName string, pci uint32) (*entities.Cell, common.IRNibError) { + defer readerPool.Put(w) key, rNibErr := common.ValidateAndBuildCellNamePciKey(inventoryName, pci) if rNibErr != nil { return nil, rNibErr } - return (*w).getCellByKey(key) + return w.getCellByKey(key) } func (w *rNibReaderInstance) GetCellById(cellType entities.Cell_Type, cellId string) (*entities.Cell, common.IRNibError) { + defer readerPool.Put(w) var key string var rNibErr common.IRNibError if cellType == entities.Cell_LTE_CELL { @@ -186,11 +163,40 @@ func (w *rNibReaderInstance) GetCellById(cellType entities.Cell_Type, cellId str if rNibErr != nil { return nil, rNibErr } - return (*w).getCellByKey(key) + return w.getCellByKey(key) } -func (w *rNibReaderInstance) getCellByKey(key string) (*entities.Cell, common.IRNibError) { +func (w *rNibReaderInstance) GetListNodebIds()([]*entities.NbIdentity, common.IRNibError){ defer readerPool.Put(w) + dataEnb, err := (*w.sdl).GetMembers(EnbType) + if err != nil{ + return nil, common.NewInternalError(err) + } + dataGnb, err := (*w.sdl).GetMembers(GnbType) + if err != nil{ + return nil, common.NewInternalError(err) + } + data, rnibErr := unmarshalIdentityList(append(dataEnb, dataGnb...)) + return *data, rnibErr +} + +func (w *rNibReaderInstance) getNodeb(key string) (*entities.NodebInfo, common.IRNibError) { + data, err := (*w.sdl).Get([]string{key}) + if err != nil { + return nil, common.NewInternalError(err) + } + nb := entities.NodebInfo{} + if data != nil && data[key] != nil { + err = proto.Unmarshal([]byte(data[key].(string)), &nb) + if err != nil { + return nil, common.NewInternalError(err) + } + return &nb, nil + } + return nil, common.NewResourceNotFoundError(errors.Errorf("#rNibReader.getNodeb - responding node not found. Key: %s", key)) +} + +func (w *rNibReaderInstance) getCellByKey(key string) (*entities.Cell, common.IRNibError) { data, err := (*w.sdl).Get([]string{key}) if err != nil { return nil, common.NewInternalError(err) @@ -206,6 +212,14 @@ func (w *rNibReaderInstance) getCellByKey(key string) (*entities.Cell, common.IR return nil, common.NewResourceNotFoundError(errors.Errorf("#rNibReader.getCellByKey - cell not found, key: %s", key)) } +func (w *rNibReaderInstance) getListNodebIdsByType(nbType string) (*[]*entities.NbIdentity, common.IRNibError) { + data, err := (*w.sdl).GetMembers(nbType) + if err != nil { + return nil, common.NewInternalError(err) + } + return unmarshalIdentityList(data) +} + func unmarshalIdentityList(data []string) (*[]*entities.NbIdentity, common.IRNibError) { var members []*entities.NbIdentity for _, d := range data { diff --git a/reader/rNibReader_test.go b/reader/rNibReader_test.go index f2005c4..35e9cb9 100644 --- a/reader/rNibReader_test.go +++ b/reader/rNibReader_test.go @@ -109,7 +109,7 @@ func TestGetNodeBNotFoundFailure(t *testing.T) { assert.NotNil(t, er) assert.Nil(t, getNb) assert.Equal(t, 1, er.GetCode()) - assert.EqualValues(t, "1 RESOURCE_NOT_FOUND - #rNibReader.GetNodeb - responding node name not found", er.Error()) + assert.EqualValues(t, "1 RESOURCE_NOT_FOUND - #rNibReader.getNodeb - responding node not found. Key: RAN:name", er.Error()) } func TestGetNodeBUnmarshalFailure(t *testing.T) { @@ -230,7 +230,7 @@ func TestGetNodeBCellsListNodeNotFoundFailure(t *testing.T) { assert.NotNil(t, er) assert.Nil(t, cells) assert.Equal(t, 1, er.GetCode()) - assert.EqualValues(t, "1 RESOURCE_NOT_FOUND - #rNibReader.GetNodeb - responding node name not found", er.Error()) + assert.EqualValues(t, "1 RESOURCE_NOT_FOUND - #rNibReader.getNodeb - responding node not found. Key: RAN:name", er.Error()) } func TestGetNodeBCellsListNotFoundFailureEnb(t *testing.T) { @@ -314,7 +314,7 @@ func TestGetListGnbIdsUnmarshalFailure(t *testing.T) { sdlInstanceMock := initSdlInstanceMock(namespace, 1) w := GetRNibReader() var e error - sdlInstanceMock.On("GetMembers", "GNB").Return([]string{"data"}, e) + sdlInstanceMock.On("GetMembers", GnbType).Return([]string{"data"}, e) ids, er := w.GetListGnbIds() assert.NotNil(t, er) assert.Nil(t, ids) @@ -330,7 +330,7 @@ func TestGetListGnbIdsSdlgoFailure(t *testing.T) { w := GetRNibReader() e := errors.New(errMsg) var data []string - sdlInstanceMock.On("GetMembers", "GNB").Return(data, e) + sdlInstanceMock.On("GetMembers", GnbType).Return(data, e) ids, er := w.GetListGnbIds() assert.NotNil(t, er) assert.Nil(t, ids) @@ -338,12 +338,96 @@ func TestGetListGnbIdsSdlgoFailure(t *testing.T) { assert.EqualValues(t, errMsgExpected, er.Error()) } +func TestGetListNodesIdsGnbSdlgoFailure(t *testing.T) { + + readerPool = nil + sdlInstanceMock := initSdlInstanceMock(namespace, 1) + w := GetRNibReader() + + name := "name" + plmnId := "02f829" + nbId := "4a952a0a" + nbIdentity := &entities.NbIdentity{InventoryName: name, GlobalNbId: &entities.GlobalNbId{PlmnId: plmnId, NbId: nbId}} + var nilError error + data, err := proto.Marshal(nbIdentity) + if err != nil { + t.Errorf("#rNibReader_test.TestGetListNodesIdsGnbSdlgoFailure - Failed to marshal nodeb identity entity. Error: %v", err) + } + sdlInstanceMock.On("GetMembers", EnbType).Return([]string{string(data)}, nilError) + + errMsg := "expected Sdlgo error" + errMsgExpected := "2 INTERNAL_ERROR - expected Sdlgo error" + expectedError := errors.New(errMsg) + var nilData []string + sdlInstanceMock.On("GetMembers", GnbType).Return(nilData, expectedError) + + ids, er := w.GetListNodebIds() + assert.NotNil(t, er) + assert.Nil(t, ids) + assert.Equal(t, 2, er.GetCode()) + assert.EqualValues(t, errMsgExpected, er.Error()) +} + +func TestGetListNodesIdsEnbSdlgoFailure(t *testing.T) { + + readerPool = nil + sdlInstanceMock := initSdlInstanceMock(namespace, 1) + w := GetRNibReader() + + name := "name" + plmnId := "02f829" + nbId := "4a952a0a" + nbIdentity := &entities.NbIdentity{InventoryName: name, GlobalNbId: &entities.GlobalNbId{PlmnId: plmnId, NbId: nbId}} + var nilError error + data, err := proto.Marshal(nbIdentity) + if err != nil { + t.Errorf("#rNibReader_test.TestGetListNodesIdsEnbSdlgoFailure - Failed to marshal nodeb identity entity. Error: %v", err) + } + sdlInstanceMock.On("GetMembers", GnbType).Return([]string{string(data)}, nilError) + + errMsg := "expected Sdlgo error" + errMsgExpected := "2 INTERNAL_ERROR - expected Sdlgo error" + expectedError := errors.New(errMsg) + var nilData []string + sdlInstanceMock.On("GetMembers", EnbType).Return(nilData, expectedError) + + ids, er := w.GetListNodebIds() + assert.NotNil(t, er) + assert.Nil(t, ids) + assert.Equal(t, 2, er.GetCode()) + assert.EqualValues(t, errMsgExpected, er.Error()) +} + +func TestGetListNodesIdsEnbSdlgoSuccess(t *testing.T) { + + readerPool = nil + sdlInstanceMock := initSdlInstanceMock(namespace, 1) + w := GetRNibReader() + + name := "name" + plmnId := "02f829" + nbId := "4a952a0a" + nbIdentity := &entities.NbIdentity{InventoryName: name, GlobalNbId: &entities.GlobalNbId{PlmnId: plmnId, NbId: nbId}} + var nilError error + data, err := proto.Marshal(nbIdentity) + if err != nil { + t.Errorf("#rNibReader_test.TestGetListNodesIdsEnbSdlgoFailure - Failed to marshal nodeb identity entity. Error: %v", err) + } + sdlInstanceMock.On("GetMembers", GnbType).Return([]string{string(data)}, nilError) + sdlInstanceMock.On("GetMembers", EnbType).Return([]string{string(data)}, nilError) + + ids, er := w.GetListNodebIds() + assert.Nil(t, er) + assert.NotNil(t, ids) + assert.Len(t, ids, 2) +} + func TestGetListEnbIdsUnmarshalFailure(t *testing.T) { readerPool = nil sdlInstanceMock := initSdlInstanceMock(namespace, 1) w := GetRNibReader() var e error - sdlInstanceMock.On("GetMembers", "ENB").Return([]string{"data"}, e) + sdlInstanceMock.On("GetMembers", EnbType).Return([]string{"data"}, e) ids, er := w.GetListEnbIds() assert.NotNil(t, er) assert.Nil(t, ids) @@ -364,7 +448,7 @@ func TestGetListEnbIdsOneId(t *testing.T) { if err != nil { t.Errorf("#rNibReader_test.TestGetListEnbIds - Failed to marshal nodeb identity entity. Error: %v", err) } - sdlInstanceMock.On("GetMembers", "ENB").Return([]string{string(data)}, e) + sdlInstanceMock.On("GetMembers", EnbType).Return([]string{string(data)}, e) ids, er := w.GetListEnbIds() assert.Nil(t, er) assert.Len(t, *ids, 1) @@ -378,7 +462,7 @@ func TestGetListEnbIdsNoIds(t *testing.T) { sdlInstanceMock := initSdlInstanceMock(namespace, 1) w := GetRNibReader() var e error - sdlInstanceMock.On("GetMembers", "ENB").Return([]string{}, e) + sdlInstanceMock.On("GetMembers", EnbType).Return([]string{}, e) ids, er := w.GetListEnbIds() assert.Nil(t, er) assert.Len(t, *ids, 0) @@ -404,7 +488,7 @@ func TestGetListEnbIds(t *testing.T) { idsEntities[i] = nbIdentity } var e error - sdlInstanceMock.On("GetMembers", "ENB").Return(idsData, e) + sdlInstanceMock.On("GetMembers", EnbType).Return(idsData, e) ids, er := w.GetListEnbIds() assert.Nil(t, er) assert.Len(t, *ids, listSize) @@ -428,7 +512,7 @@ func TestGetListGnbIdsOneId(t *testing.T) { if err != nil { t.Errorf("#rNibReader_test.TestGetListGnbIds - Failed to marshal nodeb identity entity. Error: %v", err) } - sdlInstanceMock.On("GetMembers", "GNB").Return([]string{string(data)}, e) + sdlInstanceMock.On("GetMembers", GnbType).Return([]string{string(data)}, e) ids, er := w.GetListGnbIds() assert.Nil(t, er) assert.Len(t, *ids, 1) @@ -442,7 +526,7 @@ func TestGetListGnbIdsNoIds(t *testing.T) { sdlInstanceMock := initSdlInstanceMock(namespace, 1) w := GetRNibReader() var e error - sdlInstanceMock.On("GetMembers", "GNB").Return([]string{}, e) + sdlInstanceMock.On("GetMembers", GnbType).Return([]string{}, e) ids, er := w.GetListGnbIds() assert.Nil(t, er) assert.Len(t, *ids, 0) @@ -468,7 +552,7 @@ func TestGetListGnbIds(t *testing.T) { idsEntities[i] = nbIdentity } var e error - sdlInstanceMock.On("GetMembers", "GNB").Return(idsData, e) + sdlInstanceMock.On("GetMembers", GnbType).Return(idsData, e) ids, er := w.GetListGnbIds() assert.Nil(t, er) assert.Len(t, *ids, listSize) @@ -487,7 +571,7 @@ func TestGetListEnbIdsSdlgoFailure(t *testing.T) { w := GetRNibReader() e := errors.New(errMsg) var data []string - sdlInstanceMock.On("GetMembers", "ENB").Return(data, e) + sdlInstanceMock.On("GetMembers", EnbType).Return(data, e) ids, er := w.GetListEnbIds() assert.NotNil(t, er) assert.Nil(t, ids) @@ -496,45 +580,22 @@ func TestGetListEnbIdsSdlgoFailure(t *testing.T) { } func TestGetCountGnbListOneId(t *testing.T) { - name := "name" - plmnId := "02f829" - nbId := "4a952a0a" readerPool = nil sdlInstanceMock := initSdlInstanceMock(namespace, 1) w := GetRNibReader() - nbIdentity := &entities.NbIdentity{InventoryName: name, GlobalNbId: &entities.GlobalNbId{PlmnId: plmnId, NbId: nbId}} var e error - data, err := proto.Marshal(nbIdentity) - if err != nil { - t.Errorf("#rNibReader_test.TestGetCountGnbList - Failed to marshal nodeb identity entity. Error: %v", err) - } - sdlInstanceMock.On("GetMembers", "GNB").Return([]string{string(data)}, e) + sdlInstanceMock.On("GroupSize", GnbType).Return(1, e) count, er := w.GetCountGnbList() assert.Nil(t, er) assert.Equal(t, count, 1) } func TestGetCountGnbList(t *testing.T) { - listSize := 3 - name := "name" - plmnId := 0x02f823 - nbId := 0x4a952a1f readerPool = nil sdlInstanceMock := initSdlInstanceMock(namespace, 1) w := GetRNibReader() var e error - idsData := make([]string, listSize) - idsEntities := make([]*entities.NbIdentity, listSize) - for i := 0; i < listSize; i++ { - nbIdentity := &entities.NbIdentity{InventoryName: name, GlobalNbId: &entities.GlobalNbId{PlmnId: string(plmnId + i), NbId: string(nbId + i)}} - data, err := proto.Marshal(nbIdentity) - if err != nil { - t.Errorf("#rNibReader_test.TestGetListGnbIds - Failed to marshal nodeb identity entity. Error: %v", err) - } - idsData[i] = string(data) - idsEntities[i] = nbIdentity - } - sdlInstanceMock.On("GetMembers", "GNB").Return(idsData, e) + sdlInstanceMock.On("GroupSize", GnbType).Return(3, e) count, er := w.GetCountGnbList() assert.Nil(t, er) assert.Equal(t, count, 3) @@ -547,8 +608,8 @@ func TestGetCountGnbListSdlgoFailure(t *testing.T) { sdlInstanceMock := initSdlInstanceMock(namespace, 1) w := GetRNibReader() e := errors.New(errMsg) - var data []string - sdlInstanceMock.On("GetMembers", "GNB").Return(data, e) + var count int + sdlInstanceMock.On("GroupSize", GnbType).Return(count, e) count, er := w.GetCountGnbList() assert.NotNil(t, er) assert.Equal(t, 0, count) @@ -558,8 +619,7 @@ func TestGetCountGnbListSdlgoFailure(t *testing.T) { func TestGetCell(t *testing.T) { name := "name" - var pci uint32 - pci = 10 + var pci uint32 = 10 readerPool = nil sdlInstanceMock := initSdlInstanceMock(namespace, 1) w := GetRNibReader() @@ -700,7 +760,7 @@ func TestGetNodebByIdNotFoundFailureEnb(t *testing.T) { assert.NotNil(t, er) assert.Nil(t, getNb) assert.Equal(t, 1, er.GetCode()) - assert.EqualValues(t, "1 RESOURCE_NOT_FOUND - #rNibReader.GetNodebByGlobalNbId - responding node not found, global nodeb Id: ENB:02f829:4a952a0a", er.Error()) + assert.EqualValues(t, "1 RESOURCE_NOT_FOUND - #rNibReader.getNodeb - responding node not found. Key: ENB:02f829:4a952a0a", er.Error()) } func TestGetNodebByIdNotFoundFailureGnb(t *testing.T) { @@ -721,7 +781,7 @@ func TestGetNodebByIdNotFoundFailureGnb(t *testing.T) { assert.NotNil(t, er) assert.Nil(t, getNb) assert.Equal(t, 1, er.GetCode()) - assert.EqualValues(t, "1 RESOURCE_NOT_FOUND - #rNibReader.GetNodebByGlobalNbId - responding node not found, global nodeb Id: GNB:02f829:4a952a0a", er.Error()) + assert.EqualValues(t, "1 RESOURCE_NOT_FOUND - #rNibReader.getNodeb - responding node not found. Key: GNB:02f829:4a952a0a", er.Error()) } func TestGetNodeByIdUnmarshalFailure(t *testing.T) { @@ -771,8 +831,7 @@ func TestGetNodeByIdSdlgoFailure(t *testing.T) { func TestGetCellById(t *testing.T) { cellId := "aaaa" - var pci uint32 - pci = 10 + var pci uint32 = 10 readerPool = nil sdlInstanceMock := initSdlInstanceMock(namespace, 1) w := GetRNibReader() -- 2.16.6