Skip to content

Commit e1170a0

Browse files
hex-mem-info: Add tests.
1 parent bd091f5 commit e1170a0

File tree

2 files changed

+139
-1
lines changed

2 files changed

+139
-1
lines changed

src/__tests__/flash-regions.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import * as fs from 'fs';
66

77
import * as flashRegions from '../flash-regions';
88

9-
describe('Read MicroPython UICR data.', () => {
9+
describe('Read MicroPython flash regions data.', () => {
1010
const uPyHexFile = fs.readFileSync(
1111
'./src/__tests__/upy-v2-beta-region.hex',
1212
'utf8'

src/__tests__/hex-mem-info.spec.ts

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
/**
2+
* (c) 2021 Micro:bit Educational Foundation and the microbit-fs contributors.
3+
* SPDX-License-Identifier: MIT
4+
*/
5+
import * as fs from 'fs';
6+
7+
import { getIntelHexDeviceMemInfo } from '../hex-mem-info';
8+
9+
describe('Read MicroPython V1 UICR hex mem info data.', () => {
10+
const uPy1HexFile = fs.readFileSync('./src/__tests__/upy-v1.0.1.hex', 'utf8');
11+
const uPy2HexFile = fs.readFileSync(
12+
'./src/__tests__/upy-v2-beta-uicr.hex',
13+
'utf8'
14+
);
15+
16+
it('Read MicroPython v1.0.1 hex file UICR', () => {
17+
const expectedPageSize = 1024;
18+
const expectedFlashSize = 256 * 1024;
19+
const expectedFlashStartAddress = 0;
20+
const expectedFlashEndAddress = 256 * 1024;
21+
const expectedRuntimeStartPage = 0;
22+
const MicroPythonLastByteUsed = 0x388b8;
23+
const expectedRuntimeEndPage = Math.ceil(
24+
MicroPythonLastByteUsed / expectedPageSize
25+
);
26+
const expectedRuntimeEndAddress = expectedRuntimeEndPage * expectedPageSize;
27+
const expectedFsStartAddress = expectedRuntimeEndAddress;
28+
const expectedFsEndAddress = expectedFlashEndAddress;
29+
const expectedVersionAddress = 0x036d2d;
30+
const expectedUPyVersion =
31+
'micro:bit v1.0.1+b0bf4a9 on 2018-12-13; ' +
32+
'MicroPython v1.9.2-34-gd64154c73 on 2017-09-01';
33+
const expectedDeviceVersion = 'V1';
34+
35+
const result = getIntelHexDeviceMemInfo(uPy1HexFile);
36+
37+
expect(result.flashPageSize).toEqual(expectedPageSize);
38+
expect(result.flashSize).toEqual(expectedFlashSize);
39+
expect(result.flashStartAddress).toEqual(expectedFlashStartAddress);
40+
expect(result.flashEndAddress).toEqual(expectedFlashEndAddress);
41+
expect(result.runtimeStartAddress).toEqual(
42+
expectedRuntimeStartPage * expectedPageSize
43+
);
44+
expect(result.runtimeEndAddress).toEqual(
45+
expectedRuntimeEndPage * expectedPageSize
46+
);
47+
expect(result.fsStartAddress).toEqual(expectedFsStartAddress);
48+
expect(result.fsEndAddress).toEqual(expectedFsEndAddress);
49+
expect(result.uPyVersion).toEqual(expectedUPyVersion);
50+
expect(result.deviceVersion).toEqual(expectedDeviceVersion);
51+
});
52+
53+
it('Read MicroPython v2.0.0 beta hex file UICR', () => {
54+
const expectedPageSize = 4096;
55+
const expectedFlashSize = 512 * 1024;
56+
const expectedFlashStartAddress = 0;
57+
const expectedFlashEndAddress = 512 * 1024;
58+
const expectedRuntimeStartPage = 0;
59+
// This is the last address used, but the UICR has been manually created
60+
// to indicate 104 pages used
61+
const MicroPythonLastByteUsed = 0x607e4;
62+
const expectedRuntimeEndPage = 109;
63+
const expectedFsStartAddress = 0x6d000;
64+
const expectedFsEndAddress = 0x73000;
65+
const expectedVersionAddress = 0x05895c;
66+
const expectedUPyVersion =
67+
'micro:bit v2.0.99+3e09245 on 2020-11-02; ' +
68+
'MicroPython 3e09245 on 2020-11-02';
69+
const expectedDeviceVersion = 'V2';
70+
71+
const result = getIntelHexDeviceMemInfo(uPy2HexFile);
72+
73+
expect(result.flashPageSize).toEqual(expectedPageSize);
74+
expect(result.flashSize).toEqual(expectedFlashSize);
75+
expect(result.flashStartAddress).toEqual(expectedFlashStartAddress);
76+
expect(result.flashEndAddress).toEqual(expectedFlashEndAddress);
77+
expect(result.runtimeStartAddress).toEqual(
78+
expectedRuntimeStartPage * expectedPageSize
79+
);
80+
expect(result.runtimeEndAddress).toEqual(
81+
expectedRuntimeEndPage * expectedPageSize
82+
);
83+
expect(result.fsStartAddress).toEqual(expectedFsStartAddress);
84+
expect(result.fsEndAddress).toEqual(expectedFsEndAddress);
85+
expect(result.uPyVersion).toEqual(expectedUPyVersion);
86+
expect(result.deviceVersion).toEqual(expectedDeviceVersion);
87+
});
88+
89+
it('UICR data without MicroPython magic number', () => {
90+
const makeCodeUicr =
91+
':020000041000EA\n' +
92+
':0410140000C0030015\n' +
93+
':040000050003C0C173\n' +
94+
':00000001FF\n';
95+
96+
const failCase = () => {
97+
const result = getIntelHexDeviceMemInfo(makeCodeUicr);
98+
};
99+
100+
expect(failCase).toThrow(Error);
101+
});
102+
});
103+
104+
describe('Read MicroPython V2 flash regions data.', () => {
105+
const uPyHexFile = fs.readFileSync(
106+
'./src/__tests__/upy-v2-beta-region.hex',
107+
'utf8'
108+
);
109+
110+
it('Read MicroPython v2-beta-region hex file flash regions table', () => {
111+
const expectedPageSize = 4096;
112+
const expectedFlashSize = 512 * 1024;
113+
const MicroPythonLastByteUsed = 0x61f24;
114+
const expectedRuntimeEndPage = Math.ceil(
115+
MicroPythonLastByteUsed / expectedPageSize
116+
);
117+
const expectedFsStartAddress = 0x6d000;
118+
const expectedFsEndAddress = 0x73000;
119+
const expectedUpyVersion =
120+
'micro:bit v2.0.99+b260810 on 2020-11-17; ' +
121+
'MicroPython b260810 on 2020-11-17';
122+
123+
const result = getIntelHexDeviceMemInfo(uPyHexFile);
124+
125+
expect(result.flashPageSize).toEqual(expectedPageSize);
126+
expect(result.flashSize).toEqual(expectedFlashSize);
127+
expect(result.flashStartAddress).toEqual(0);
128+
expect(result.flashEndAddress).toEqual(expectedFlashSize);
129+
expect(result.runtimeStartAddress).toEqual(0);
130+
expect(result.runtimeEndAddress).toEqual(
131+
expectedRuntimeEndPage * expectedPageSize
132+
);
133+
expect(result.fsStartAddress).toEqual(expectedFsStartAddress);
134+
expect(result.fsEndAddress).toEqual(expectedFsEndAddress);
135+
expect(result.uPyVersion).toEqual(expectedUpyVersion);
136+
expect(result.deviceVersion).toEqual('V2');
137+
});
138+
});

0 commit comments

Comments
 (0)