Copyright(C) 2025. Huawei Technologies Co.,Ltd. All rights reserved.
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.
*/
package dcmi
import (
"errors"
"fmt"
"math"
"reflect"
"testing"
"github.com/agiledragon/gomonkey/v2"
"github.com/stretchr/testify/assert"
)
const (
mockCardId0 = 0
mockInvalidCardId = -1
mockDeviceId0 = 0
mockDeviceId1 = 1
mockInvalidDeviceId = -1
mockVDeviceId = 100
mockInvalidVDeviceId = -1
mockUniqueId = 10
mockCoreString = "vir04"
mockCardListLength = 2
mockDeviceNum = 2
mockProductType = "Ascend310"
mockA950ProductType = "Ascend950"
EmptyDeviceNum = 0
)
var mockCardList = []int32{0, 1}
var mockChipInfo = &ChipInfo{
Name: "Ascend310",
Type: "AI Processor",
Version: "1.0",
}
var mockA950ChipInfo = &ChipInfo{
Name: "Ascend950",
Type: "AI Processor",
Version: "2.0",
}
type MockDcV1Driver struct {
initializeFunc func() error
shutdownFunc func()
getCardListFunc func() (int32, []int32, error)
getDeviceNumFunc func(cardID int32) (int32, error)
getLogicIDFunc func(cardID, deviceID int32) (int32, error)
getProductTypeFunc func(cardID, deviceID int32) (string, error)
createVDeviceFunc func(cardID, deviceID int32, coreNum string) (int32, error)
destroyVDeviceFunc func(cardID, deviceID int32, vDevID int32) error
getChipInfoFunc func(cardID, deviceID int32) (*ChipInfo, error)
getDeviceLogicidFromPhyid func(phyID int32) (int32, error)
}
func (m *MockDcV1Driver) DcGetDeviceLogicidFromPhyid(phyID int32) (int32, error) {
if m.initializeFunc != nil {
return m.getDeviceLogicidFromPhyid(phyID)
}
return 0, nil
}
func (m *MockDcV1Driver) DcInitialize() error {
if m.initializeFunc != nil {
return m.initializeFunc()
}
return nil
}
func (m *MockDcV1Driver) DcShutDown() {
if m.shutdownFunc != nil {
m.shutdownFunc()
}
}
func (m *MockDcV1Driver) DcGetCardList() (int32, []int32, error) {
if m.getCardListFunc != nil {
return m.getCardListFunc()
}
return 0, []int32{}, nil
}
func (m *MockDcV1Driver) DcGetDeviceNumInCard(cardID int32) (int32, error) {
if m.getDeviceNumFunc != nil {
return m.getDeviceNumFunc(cardID)
}
return 0, nil
}
func (m *MockDcV1Driver) DcGetDeviceLogicID(cardID, deviceID int32) (int32, error) {
if m.getLogicIDFunc != nil {
return m.getLogicIDFunc(cardID, deviceID)
}
return 0, nil
}
func (m *MockDcV1Driver) DcGetProductType(cardID, deviceID int32) (string, error) {
if m.getProductTypeFunc != nil {
return m.getProductTypeFunc(cardID, deviceID)
}
return "", nil
}
func (m *MockDcV1Driver) DcCreateVDevice(cardID, deviceID int32, coreNum string) (int32, error) {
if m.createVDeviceFunc != nil {
return m.createVDeviceFunc(cardID, deviceID, coreNum)
}
return 0, nil
}
func (m *MockDcV1Driver) DcDestroyVDevice(cardID, deviceID int32, vDevID int32) error {
if m.destroyVDeviceFunc != nil {
return m.destroyVDeviceFunc(cardID, deviceID, vDevID)
}
return nil
}
func (m *MockDcV1Driver) DcGetChipInfo(cardID, deviceID int32) (*ChipInfo, error) {
if m.getChipInfoFunc != nil {
return m.getChipInfoFunc(cardID, deviceID)
}
return nil, nil
}
type MockDcV2Driver struct {
initializeFunc func() error
shutdownFunc func()
getDeviceListFunc func() (int32, []int32, error)
createVDeviceFunc func(deviceID int32, coreNum string) (int32, error)
destroyVDeviceFunc func(deviceID int32, vDevID int32) error
getChipInfoFunc func(deviceID int32) (*ChipInfo, error)
}
func (m *MockDcV2Driver) DcInitialize() error {
if m.initializeFunc != nil {
return m.initializeFunc()
}
return nil
}
func (m *MockDcV2Driver) DcShutDown() {
if m.shutdownFunc != nil {
m.shutdownFunc()
}
}
func (m *MockDcV2Driver) DcGetDeviceList() (int32, []int32, error) {
if m.getDeviceListFunc != nil {
return m.getDeviceListFunc()
}
return 0, []int32{}, nil
}
func (m *MockDcV2Driver) DcCreateVDevice(deviceID int32, coreNum string) (int32, error) {
if m.createVDeviceFunc != nil {
return m.createVDeviceFunc(deviceID, coreNum)
}
return 0, nil
}
func (m *MockDcV2Driver) DcDestroyVDevice(deviceID int32, vDevID int32) error {
if m.destroyVDeviceFunc != nil {
return m.destroyVDeviceFunc(deviceID, vDevID)
}
return nil
}
func (m *MockDcV2Driver) DcGetChipInfo(deviceID int32) (*ChipInfo, error) {
if m.getChipInfoFunc != nil {
return m.getChipInfoFunc(deviceID)
}
return nil, nil
}
type MockNpuV1Worker struct {
*NpuV1Worker
}
type MockNpuV2Worker struct {
*NpuV2Worker
}
func TestIsValidCardID(t *testing.T) {
tests := []struct {
name string
cardID int32
want bool
}{
{"valid card id", 0, true},
{"valid card id max", math.MaxInt32 - 1, true},
{"valid card id boundary", math.MaxInt32, false},
{"invalid negative", -1, false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := isValidCardID(tt.cardID)
assert.Equal(t, tt.want, got)
})
}
}
func TestIsValidDeviceID(t *testing.T) {
tests := []struct {
name string
deviceID int32
want bool
}{
{"valid device id min", 0, true},
{"valid device id max", 3, true},
{"invalid negative", -1, false},
{"invalid too large", 4, false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := isValidDeviceID(tt.deviceID)
assert.Equal(t, tt.want, got)
})
}
}
func TestIsValidCardIDAndDeviceID(t *testing.T) {
tests := []struct {
name string
cardID int32
deviceID int32
want bool
}{
{"both valid", 0, 0, true},
{"card invalid", -1, 0, false},
{"device invalid", 0, 4, false},
{"both invalid", -1, 4, false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := isValidCardIDAndDeviceID(tt.cardID, tt.deviceID)
assert.Equal(t, tt.want, got)
})
}
}
func TestIsValidA950DeviceID(t *testing.T) {
tests := []struct {
name string
deviceID int32
want bool
}{
{"valid device id min", 0, true},
{"valid device id max", math.MaxInt32 - 1, true},
{"valid boundary", math.MaxInt32, false},
{"invalid negative", -1, false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := isValidA950DeviceID(tt.deviceID)
assert.Equal(t, tt.want, got)
})
}
}
func TestIsValidChipInfo(t *testing.T) {
tests := []struct {
name string
chip *ChipInfo
want bool
}{
{
name: "all fields empty",
chip: &ChipInfo{},
want: false,
},
{
name: "only name",
chip: &ChipInfo{Name: "Ascend310"},
want: true,
},
{
name: "only type",
chip: &ChipInfo{Type: "AI Processor"},
want: true,
},
{
name: "only version",
chip: &ChipInfo{Version: "1.0"},
want: true,
},
{
name: "all fields",
chip: &ChipInfo{Name: "Ascend310", Type: "AI Processor", Version: "1.0"},
want: true,
},
{
name: "nil chip",
chip: nil,
want: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := isValidChipInfo(tt.chip)
assert.Equal(t, tt.want, got)
})
}
}
func TestNpuV1WorkerInitialize(t *testing.T) {
mockDriver := &MockDcV1Driver{
initializeFunc: func() error {
return nil
},
}
worker := &NpuV1Worker{DcMgr: mockDriver}
err := worker.Initialize()
assert.NoError(t, err)
mockDriverWithErr := &MockDcV1Driver{
initializeFunc: func() error {
return errors.New("init failed")
},
}
workerWithErr := &NpuV1Worker{DcMgr: mockDriverWithErr}
err = workerWithErr.Initialize()
assert.Error(t, err)
assert.Contains(t, err.Error(), "init failed")
}
func TestNpuV1WorkerShutDown(t *testing.T) {
shutdownCalled := false
mockDriver := &MockDcV1Driver{
shutdownFunc: func() {
shutdownCalled = true
},
}
worker := &NpuV1Worker{DcMgr: mockDriver}
worker.ShutDown()
assert.True(t, shutdownCalled)
}
func TestNpuV1WorkerFindDeviceSuccess(t *testing.T) {
mockDriver := &MockDcV1Driver{
createVDeviceFunc: func(cardID, deviceID int32, coreNum string) (int32, error) {
assert.Equal(t, int32(mockCardId0), cardID)
assert.Equal(t, int32(mockDeviceId1), deviceID)
assert.Equal(t, mockCoreString, coreNum)
return mockVDeviceId, nil
},
}
mockWorker := &MockNpuV1Worker{
NpuV1Worker: &NpuV1Worker{DcMgr: mockDriver},
}
patchFindDevice := gomonkey.ApplyMethod(reflect.TypeOf(&NpuV1Worker{}), "FindDevice", func(f *NpuV1Worker, _ int32) (int32, int32, error) {
return mockDeviceId1, mockCardId0, nil
})
defer patchFindDevice.Reset()
vdevInfo, err := mockWorker.CreateVDevice(mockUniqueId, mockCoreString)
assert.NoError(t, err)
assert.Equal(t, int32(mockCardId0), vdevInfo.CardID)
assert.Equal(t, int32(mockDeviceId1), vdevInfo.DeviceID)
assert.Equal(t, int32(mockVDeviceId), vdevInfo.VdeviceID)
}
func TestNpuV1WorkerFindDeviceError(t *testing.T) {
mockDriver := &MockDcV1Driver{}
mockWorker := &MockNpuV1Worker{
NpuV1Worker: &NpuV1Worker{DcMgr: mockDriver},
}
patchFindDevice := gomonkey.ApplyMethod(reflect.TypeOf(&NpuV1Worker{}), "FindDevice", func(f *NpuV1Worker, _ int32) (int32, int32, error) {
return mockDeviceId0, mockCardId0, fmt.Errorf("find device failed")
})
defer patchFindDevice.Reset()
_, err := mockWorker.CreateVDevice(mockUniqueId, mockCoreString)
assert.Error(t, err)
assert.Contains(t, err.Error(), "find device failed")
}
func TestNpuV1WorkerCreateVDeviceSuccess(t *testing.T) {
mockDriver := &MockDcV1Driver{
createVDeviceFunc: func(cardID, deviceID int32, coreNum string) (int32, error) {
assert.Equal(t, int32(mockCardId0), cardID)
assert.Equal(t, int32(mockDeviceId1), deviceID)
assert.Equal(t, mockCoreString, coreNum)
return mockVDeviceId, nil
},
}
mockWorker := &MockNpuV1Worker{
NpuV1Worker: &NpuV1Worker{DcMgr: mockDriver},
}
patchFindDevice := gomonkey.ApplyMethod(reflect.TypeOf(&NpuV1Worker{}), "FindDevice", func(f *NpuV1Worker, _ int32) (int32, int32, error) {
return mockDeviceId1, mockCardId0, nil
})
defer patchFindDevice.Reset()
vdevInfo, err := mockWorker.CreateVDevice(mockUniqueId, "vir04")
assert.NoError(t, err)
assert.Equal(t, int32(mockCardId0), vdevInfo.CardID)
assert.Equal(t, int32(mockDeviceId1), vdevInfo.DeviceID)
assert.Equal(t, int32(mockVDeviceId), vdevInfo.VdeviceID)
}
func TestNpuV1WorkerCreateVDeviceError(t *testing.T) {
mockDriver := &MockDcV1Driver{
createVDeviceFunc: func(cardID, deviceID int32, coreNum string) (int32, error) {
return mockInvalidVDeviceId, errors.New("create failed")
},
}
mockWorker := &MockNpuV1Worker{
NpuV1Worker: &NpuV1Worker{DcMgr: mockDriver},
}
patchFindDevice := gomonkey.ApplyMethod(reflect.TypeOf(&NpuV1Worker{}), "FindDevice", func(f *NpuV1Worker, _ int32) (int32, int32, error) {
return mockDeviceId1, mockCardId0, nil
})
defer patchFindDevice.Reset()
vdevInfo, err := mockWorker.CreateVDevice(mockUniqueId, mockCoreString)
assert.Error(t, err)
assert.Equal(t, int32(mockInvalidCardId), vdevInfo.CardID)
assert.Equal(t, int32(mockInvalidDeviceId), vdevInfo.DeviceID)
assert.Equal(t, int32(math.MaxInt32), vdevInfo.VdeviceID)
}
func TestNpuV1WorkerDestroyVDeviceSuccess(t *testing.T) {
destroyCalled := false
mockDriver := &MockDcV1Driver{
destroyVDeviceFunc: func(cardID, deviceID int32, vDevID int32) error {
destroyCalled = true
assert.Equal(t, int32(mockCardId0), cardID)
assert.Equal(t, int32(mockDeviceId1), deviceID)
assert.Equal(t, int32(mockVDeviceId), vDevID)
return nil
},
}
mockWorker := &MockNpuV1Worker{
NpuV1Worker: &NpuV1Worker{DcMgr: mockDriver},
}
patchFindDevice := gomonkey.ApplyMethod(reflect.TypeOf(&NpuV1Worker{}), "FindDevice", func(f *NpuV1Worker, _ int32) (int32, int32, error) {
return mockDeviceId1, mockCardId0, nil
})
defer patchFindDevice.Reset()
err := mockWorker.DestroyVDevice(mockUniqueId, mockVDeviceId)
assert.NoError(t, err)
assert.True(t, destroyCalled)
}
func TestNpuV1WorkerDestroyVDeviceInvalidVDevID(t *testing.T) {
mockDriver := &MockDcV1Driver{}
mockWorker := &MockNpuV1Worker{
NpuV1Worker: &NpuV1Worker{DcMgr: mockDriver},
}
patchFindDevice := gomonkey.ApplyMethod(reflect.TypeOf(&NpuV1Worker{}), "FindDevice", func(f *NpuV1Worker, _ int32) (int32, int32, error) {
return mockDeviceId1, mockCardId0, nil
})
defer patchFindDevice.Reset()
err := mockWorker.DestroyVDevice(mockUniqueId, -1)
assert.Error(t, err)
assert.Contains(t, err.Error(), "param error on vDevID")
}
func TestNpuV1WorkerDestroyVDeviceFindDeviceError(t *testing.T) {
mockDriver := &MockDcV1Driver{}
mockWorker := &MockNpuV1Worker{
NpuV1Worker: &NpuV1Worker{DcMgr: mockDriver},
}
patchFindDevice := gomonkey.ApplyMethod(reflect.TypeOf(&NpuV1Worker{}), "FindDevice", func(f *NpuV1Worker, _ int32) (int32, int32, error) {
return mockDeviceId0, mockCardId0, errors.New("find device failed")
})
defer patchFindDevice.Reset()
err := mockWorker.DestroyVDevice(mockUniqueId, mockVDeviceId)
assert.Error(t, err)
assert.Contains(t, err.Error(), "find device failed")
}
func TestNpuV1WorkerGetProductTypeSuccess(t *testing.T) {
mockDriver := &MockDcV1Driver{
initializeFunc: func() error {
return nil
},
shutdownFunc: func() {},
getCardListFunc: func() (int32, []int32, error) {
return mockDeviceNum, mockCardList, nil
},
getDeviceNumFunc: func(cardID int32) (int32, error) {
return mockDeviceNum, nil
},
getProductTypeFunc: func(cardID, deviceID int32) (string, error) {
if cardID == 0 && deviceID == 0 {
return "Ascend310", nil
}
return "", errors.New("not supported")
},
}
worker := &NpuV1Worker{DcMgr: mockDriver}
productType, err := worker.GetProductType()
assert.NoError(t, err)
assert.Equal(t, "Ascend310", productType)
}
func TestNpuV1WorkerGetProductTypeInitError(t *testing.T) {
mockDriver := &MockDcV1Driver{
initializeFunc: func() error {
return errors.New("init failed")
},
}
worker := &NpuV1Worker{DcMgr: mockDriver}
_, err := worker.GetProductType()
assert.Error(t, err)
assert.Contains(t, err.Error(), "cannot init dcmi")
}
func TestNpuV1WorkerGetProductTypeEmptyCardList(t *testing.T) {
mockDriver := &MockDcV1Driver{
initializeFunc: func() error {
return nil
},
shutdownFunc: func() {},
getCardListFunc: func() (int32, []int32, error) {
return 0, []int32{}, errors.New("get card list failed")
},
}
worker := &NpuV1Worker{DcMgr: mockDriver}
productType, err := worker.GetProductType()
assert.Error(t, err)
assert.Equal(t, "", productType)
}
func TestNpuV1WorkerGetProductTypeGetCardListError(t *testing.T) {
mockDriver := &MockDcV1Driver{
initializeFunc: func() error {
return nil
},
shutdownFunc: func() {},
getCardListFunc: func() (int32, []int32, error) {
return 0, nil, errors.New("get card list failed")
},
}
worker := &NpuV1Worker{DcMgr: mockDriver}
_, err := worker.GetProductType()
assert.Error(t, err)
}
func TestNpuV1WorkerGetProductType(t *testing.T) {
mockDriver := &MockDcV1Driver{
initializeFunc: func() error {
return nil
},
shutdownFunc: func() {},
getCardListFunc: func() (int32, []int32, error) {
return mockCardListLength, mockCardList, nil
},
getDeviceNumFunc: func(cardID int32) (int32, error) {
return mockDeviceNum, nil
},
getProductTypeFunc: func(cardID, deviceID int32) (string, error) {
return mockProductType, nil
},
}
worker := &NpuV1Worker{DcMgr: mockDriver}
productType, err := worker.GetProductType()
assert.NoError(t, err)
assert.Equal(t, mockProductType, productType)
}
func TestNpuV1WorkerGetChipNameSuccess(t *testing.T) {
mockDriver := &MockDcV1Driver{
initializeFunc: func() error {
return nil
},
shutdownFunc: func() {},
getCardListFunc: func() (int32, []int32, error) {
return mockCardListLength, mockCardList, nil
},
getDeviceNumFunc: func(cardID int32) (int32, error) {
return mockDeviceNum, nil
},
getChipInfoFunc: func(cardID, deviceID int32) (*ChipInfo, error) {
return mockChipInfo, nil
},
}
worker := &NpuV1Worker{DcMgr: mockDriver}
chipName, err := worker.GetChipName()
assert.NoError(t, err)
assert.Equal(t, mockProductType, chipName)
}
func TestNpuV1WorkerGetChipNameInitError(t *testing.T) {
mockDriver := &MockDcV1Driver{
initializeFunc: func() error {
return errors.New("init failed")
},
}
worker := &NpuV1Worker{DcMgr: mockDriver}
_, err := worker.GetChipName()
assert.Error(t, err)
assert.Contains(t, err.Error(), "cannot init dcmi")
}
func TestNpuV1WorkerGetChipNameGetCardListError(t *testing.T) {
mockDriver := &MockDcV1Driver{
initializeFunc: func() error {
return nil
},
shutdownFunc: func() {},
getCardListFunc: func() (int32, []int32, error) {
return EmptyDeviceNum, nil, errors.New("get card list failed")
},
}
worker := &NpuV1Worker{DcMgr: mockDriver}
_, err := worker.GetChipName()
assert.Error(t, err)
}
func TestNpuV1WorkerGetChipNameNoCardFound(t *testing.T) {
mockDriver := &MockDcV1Driver{
initializeFunc: func() error {
return nil
},
shutdownFunc: func() {},
getCardListFunc: func() (int32, []int32, error) {
return EmptyDeviceNum, []int32{}, nil
},
}
worker := &NpuV1Worker{DcMgr: mockDriver}
_, err := worker.GetChipName()
assert.Error(t, err)
assert.Contains(t, err.Error(), "no card found")
}
func TestNpuV1WorkerGetChipNameSkipInvalidDevices(t *testing.T) {
mockDriver := &MockDcV1Driver{
initializeFunc: func() error {
return nil
},
shutdownFunc: func() {},
getCardListFunc: func() (int32, []int32, error) {
return mockCardListLength, mockCardList, nil
},
getDeviceNumFunc: func(cardID int32) (int32, error) {
return mockDeviceNum, nil
},
getChipInfoFunc: func(cardID, deviceID int32) (*ChipInfo, error) {
return mockChipInfo, nil
},
}
worker := &NpuV1Worker{DcMgr: mockDriver}
chipName, err := worker.GetChipName()
assert.NoError(t, err)
assert.Equal(t, mockProductType, chipName)
}
func TestNpuV1WorkerGetChipNameInvalidChipInfo(t *testing.T) {
mockDriver := &MockDcV1Driver{
initializeFunc: func() error {
return nil
},
shutdownFunc: func() {},
getCardListFunc: func() (int32, []int32, error) {
return mockCardListLength, mockCardList, nil
},
getDeviceNumFunc: func(cardID int32) (int32, error) {
return mockDeviceNum, nil
},
getChipInfoFunc: func(cardID, deviceID int32) (*ChipInfo, error) {
return &ChipInfo{}, nil
},
}
worker := &NpuV1Worker{DcMgr: mockDriver}
_, err := worker.GetChipName()
assert.Error(t, err)
assert.Contains(t, err.Error(), "cannot get valid chip info")
}
func TestNpuV2WorkerInitialize(t *testing.T) {
mockDriver := &MockDcV2Driver{
initializeFunc: func() error {
return nil
},
}
worker := &NpuV2Worker{DcMgr: mockDriver}
err := worker.Initialize()
assert.NoError(t, err)
mockDriverWithErr := &MockDcV2Driver{
initializeFunc: func() error {
return errors.New("init failed")
},
}
workerWithErr := &NpuV2Worker{DcMgr: mockDriverWithErr}
err = workerWithErr.Initialize()
assert.Error(t, err)
}
func TestNpuV2WorkerShutDown(t *testing.T) {
shutdownCalled := false
mockDriver := &MockDcV2Driver{
shutdownFunc: func() {
shutdownCalled = true
},
}
worker := &NpuV2Worker{DcMgr: mockDriver}
worker.ShutDown()
assert.True(t, shutdownCalled)
}
func TestNpuV2WorkerCreateVDeviceError(t *testing.T) {
mockDriver := &MockDcV2Driver{
createVDeviceFunc: func(deviceID int32, coreNum string) (int32, error) {
return mockInvalidVDeviceId, errors.New("create failed")
},
}
worker := &NpuV2Worker{DcMgr: mockDriver}
vdevInfo, err := worker.CreateVDevice(mockUniqueId, "vir04")
assert.Error(t, err)
assert.Equal(t, int32(mockInvalidCardId), vdevInfo.VdeviceID)
assert.Equal(t, int32(mockInvalidDeviceId), vdevInfo.CardID)
assert.Equal(t, int32(mockInvalidVDeviceId), vdevInfo.DeviceID)
}
func TestNpuV2WorkerDestroyVDeviceError(t *testing.T) {
mockDriver := &MockDcV2Driver{
destroyVDeviceFunc: func(deviceID int32, vDevID int32) error {
return errors.New("destroy failed")
},
}
worker := &NpuV2Worker{DcMgr: mockDriver}
err := worker.DestroyVDevice(mockUniqueId, mockVDeviceId)
assert.Error(t, err)
}
func TestNpuV2WorkerGetProductType(t *testing.T) {
worker := &NpuV2Worker{}
productType, err := worker.GetProductType()
assert.NoError(t, err)
assert.Equal(t, "[not support]", productType)
}
func TestNpuV2WorkerGetChipNameSuccess(t *testing.T) {
mockDriver := &MockDcV2Driver{
initializeFunc: func() error {
return nil
},
shutdownFunc: func() {},
getDeviceListFunc: func() (int32, []int32, error) {
return mockDeviceNum, mockCardList, nil
},
getChipInfoFunc: func(deviceID int32) (*ChipInfo, error) {
if deviceID == 0 {
return mockA950ChipInfo, nil
}
return nil, errors.New("not supported")
},
}
worker := &NpuV2Worker{DcMgr: mockDriver}
chipName, err := worker.GetChipName()
assert.NoError(t, err)
assert.Equal(t, mockA950ProductType, chipName)
}
func TestNpuV2WorkerGetChipNameInitError(t *testing.T) {
mockDriver := &MockDcV2Driver{
initializeFunc: func() error {
return errors.New("init failed")
},
}
worker := &NpuV2Worker{DcMgr: mockDriver}
_, err := worker.GetChipName()
assert.Error(t, err)
assert.Contains(t, err.Error(), "cannot init dcmi")
}
func TestNpuV2WorkerGetChipNameGetDeviceListError(t *testing.T) {
mockDriver := &MockDcV2Driver{
initializeFunc: func() error {
return nil
},
shutdownFunc: func() {},
getDeviceListFunc: func() (int32, []int32, error) {
return EmptyDeviceNum, nil, errors.New("get device list failed")
},
}
worker := &NpuV2Worker{DcMgr: mockDriver}
_, err := worker.GetChipName()
assert.Error(t, err)
}
func TestNpuV2WorkerGetChipNameNoDeviceFound(t *testing.T) {
mockDriver := &MockDcV2Driver{
initializeFunc: func() error {
return nil
},
shutdownFunc: func() {},
getDeviceListFunc: func() (int32, []int32, error) {
return EmptyDeviceNum, []int32{}, nil
},
}
worker := &NpuV2Worker{DcMgr: mockDriver}
_, err := worker.GetChipName()
assert.Error(t, err)
assert.Contains(t, err.Error(), "no card found")
}
func TestNpuV2WorkerGetChipNameSkipInvalidDevices(t *testing.T) {
mockDriver := &MockDcV2Driver{
initializeFunc: func() error {
return nil
},
shutdownFunc: func() {},
getDeviceListFunc: func() (int32, []int32, error) {
return mockDeviceNum, mockCardList, nil
},
getChipInfoFunc: func(deviceID int32) (*ChipInfo, error) {
return mockA950ChipInfo, nil
},
}
worker := &NpuV2Worker{DcMgr: mockDriver}
chipName, err := worker.GetChipName()
assert.NoError(t, err)
assert.Equal(t, mockA950ProductType, chipName)
}
func TestGetMatchingNpuV1Worker(t *testing.T) {
originalList := managerList
defer func() { managerList = originalList }()
mockDriver := &MockDcV1Driver{
initializeFunc: func() error {
return nil
},
shutdownFunc: func() {},
}
mockWorker := &NpuV1Worker{DcMgr: mockDriver}
managerList = []WorkerInterface{mockWorker}
worker, err := GetMatchingNpuWorker()
assert.NoError(t, err)
assert.NotNil(t, worker)
mockDriverWithErr := &MockDcV1Driver{
initializeFunc: func() error {
return errors.New("init failed")
},
}
mockWorkerWithErr := &NpuV1Worker{DcMgr: mockDriverWithErr}
managerList = []WorkerInterface{mockWorkerWithErr}
_, err = GetMatchingNpuWorker()
assert.Error(t, err)
assert.Contains(t, err.Error(), "failed to find a valid manager")
failDriver := &MockDcV1Driver{
initializeFunc: func() error {
return errors.New("first failed")
},
}
successDriver := &MockDcV1Driver{
initializeFunc: func() error {
return nil
},
shutdownFunc: func() {},
}
managerList = []WorkerInterface{
&NpuV1Worker{DcMgr: failDriver},
&NpuV1Worker{DcMgr: successDriver},
}
worker, err = GetMatchingNpuWorker()
assert.NoError(t, err)
assert.NotNil(t, worker)
}