Add tests for dtoverlay management in config.txt

This commit is contained in:
Felipe Lalanne 2024-02-06 12:50:00 -03:00
parent c90c02806f
commit 55a8c5bf90
2 changed files with 142 additions and 7 deletions

View File

@ -4,6 +4,7 @@ import { stripIndent } from 'common-tags';
import { expect } from 'chai'; import { expect } from 'chai';
import * as hostUtils from '~/lib/host-utils'; import * as hostUtils from '~/lib/host-utils';
import { promises as fs } from 'fs';
import { ConfigTxt } from '~/src/config/backends/config-txt'; import { ConfigTxt } from '~/src/config/backends/config-txt';
describe('config/config-txt', () => { describe('config/config-txt', () => {
@ -18,7 +19,8 @@ describe('config/config-txt', () => {
avoid_warnings=1 avoid_warnings=1
gpu_mem=16 gpu_mem=16
hdmi_force_hotplug:1=1 hdmi_force_hotplug:1=1
dtoverlay=lirc-rpi,gpio_out_pin=17,gpio_in_pin=13`, dtoverlay=lirc-rpi,gpio_out_pin=17,gpio_in_pin=13
dtparam=gpio_out_pin=17`,
}).enable(); }).enable();
const configTxt = new ConfigTxt(); const configTxt = new ConfigTxt();
@ -26,18 +28,147 @@ describe('config/config-txt', () => {
// Will try to parse /test/data/mnt/boot/config.txt // Will try to parse /test/data/mnt/boot/config.txt
await expect(configTxt.getBootConfig()).to.eventually.deep.equal({ await expect(configTxt.getBootConfig()).to.eventually.deep.equal({
dtparam: ['i2c=on', 'audio=on'], dtparam: ['i2c=on', 'audio=on'],
dtoverlay: ['ads7846', 'lirc-rpi,gpio_out_pin=17,gpio_in_pin=13'], dtoverlay: [
'ads7846',
'lirc-rpi,gpio_out_pin=17,gpio_in_pin=13,gpio_out_pin=17',
],
enable_uart: '1', enable_uart: '1',
avoid_warnings: '1', avoid_warnings: '1',
gpu_mem: '16', gpu_mem: '16',
initramfs: 'initramf.gz 0x00800000', initramfs: 'initramf.gz 0x00800000',
// This syntax is supported by the backend but not the cloud side
'hdmi_force_hotplug:1': '1', 'hdmi_force_hotplug:1': '1',
}); });
await tfs.restore(); await tfs.restore();
}); });
it('correctly parses a config.txt file with an empty overlay', async () => {
const tfs = await testfs({
[hostUtils.pathOnBoot('config.txt')]: stripIndent`
initramfs initramf.gz 0x00800000
dtoverlay=lirc-rpi,gpio_out_pin=17,gpio_in_pin=13
dtparam=gpio_out_pin=17
enable_uart=1
avoid_warnings=1
dtoverlay=
dtparam=i2c=on
dtparam=audio=on
dtoverlay=ads7846
gpu_mem=16
hdmi_force_hotplug:1=1
`,
}).enable();
const configTxt = new ConfigTxt();
// Will try to parse /test/data/mnt/boot/config.txt
await expect(configTxt.getBootConfig()).to.eventually.deep.equal({
dtparam: ['i2c=on', 'audio=on'],
dtoverlay: [
'lirc-rpi,gpio_out_pin=17,gpio_in_pin=13,gpio_out_pin=17',
'ads7846',
],
enable_uart: '1',
avoid_warnings: '1',
gpu_mem: '16',
initramfs: 'initramf.gz 0x00800000',
'hdmi_force_hotplug:1': '1',
});
await tfs.restore();
});
it('maintains ordering of dtoverlays and dtparams', async () => {
const tfs = await testfs({
[hostUtils.pathOnBoot('config.txt')]: stripIndent`
initramfs initramf.gz 0x00800000
dtparam=i2c=on
dtparam=audio=on
dtoverlay=ads7846
enable_uart=1
avoid_warnings=1
gpu_mem=16
hdmi_force_hotplug:1=1
dtoverlay=lirc-rpi,gpio_out_pin=17,gpio_in_pin=13
dtoverlay=ads1015,addr=0x48,cha_enable=true
dtparam=chb_enable=true
dtparam=chc_enable=true
`,
}).enable();
const configTxt = new ConfigTxt();
// Will try to parse /test/data/mnt/boot/config.txt
await expect(configTxt.getBootConfig()).to.eventually.deep.equal({
dtparam: ['i2c=on', 'audio=on'],
dtoverlay: [
'ads7846',
'lirc-rpi,gpio_out_pin=17,gpio_in_pin=13',
'ads1015,addr=0x48,cha_enable=true,chb_enable=true,chc_enable=true',
],
enable_uart: '1',
avoid_warnings: '1',
gpu_mem: '16',
initramfs: 'initramf.gz 0x00800000',
'hdmi_force_hotplug:1': '1',
});
await tfs.restore();
});
it('splits dtoverlays into params to stay under the 80 char limit', async () => {
const tfs = await testfs({
[hostUtils.pathOnBoot('config.txt')]: stripIndent`
enable_uart=1
dtparam=i2c_arm=on
dtparam=spi=on
disable_splash=1
dtparam=audio=on
gpu_mem=16
`,
}).enable();
const configTxt = new ConfigTxt();
await configTxt.setBootConfig({
dtparam: ['i2c=on', 'audio=on'],
dtoverlay: [
'ads7846',
'lirc-rpi,gpio_out_pin=17,gpio_in_pin=13',
'ads1015,addr=0x48,cha_enable=true,chb_enable=true',
],
enable_uart: '1',
avoid_warnings: '1',
gpu_mem: '256',
initramfs: 'initramf.gz 0x00800000',
'hdmi_force_hotplug:1': '1',
});
// Confirm that the file was written correctly
await expect(
fs.readFile(hostUtils.pathOnBoot('config.txt'), 'utf8'),
).to.eventually.equal(
stripIndent`
dtparam=i2c=on
dtparam=audio=on
enable_uart=1
avoid_warnings=1
gpu_mem=256
initramfs initramf.gz 0x00800000
hdmi_force_hotplug:1=1
dtoverlay=ads7846
dtoverlay=lirc-rpi
dtparam=gpio_out_pin=17
dtparam=gpio_in_pin=13
dtoverlay=ads1015
dtparam=addr=0x48
dtparam=cha_enable=true
dtparam=chb_enable=true
` + '\n',
);
await tfs.restore();
});
it('ensures required fields are written to config.txt', async () => { it('ensures required fields are written to config.txt', async () => {
const tfs = await testfs({ const tfs = await testfs({
[hostUtils.pathOnBoot('config.txt')]: stripIndent` [hostUtils.pathOnBoot('config.txt')]: stripIndent`

View File

@ -260,10 +260,12 @@ describe('device-config', () => {
initramfs initramf.gz 0x00800000 initramfs initramf.gz 0x00800000
dtparam=i2c=on dtparam=i2c=on
dtparam=audio=off dtparam=audio=off
dtoverlay=lirc-rpi,gpio_out_pin=17,gpio_in_pin=13
dtoverlay=balena-fin
foobar=bat foobar=bat
foobaz=bar foobaz=bar
dtoverlay=lirc-rpi
dtparam=gpio_out_pin=17
dtparam=gpio_in_pin=13
dtoverlay=balena-fin
` + '\n', // add newline because stripIndent trims last newline ` + '\n', // add newline because stripIndent trims last newline
); );
}); });
@ -301,10 +303,12 @@ describe('device-config', () => {
initramfs initramf.gz 0x00800000 initramfs initramf.gz 0x00800000
dtparam=i2c=on dtparam=i2c=on
dtparam=audio=off dtparam=audio=off
dtoverlay=lirc-rpi,gpio_out_pin=17,gpio_in_pin=13
dtoverlay=balena-fin
foobar=bat foobar=bat
foobaz=bar foobaz=bar
dtoverlay=lirc-rpi
dtparam=gpio_out_pin=17
dtparam=gpio_in_pin=13
dtoverlay=balena-fin
` + '\n', // add newline because stripIndent trims last newline ` + '\n', // add newline because stripIndent trims last newline
); );
}); });