This greatly reduces the chance accidentally adding dependencies to the other (currently unused) variables later on. Getting away from depending on deviceinfo has a lot of benefits, but mainly it helps offload device-specific boot configuration to boot-deploy. Handling those complexities in a shell script is often nicer. Also, reducing the need to handle variables that contain lists means that this app doesn't have to worry about how to merge/handle multiple versions of those. That might be useful later if mkinitfs has to read deviceinfo config from multiple deviceinfo files. For example, trying to figure out how to merge these two things is... ehhh... a_modules_initfs="abc bar banana bazz" b_modules_initfs="foo bar bazz bar2 guava"
76 lines
2.1 KiB
Go
76 lines
2.1 KiB
Go
// Copyright 2021 Clayton Craft <clayton@craftyguy.net>
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
package deviceinfo
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// Test conversion of name to DeviceInfo struct field format
|
|
func TestNameToField(t *testing.T) {
|
|
tables := []struct {
|
|
in string
|
|
expected string
|
|
}{
|
|
{"deviceinfo_dtb", "Dtb"},
|
|
{"dtb", "Dtb"},
|
|
{"deviceinfo_modules_initfs", "ModulesInitfs"},
|
|
{"modules_initfs", "ModulesInitfs"},
|
|
{"deviceinfo_modules_initfs___", "ModulesInitfs"},
|
|
}
|
|
|
|
for _, table := range tables {
|
|
out := nameToField(table.in)
|
|
if out != table.expected {
|
|
t.Errorf("expected: %q, got: %q", table.expected, out)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Test unmarshalling with lines in deviceinfo
|
|
func TestUnmarshal(t *testing.T) {
|
|
tables := []struct {
|
|
// field is just used for reflection within the test, so it must be a
|
|
// valid DeviceInfo field
|
|
field string
|
|
in string
|
|
expected string
|
|
}{
|
|
{"ModulesInitfs", "deviceinfo_modules_initfs=\"panfrost foo bar bazz\"\n", "panfrost foo bar bazz"},
|
|
{"ModulesInitfs", "deviceinfo_modules_initfs=\"panfrost foo bar bazz\"", "panfrost foo bar bazz"},
|
|
// line with multiple '='
|
|
{"InitfsCompression", "deviceinfo_initfs_compression=zstd:--foo=1 -T0 --bar=bazz", "zstd:--foo=1 -T0 --bar=bazz"},
|
|
// empty option
|
|
{"ModulesInitfs", "deviceinfo_modules_initfs=\"\"\n", ""},
|
|
// line with comment at the end
|
|
{"MesaDriver", "deviceinfo_mesa_driver=\"panfrost\" # this is a nice driver", "panfrost"},
|
|
{"", "# this is a comment!\n", ""},
|
|
// empty lines are fine
|
|
{"", "", ""},
|
|
// line with whitepace characters only
|
|
{"", " \t \n\r", ""},
|
|
}
|
|
var d DeviceInfo
|
|
for _, table := range tables {
|
|
testName := fmt.Sprintf("unmarshal::'%s':", strings.ReplaceAll(table.in, "\n", "\\n"))
|
|
if err := unmarshal(strings.NewReader(table.in), &d); err != nil {
|
|
t.Errorf("%s received an unexpected err: ", err)
|
|
}
|
|
|
|
// Check against expected value
|
|
field := reflect.ValueOf(&d).Elem().FieldByName(table.field)
|
|
out := ""
|
|
if table.field != "" {
|
|
out = field.String()
|
|
}
|
|
if out != table.expected {
|
|
t.Errorf("%s expected: %q, got: %q", testName, table.expected, out)
|
|
}
|
|
}
|
|
|
|
}
|