This commit is contained in:
Kevin L'Hereec committed 2026-06-08 16:35:33 +02:00
1 parent 08c620ee68
commit dae82eeff2
5 files changed
+114 -11

No files matched your search

@@ -502,6 +502,69 @@ describe('FirmwareUpgradeState — download callback', () => {
})
describe('ConfigurationEvaluationState — inventory phase 2 GPV saves values on device', () => {
beforeEach(() => {
vi.clearAllMocks()
})
it('GPV callback in phase 2 calls updateFromValues so parameters are persisted', async () => {
const config = makeConfig({
desiredParameters: [{ name: 'Device.X', value: '1', type: 'string' }],
inventory: [{ path: 'Device.ManagementServer.' }],
})
vi.mocked(ConfigurationModel.find).mockResolvedValue([config])
const device = makeDevice()
device.setGpnStatus('supported')
const context = makeContext(device)
const state = new ConfigurationEvaluationState()
// Step 1: first handle → sends GPN for inventory
await state.handle(context as any)
// Step 2: execute GPN callback with two leaf names
const taskCallbacks = (context.taskQueue as any).taskCallbacks as Map<string, any>
const gpnTaskId = Array.from(taskCallbacks.keys())[0]
await context.taskQueue.executeTaskCallback(gpnTaskId!, ResultStatus.Success, {
ParameterList: {
ParameterInfoStruct: [
{ Name: 'Device.ManagementServer.PeriodicInformInterval', Writable: '1' },
{ Name: 'Device.ManagementServer.ConnectionRequestURL', Writable: '0' },
],
},
})
// Step 3: second handle → sends GPV for discovered leaves (phase 2)
const result2 = await state.handle(context as any)
expect(result2.response).toContain('GetParameterValues')
// Before GPV callback — device has no value for PeriodicInformInterval
const before = device.getParameters().find((p) => p.name === 'Device.ManagementServer.PeriodicInformInterval')
expect(before?.value ?? null).toBeNull()
// Step 4: execute GPV callback with actual values
const gpvTaskId = Array.from(taskCallbacks.keys()).pop()
await context.taskQueue.executeTaskCallback(gpvTaskId!, ResultStatus.Success, {
ParameterList: {
ParameterValueStruct: [
{ Name: 'Device.ManagementServer.PeriodicInformInterval', Value: { _: '3600', $: { 'xsi:type': 'xsd:unsignedInt' } } },
{ Name: 'Device.ManagementServer.ConnectionRequestURL', Value: { _: 'http://cpe/cr', $: { 'xsi:type': 'xsd:string' } } },
],
},
})
// After GPV callback — device must have the values saved
const after = device.getParameters().find((p) => p.name === 'Device.ManagementServer.PeriodicInformInterval')
expect(after).toBeDefined()
expect(after!.value).toBe('3600')
const afterURL = device.getParameters().find((p) => p.name === 'Device.ManagementServer.ConnectionRequestURL')
expect(afterURL).toBeDefined()
expect(afterURL!.value).toBe('http://cpe/cr')
})
})
describe('ConfigurationEvaluationState — firmware upgrade transition (lines 154-158)', () => {
beforeEach(() => {
vi.clearAllMocks()
+5 -2
View File
@@ -204,13 +204,16 @@ describe('CWMPTaskQueue — branch coverage', () => {
const tq = new CWMPTaskQueue()
const deviceId = new DeviceId('X', 'Y', 'Z', 'S')
tq.addCWMPTask(deviceId, 'get_parameter_values', ['a']) // PENDING
const pendingTask = tq.addCWMPTask(deviceId, 'get_parameter_values', ['a']) // PENDING
const { taskId: sentId } = tq.addTask(deviceId, 'set_parameter_values', {}, async () => '') // SENT
tq.clearPendingTasksForDevice(deviceId)
// clearPendingTasksForDevice clears ALL tasks (PENDING and SENT) to avoid
// ghost entries bleeding into the next session
const tasks = (tq as any).tasks as Map<string, any>
expect(tasks.has(sentId)).toBe(true)
expect(tasks.has(pendingTask.id)).toBe(false)
expect(tasks.has(sentId)).toBe(false)
})
it('registerCallback adds callback for existing task', () => {