Files
postmarketos-mkinitfs/main_test.go
Johannes Marbach 91529b736e main: Mock file system and add getFile tests
This uses afero to proxy all file system accesses and then injects an
in-memory file system in order to test the getFile function.
2021-12-30 14:40:46 +01:00

206 lines
5.9 KiB
Go

// Copyright 2021 Clayton Craft <clayton@craftyguy.net>
// SPDX-License-Identifier: GPL-3.0-or-later
package main
import (
"github.com/spf13/afero"
"gitlab.com/postmarketOS/postmarketos-mkinitfs/pkgs/misc"
"reflect"
"strings"
"testing"
)
func TestStripExts(t *testing.T) {
tables := []struct {
in string
expected string
}{
{"/foo/bar/bazz.tar", "/foo/bar/bazz"},
{"file.tar.gz.xz.zip", "file"},
{"another_file", "another_file"},
{"a.b.c.d.e.f.g.h.i", "a"},
{"virtio_blk.ko", "virtio_blk"},
}
for _, table := range tables {
out := stripExts(table.in)
if out != table.expected {
t.Errorf("Expected: %q, got: %q", table.expected, out)
}
}
}
func stringSlicesEqual(a []string, b []string) bool {
if len(a) != len(b) {
return false
}
for i, v := range a {
if v != b[i] {
return false
}
}
return true
}
var testModuleDep string = `
kernel/sound/soc/codecs/snd-soc-msm8916-digital.ko:
kernel/net/sched/act_ipt.ko.xz: kernel/net/netfilter/x_tables.ko.xz
kernel/drivers/watchdog/watchdog.ko.xz:
kernel/drivers/usb/serial/ir-usb.ko.xz: kernel/drivers/usb/serial/usbserial.ko.xz
kernel/drivers/gpu/drm/scheduler/gpu-sched.ko.xz:
kernel/drivers/hid/hid-alps.ko.xz:
kernel/net/netfilter/xt_u32.ko.xz: kernel/net/netfilter/x_tables.ko.xz
kernel/net/netfilter/xt_sctp.ko.xz: kernel/net/netfilter/x_tables.ko.xz
kernel/drivers/hwmon/gl518sm.ko.xz:
kernel/drivers/watchdog/dw_wdt.ko.xz: kernel/drivers/watchdog/watchdog.ko.xz
kernel/net/bluetooth/hidp/hidp.ko.xz: kernel/net/bluetooth/bluetooth.ko.xz kernel/net/rfkill/rfkill.ko.xz kernel/crypto/ecdh_generic.ko.xz kernel/crypto/ecc.ko.xz
kernel/fs/nls/nls_iso8859-1.ko.xz:
kernel/net/vmw_vsock/vmw_vsock_virtio_transport.ko.xz: kernel/net/vmw_vsock/vmw_vsock_virtio_transport_common.ko.xz kernel/drivers/virtio/virtio.ko.xz kernel/drivers/virtio/virtio_ring.ko.xz kernel/net/vmw_vsock/vsock.ko.xz
kernel/drivers/gpu/drm/panfrost/panfrost.ko.xz: kernel/drivers/gpu/drm/scheduler/gpu-sched.ko.xz
kernel/drivers/gpu/drm/msm/msm.ko: kernel/drivers/gpu/drm/drm_kms_helper.ko
`
func TestGetModuleDeps(t *testing.T) {
tables := []struct {
in string
expected []string
}{
{"nls-iso8859-1", []string{"kernel/fs/nls/nls_iso8859-1.ko.xz"}},
{"gpu_sched", []string{"kernel/drivers/gpu/drm/scheduler/gpu-sched.ko.xz"}},
{"dw-wdt", []string{"kernel/drivers/watchdog/dw_wdt.ko.xz",
"kernel/drivers/watchdog/watchdog.ko.xz"}},
{"gl518sm", []string{"kernel/drivers/hwmon/gl518sm.ko.xz"}},
{"msm", []string{"kernel/drivers/gpu/drm/msm/msm.ko",
"kernel/drivers/gpu/drm/drm_kms_helper.ko"}},
}
for _, table := range tables {
out, err := getModuleDeps(table.in, strings.NewReader(testModuleDep))
if err != nil {
t.Errorf("unexpected error with input: %q, error: %q", table.expected, err)
}
if !stringSlicesEqual(out, table.expected) {
t.Errorf("Expected: %q, got: %q", table.expected, out)
}
}
}
func setUpFakeFs() {
fs := afero.NewMemMapFs()
initFs(fs)
fs.Mkdir("/foo", 0755)
afero.WriteFile(fs, "/foo/foo.txt", []byte("foo"), 0644)
fs.Mkdir("/foo/bar", 0755)
afero.WriteFile(fs, "/foo/bar/bar.txt", []byte("bar"), 0644)
afero.WriteFile(fs, "/foo/bar/foo.txt", []byte("foo"), 0644)
}
func TestGetFileWithFilePath(t *testing.T) {
setUpFakeFs()
actual := make(misc.StringSet)
file := "/foo/bar/bar.txt"
if err := getFile(actual, file, true); err != nil {
t.Errorf("Unexpected error when collecting file %q, error: %q", file, err)
}
expected := make(misc.StringSet)
expected["/foo/bar/bar.txt"] = false
if !reflect.DeepEqual(expected, actual) {
t.Errorf("Expected: %v, got: %v", expected, actual)
}
}
func TestGetFileWithGlobThatExpandsToSingleFile(t *testing.T) {
setUpFakeFs()
actual := make(misc.StringSet)
file := "/foo/bar/bar.*"
if err := getFile(actual, file, true); err != nil {
t.Errorf("Unexpected error when collecting file %q, error: %q", file, err)
}
expected := make(misc.StringSet)
expected["/foo/bar/bar.txt"] = false
if !reflect.DeepEqual(expected, actual) {
t.Errorf("Expected: %v, got: %v", expected, actual)
}
}
func TestGetFileWithGlobThatExpandsToMultipleFiles(t *testing.T) {
setUpFakeFs()
actual := make(misc.StringSet)
file := "/foo/bar/*.txt"
if err := getFile(actual, file, true); err != nil {
t.Errorf("Unexpected error when collecting file %q, error: %q", file, err)
}
expected := make(misc.StringSet)
expected["/foo/bar/bar.txt"] = false
expected["/foo/bar/foo.txt"] = false
if !reflect.DeepEqual(expected, actual) {
t.Errorf("Expected: %v, got: %v", expected, actual)
}
}
func TestGetFileWithDirectoryPath(t *testing.T) {
setUpFakeFs()
actual := make(misc.StringSet)
file := "/foo"
if err := getFile(actual, file, true); err != nil {
t.Errorf("Unexpected error when collecting file %q, error: %q", file, err)
}
expected := make(misc.StringSet)
expected["/foo/foo.txt"] = false
expected["/foo/bar/bar.txt"] = false
expected["/foo/bar/foo.txt"] = false
if !reflect.DeepEqual(expected, actual) {
t.Errorf("Expected: %v, got: %v", expected, actual)
}
}
func TestGetFileWithGlobThatExpandsToSingleDirectory(t *testing.T) {
setUpFakeFs()
actual := make(misc.StringSet)
file := "/foo/b*"
if err := getFile(actual, file, true); err != nil {
t.Errorf("Unexpected error when collecting file %q, error: %q", file, err)
}
expected := make(misc.StringSet)
expected["/foo/bar/bar.txt"] = false
expected["/foo/bar/foo.txt"] = false
if !reflect.DeepEqual(expected, actual) {
t.Errorf("Expected: %v, got: %v", expected, actual)
}
}
func TestGetFileWithGlobThatExpandsToDirectoriesAndFiles(t *testing.T) {
setUpFakeFs()
actual := make(misc.StringSet)
file := "/foo/*"
if err := getFile(actual, file, true); err != nil {
t.Errorf("Unexpected error when collecting file %q, error: %q", file, err)
}
expected := make(misc.StringSet)
expected["/foo/foo.txt"] = false
expected["/foo/bar/bar.txt"] = false
expected["/foo/bar/foo.txt"] = false
if !reflect.DeepEqual(expected, actual) {
t.Errorf("Expected: %v, got: %v", expected, actual)
}
}