87 lines
2.6 KiB
Dart
87 lines
2.6 KiB
Dart
import 'package:abawo_bt_app/model/shifter_types.dart';
|
|
import 'package:abawo_bt_app/service/dfu_protocol.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
void main() {
|
|
group('DfuProtocol CRC32', () {
|
|
test('matches known vector', () {
|
|
final crc = DfuProtocol.crc32('123456789'.codeUnits);
|
|
expect(crc, 0xCBF43926);
|
|
});
|
|
});
|
|
|
|
group('DfuProtocol control payload encoding', () {
|
|
test('encodes START payload with exact 11-byte LE layout', () {
|
|
final payload = DfuProtocol.encodeStartPayload(
|
|
const DfuStartPayload(
|
|
totalLength: 0x1234,
|
|
imageCrc32: 0x89ABCDEF,
|
|
sessionId: 0x22,
|
|
flags: universalShifterDfuFlagEncrypted,
|
|
),
|
|
);
|
|
|
|
expect(payload.length, 11);
|
|
expect(
|
|
payload,
|
|
[
|
|
universalShifterDfuOpcodeStart,
|
|
0x34,
|
|
0x12,
|
|
0x00,
|
|
0x00,
|
|
0xEF,
|
|
0xCD,
|
|
0xAB,
|
|
0x89,
|
|
0x22,
|
|
universalShifterDfuFlagEncrypted,
|
|
],
|
|
);
|
|
});
|
|
|
|
test('encodes FINISH and ABORT payloads as one byte', () {
|
|
expect(
|
|
DfuProtocol.encodeFinishPayload(), [universalShifterDfuOpcodeFinish]);
|
|
expect(
|
|
DfuProtocol.encodeAbortPayload(), [universalShifterDfuOpcodeAbort]);
|
|
});
|
|
});
|
|
|
|
group('DfuProtocol data frame building', () {
|
|
test('builds 64-byte frames and handles final partial payload', () {
|
|
final image = List<int>.generate(80, (index) => index);
|
|
final frames = DfuProtocol.buildDataFrames(image);
|
|
|
|
expect(frames.length, 2);
|
|
|
|
expect(frames[0].sequence, 0);
|
|
expect(frames[0].offset, 0);
|
|
expect(frames[0].payloadLength, universalShifterDfuFramePayloadSizeBytes);
|
|
expect(frames[0].bytes.length, universalShifterDfuFrameSizeBytes);
|
|
expect(frames[0].bytes.sublist(1, 64), image.sublist(0, 63));
|
|
|
|
expect(frames[1].sequence, 1);
|
|
expect(frames[1].offset, 63);
|
|
expect(frames[1].payloadLength, 17);
|
|
expect(frames[1].bytes.length, universalShifterDfuFrameSizeBytes);
|
|
expect(frames[1].bytes.sublist(1, 18), image.sublist(63, 80));
|
|
});
|
|
});
|
|
|
|
group('DfuProtocol sequence and ACK helpers', () {
|
|
test('wraps sequence values and computes ack+1 rewind', () {
|
|
expect(DfuProtocol.nextSequence(0x00), 0x01);
|
|
expect(DfuProtocol.nextSequence(0xFF), 0x00);
|
|
|
|
expect(DfuProtocol.rewindSequenceFromAck(0x05), 0x06);
|
|
expect(DfuProtocol.rewindSequenceFromAck(0xFF), 0x00);
|
|
});
|
|
|
|
test('computes wrapping sequence distance', () {
|
|
expect(DfuProtocol.sequenceDistance(250, 2), 8);
|
|
expect(DfuProtocol.sequenceDistance(1, 1), 0);
|
|
});
|
|
});
|
|
}
|