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  }