github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/pkg/flash/flash_test.go (about) 1 // Copyright 2021 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package flash 6 7 import ( 8 "errors" 9 "fmt" 10 "io" 11 "testing" 12 13 "github.com/mvdan/u-root-coreutils/pkg/flash/spimock" 14 ) 15 16 // TestSFDPReader tests reading arbitrary offsets from the SFDP. 17 func TestSFDPReader(t *testing.T) { 18 for _, tt := range []struct { 19 name string 20 readOffset int64 21 readSize int 22 forceTransferErr error 23 wantData []byte 24 wantNewErr error 25 wantReadAtErr error 26 }{ 27 { 28 name: "read sfdp data", 29 readOffset: 0x10, 30 readSize: 4, 31 wantData: []byte{0xc2, 0x00, 0x01, 0x04}, 32 }, 33 { 34 name: "invalid offset", 35 readOffset: sfdpMaxAddress + 1, 36 readSize: 4, 37 wantReadAtErr: io.EOF, 38 }, 39 { 40 name: "transfer error", 41 readOffset: 0x10, 42 readSize: 4, 43 forceTransferErr: errors.New("fake transfer error"), 44 wantNewErr: errors.New("could not read sfdp: fake transfer error"), 45 }, 46 } { 47 t.Run(tt.name, func(t *testing.T) { 48 s := spimock.New() 49 s.ForceTransferErr = tt.forceTransferErr 50 f, err := New(s) 51 if gotErrString, wantErrString := fmt.Sprint(err), fmt.Sprint(tt.wantNewErr); gotErrString != wantErrString { 52 t.Errorf("flash.New() err = %q; want %q", gotErrString, wantErrString) 53 } 54 if err != nil { 55 return 56 } 57 58 data := make([]byte, tt.readSize) 59 n, err := f.SFDPReader().ReadAt(data, tt.readOffset) 60 if gotErrString, wantErrString := fmt.Sprint(err), fmt.Sprint(tt.wantReadAtErr); gotErrString != wantErrString { 61 t.Errorf("SFDPReader().ReadAt() err = %q; want %q", gotErrString, wantErrString) 62 } 63 if err == nil && n != len(data) { 64 t.Errorf("SFDPReader().ReadAt() n = %d; want %d", n, len(data)) 65 } 66 67 if err == nil && string(data) != string(tt.wantData) { 68 t.Errorf("SFDPReader().ReadAt() data = %#02x; want %#02x", data, tt.wantData) 69 } 70 }) 71 } 72 } 73 74 // TestSFDPReadDWORD checks a DWORD can be parsed from the SFDP tables. 75 func TestSFDPReadDWORD(t *testing.T) { 76 s := spimock.New() 77 f, err := New(s) 78 if err != nil { 79 t.Fatal(err) 80 } 81 82 sfdp := f.SFDP() 83 dword, err := sfdp.Dword(0, 0) 84 if err != nil { 85 t.Error(err) 86 } 87 var want uint32 = 0xfff320e5 88 if dword != want { 89 t.Errorf("sfdp.TableDword() = %#08x; want %#08x", dword, want) 90 } 91 }