diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-11-14 08:14:46 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-11-14 08:33:19 +0900 |
| commit | 690a0ed0d68e270e60bfe9c7cd575c4e986de83d (patch) | |
| tree | be14195bb5b4e64ddfceb19a4a09d0c5f9f3cec3 /ldd/ldd_test.go | |
| parent | a9d72a5eb19827ded874e359a99f91cc4d91f4b3 (diff) | |
ldd: decode from reader
This should reduce memory footprint of the parsing process and allow decoding part of the stream.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'ldd/ldd_test.go')
| -rw-r--r-- | ldd/ldd_test.go | 104 |
1 files changed, 67 insertions, 37 deletions
diff --git a/ldd/ldd_test.go b/ldd/ldd_test.go index a6044f6b..0288a7c7 100644 --- a/ldd/ldd_test.go +++ b/ldd/ldd_test.go @@ -1,10 +1,12 @@ package ldd_test import ( + "encoding/json" "errors" "reflect" "testing" + "hakurei.app/container/check" "hakurei.app/ldd" ) @@ -20,15 +22,19 @@ func TestParseError(t *testing.T) { libzstd.so.1 => /usr/lib/libzstd.so.1 (0x7ff71bfd2000) `, ldd.ErrUnexpectedNewline}, + {"unexpected separator", ` libzstd.so.1 = /usr/lib/libzstd.so.1 (0x7ff71bfd2000) `, ldd.ErrUnexpectedSeparator}, + {"path not absolute", ` libzstd.so.1 => usr/lib/libzstd.so.1 (0x7ff71bfd2000) -`, ldd.ErrPathNotAbsolute}, +`, &check.AbsoluteError{Pathname: "usr/lib/libzstd.so.1"}}, + {"unexpected segments", ` meow libzstd.so.1 => /usr/lib/libzstd.so.1 (0x7ff71bfd2000) `, ldd.EntryUnexpectedSegmentsError("meow libzstd.so.1 => /usr/lib/libzstd.so.1 (0x7ff71bfd2000)")}, + {"bad location format", ` libzstd.so.1 => /usr/lib/libzstd.so.1 7ff71bfd2000 `, ldd.ErrBadLocationFormat}, @@ -49,6 +55,7 @@ func TestParse(t *testing.T) { testCases := []struct { file, out string want []*ldd.Entry + paths []*check.Absolute }{ {"musl /bin/kmod", ` /lib/ld-musl-x86_64.so.1 (0x7ff71c0a4000) @@ -56,30 +63,38 @@ libzstd.so.1 => /usr/lib/libzstd.so.1 (0x7ff71bfd2000) liblzma.so.5 => /usr/lib/liblzma.so.5 (0x7ff71bf9a000) libz.so.1 => /lib/libz.so.1 (0x7ff71bf80000) libcrypto.so.3 => /lib/libcrypto.so.3 (0x7ff71ba00000) -libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7ff71c0a4000)`, - []*ldd.Entry{ - {"/lib/ld-musl-x86_64.so.1", "", 0x7ff71c0a4000}, - {"libzstd.so.1", "/usr/lib/libzstd.so.1", 0x7ff71bfd2000}, - {"liblzma.so.5", "/usr/lib/liblzma.so.5", 0x7ff71bf9a000}, - {"libz.so.1", "/lib/libz.so.1", 0x7ff71bf80000}, - {"libcrypto.so.3", "/lib/libcrypto.so.3", 0x7ff71ba00000}, - {"libc.musl-x86_64.so.1", "/lib/ld-musl-x86_64.so.1", 0x7ff71c0a4000}, - }}, +libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7ff71c0a4000)`, []*ldd.Entry{ + {"/lib/ld-musl-x86_64.so.1", nil, 0x7ff71c0a4000}, + {"libzstd.so.1", check.MustAbs("/usr/lib/libzstd.so.1"), 0x7ff71bfd2000}, + {"liblzma.so.5", check.MustAbs("/usr/lib/liblzma.so.5"), 0x7ff71bf9a000}, + {"libz.so.1", check.MustAbs("/lib/libz.so.1"), 0x7ff71bf80000}, + {"libcrypto.so.3", check.MustAbs("/lib/libcrypto.so.3"), 0x7ff71ba00000}, + {"libc.musl-x86_64.so.1", check.MustAbs("/lib/ld-musl-x86_64.so.1"), 0x7ff71c0a4000}, + }, []*check.Absolute{ + check.MustAbs("/lib"), + check.MustAbs("/usr/lib"), + }}, + {"glibc /nix/store/rc3n2r3nffpib2gqpxlkjx36frw6n34z-kmod-31/bin/kmod", ` linux-vdso.so.1 (0x00007ffed65be000) libzstd.so.1 => /nix/store/80pxmvb9q43kh9rkjagc4h41vf6dh1y6-zstd-1.5.6/lib/libzstd.so.1 (0x00007f3199cd1000) liblzma.so.5 => /nix/store/g78jna1i5qhh8gqs4mr64648f0szqgw4-xz-5.4.7/lib/liblzma.so.5 (0x00007f3199ca2000) libc.so.6 => /nix/store/c10zhkbp6jmyh0xc5kd123ga8yy2p4hk-glibc-2.39-52/lib/libc.so.6 (0x00007f3199ab5000) libpthread.so.0 => /nix/store/c10zhkbp6jmyh0xc5kd123ga8yy2p4hk-glibc-2.39-52/lib/libpthread.so.0 (0x00007f3199ab0000) - /nix/store/c10zhkbp6jmyh0xc5kd123ga8yy2p4hk-glibc-2.39-52/lib/ld-linux-x86-64.so.2 => /nix/store/c10zhkbp6jmyh0xc5kd123ga8yy2p4hk-glibc-2.39-52/lib64/ld-linux-x86-64.so.2 (0x00007f3199da5000)`, - []*ldd.Entry{ - {"linux-vdso.so.1", "", 0x00007ffed65be000}, - {"libzstd.so.1", "/nix/store/80pxmvb9q43kh9rkjagc4h41vf6dh1y6-zstd-1.5.6/lib/libzstd.so.1", 0x00007f3199cd1000}, - {"liblzma.so.5", "/nix/store/g78jna1i5qhh8gqs4mr64648f0szqgw4-xz-5.4.7/lib/liblzma.so.5", 0x00007f3199ca2000}, - {"libc.so.6", "/nix/store/c10zhkbp6jmyh0xc5kd123ga8yy2p4hk-glibc-2.39-52/lib/libc.so.6", 0x00007f3199ab5000}, - {"libpthread.so.0", "/nix/store/c10zhkbp6jmyh0xc5kd123ga8yy2p4hk-glibc-2.39-52/lib/libpthread.so.0", 0x00007f3199ab0000}, - {"/nix/store/c10zhkbp6jmyh0xc5kd123ga8yy2p4hk-glibc-2.39-52/lib/ld-linux-x86-64.so.2", "/nix/store/c10zhkbp6jmyh0xc5kd123ga8yy2p4hk-glibc-2.39-52/lib64/ld-linux-x86-64.so.2", 0x00007f3199da5000}, - }}, + /nix/store/c10zhkbp6jmyh0xc5kd123ga8yy2p4hk-glibc-2.39-52/lib/ld-linux-x86-64.so.2 => /nix/store/c10zhkbp6jmyh0xc5kd123ga8yy2p4hk-glibc-2.39-52/lib64/ld-linux-x86-64.so.2 (0x00007f3199da5000)`, []*ldd.Entry{ + {"linux-vdso.so.1", nil, 0x00007ffed65be000}, + {"libzstd.so.1", check.MustAbs("/nix/store/80pxmvb9q43kh9rkjagc4h41vf6dh1y6-zstd-1.5.6/lib/libzstd.so.1"), 0x00007f3199cd1000}, + {"liblzma.so.5", check.MustAbs("/nix/store/g78jna1i5qhh8gqs4mr64648f0szqgw4-xz-5.4.7/lib/liblzma.so.5"), 0x00007f3199ca2000}, + {"libc.so.6", check.MustAbs("/nix/store/c10zhkbp6jmyh0xc5kd123ga8yy2p4hk-glibc-2.39-52/lib/libc.so.6"), 0x00007f3199ab5000}, + {"libpthread.so.0", check.MustAbs("/nix/store/c10zhkbp6jmyh0xc5kd123ga8yy2p4hk-glibc-2.39-52/lib/libpthread.so.0"), 0x00007f3199ab0000}, + {"/nix/store/c10zhkbp6jmyh0xc5kd123ga8yy2p4hk-glibc-2.39-52/lib/ld-linux-x86-64.so.2", check.MustAbs("/nix/store/c10zhkbp6jmyh0xc5kd123ga8yy2p4hk-glibc-2.39-52/lib64/ld-linux-x86-64.so.2"), 0x00007f3199da5000}, + }, []*check.Absolute{ + check.MustAbs("/nix/store/80pxmvb9q43kh9rkjagc4h41vf6dh1y6-zstd-1.5.6/lib"), + check.MustAbs("/nix/store/c10zhkbp6jmyh0xc5kd123ga8yy2p4hk-glibc-2.39-52/lib"), + check.MustAbs("/nix/store/c10zhkbp6jmyh0xc5kd123ga8yy2p4hk-glibc-2.39-52/lib64"), + check.MustAbs("/nix/store/g78jna1i5qhh8gqs4mr64648f0szqgw4-xz-5.4.7/lib"), + }}, + {"glibc /usr/bin/xdg-dbus-proxy", ` linux-vdso.so.1 (0x00007725f5772000) libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x00007725f55d5000) @@ -93,31 +108,46 @@ libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7ff71c0a4000)`, libmount.so.1 => /usr/lib/libmount.so.1 (0x00007725f5076000) libffi.so.8 => /usr/lib/libffi.so.8 (0x00007725f506b000) /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007725f5774000) - libblkid.so.1 => /usr/lib/libblkid.so.1 (0x00007725f5032000)`, - []*ldd.Entry{ - {"linux-vdso.so.1", "", 0x00007725f5772000}, - {"libglib-2.0.so.0", "/usr/lib/libglib-2.0.so.0", 0x00007725f55d5000}, - {"libgio-2.0.so.0", "/usr/lib/libgio-2.0.so.0", 0x00007725f5406000}, - {"libgobject-2.0.so.0", "/usr/lib/libgobject-2.0.so.0", 0x00007725f53a6000}, - {"libgcc_s.so.1", "/usr/lib/libgcc_s.so.1", 0x00007725f5378000}, - {"libc.so.6", "/usr/lib/libc.so.6", 0x00007725f5187000}, - {"libpcre2-8.so.0", "/usr/lib/libpcre2-8.so.0", 0x00007725f50e8000}, - {"libgmodule-2.0.so.0", "/usr/lib/libgmodule-2.0.so.0", 0x00007725f50df000}, - {"libz.so.1", "/usr/lib/libz.so.1", 0x00007725f50c6000}, - {"libmount.so.1", "/usr/lib/libmount.so.1", 0x00007725f5076000}, - {"libffi.so.8", "/usr/lib/libffi.so.8", 0x00007725f506b000}, - {"/lib64/ld-linux-x86-64.so.2", "/usr/lib64/ld-linux-x86-64.so.2", 0x00007725f5774000}, - {"libblkid.so.1", "/usr/lib/libblkid.so.1", 0x00007725f5032000}, - }}, + libblkid.so.1 => /usr/lib/libblkid.so.1 (0x00007725f5032000)`, []*ldd.Entry{ + {"linux-vdso.so.1", nil, 0x00007725f5772000}, + {"libglib-2.0.so.0", check.MustAbs("/usr/lib/libglib-2.0.so.0"), 0x00007725f55d5000}, + {"libgio-2.0.so.0", check.MustAbs("/usr/lib/libgio-2.0.so.0"), 0x00007725f5406000}, + {"libgobject-2.0.so.0", check.MustAbs("/usr/lib/libgobject-2.0.so.0"), 0x00007725f53a6000}, + {"libgcc_s.so.1", check.MustAbs("/usr/lib/libgcc_s.so.1"), 0x00007725f5378000}, + {"libc.so.6", check.MustAbs("/usr/lib/libc.so.6"), 0x00007725f5187000}, + {"libpcre2-8.so.0", check.MustAbs("/usr/lib/libpcre2-8.so.0"), 0x00007725f50e8000}, + {"libgmodule-2.0.so.0", check.MustAbs("/usr/lib/libgmodule-2.0.so.0"), 0x00007725f50df000}, + {"libz.so.1", check.MustAbs("/usr/lib/libz.so.1"), 0x00007725f50c6000}, + {"libmount.so.1", check.MustAbs("/usr/lib/libmount.so.1"), 0x00007725f5076000}, + {"libffi.so.8", check.MustAbs("/usr/lib/libffi.so.8"), 0x00007725f506b000}, + {"/lib64/ld-linux-x86-64.so.2", check.MustAbs("/usr/lib64/ld-linux-x86-64.so.2"), 0x00007725f5774000}, + {"libblkid.so.1", check.MustAbs("/usr/lib/libblkid.so.1"), 0x00007725f5032000}, + }, []*check.Absolute{ + check.MustAbs("/lib64"), + check.MustAbs("/usr/lib"), + check.MustAbs("/usr/lib64"), + }}, } for _, tc := range testCases { t.Run(tc.file, func(t *testing.T) { t.Parallel() + if got, err := ldd.Parse([]byte(tc.out)); err != nil { - t.Errorf("Parse() error = %v", err) + t.Errorf("Parse: error = %v", err) } else if !reflect.DeepEqual(got, tc.want) { - t.Errorf("Parse() got = %#v, want %#v", got, tc.want) + t.Errorf("Parse: \n%s\nwant\n%s", mustMarshalJSON(got), mustMarshalJSON(tc.want)) + } else if paths := ldd.Path(got); !reflect.DeepEqual(paths, tc.paths) { + t.Errorf("Paths: %v, want %v", paths, tc.paths) } }) } } + +// mustMarshalJSON calls [json.Marshal] and returns the resulting data. +func mustMarshalJSON(v any) []byte { + if data, err := json.Marshal(v); err != nil { + panic(err) + } else { + return data + } +} |
