Files
internal/fat/reader_test.go
2021-06-21 18:25:16 +02:00

137 lines
2.6 KiB
Go

package fat
import (
"io"
"io/ioutil"
"os"
"testing"
"time"
"github.com/google/go-cmp/cmp"
)
func TestUnmarshalTimeDate(t *testing.T) {
t.Parallel()
arbitrary := time.Date(2017, 9, 6, 8, 13, 28, 0, time.UTC)
arbitraryC := common{modTime: arbitrary}
for _, entry := range []struct {
t, d uint16
want time.Time
}{
{
t: arbitraryC.Time(),
d: arbitraryC.Date(),
want: arbitrary,
},
{
d: 0x2B14,
want: time.Date(2001, 8, 20, 0, 0, 0, 0, time.UTC),
},
{
t: 0x5401,
d: 0x0021, // minimum date
want: time.Date(1980, 1, 1, 10, 32, 2, 0, time.UTC),
},
{
t: 0x5401,
d: 0xFC46, // maximum date
want: time.Date(2106, 2, 6, 10, 32, 2, 0, time.UTC),
},
} {
entry := entry // copy
t.Run(entry.want.String(), func(t *testing.T) {
t.Parallel()
got := unmarshalTimeDate(entry.t, entry.d)
if !got.Equal(entry.want) {
t.Fatalf("unexpected time: got %v, want %v", got, entry.want)
}
})
}
}
func TestExtents(t *testing.T) {
t.Parallel()
tmp, err := ioutil.TempFile("", "example")
if err != nil {
t.Fatal(err)
}
defer os.Remove(tmp.Name())
fw, err := NewWriter(tmp)
if err != nil {
t.Fatal(err)
}
w, err := fw.File("/resolv.conf", time.Now())
if err != nil {
t.Fatal(err)
}
if _, err := w.Write([]byte("nameserver 8.8.8.8")); err != nil {
t.Fatal(err)
}
bCmdline := []byte("root=/dev/xda")
w, err = fw.File("/cmdline.txt", time.Now())
if err != nil {
t.Fatal(err)
}
if _, err := w.Write(bCmdline); err != nil {
t.Fatal(err)
}
bEntry := []byte("options root=/dev/xda")
w, err = fw.File("/loader/entries/gokrazy.conf", time.Now())
if err != nil {
t.Fatal(err)
}
if _, err := w.Write(bEntry); err != nil {
t.Fatal(err)
}
if err := fw.Flush(); err != nil {
t.Fatal(err)
}
rd, err := NewReader(tmp)
if err != nil {
t.Fatal(err)
}
{
offset, length, err := rd.Extents("/cmdline.txt")
if err != nil {
t.Fatal(err)
}
if _, err := tmp.Seek(offset, io.SeekStart); err != nil {
t.Fatal(err)
}
got := make([]byte, length)
if _, err := io.ReadFull(tmp, got); err != nil {
t.Fatal(err)
}
if diff := cmp.Diff(bCmdline, got); diff != "" {
t.Fatalf("unexpected cmdline.txt contents: diff (-want +got):\n%s", diff)
}
}
{
offset, length, err := rd.Extents("/loader/entries/gokrazy.conf")
if err != nil {
t.Fatal(err)
}
if _, err := tmp.Seek(offset, io.SeekStart); err != nil {
t.Fatal(err)
}
got := make([]byte, length)
if _, err := io.ReadFull(tmp, got); err != nil {
t.Fatal(err)
}
if diff := cmp.Diff(bEntry, got); diff != "" {
t.Fatalf("unexpected gokrazy.conf contents: diff (-want +got):\n%s", diff)
}
}
}