github.com/rck/u-root@v0.0.0-20180106144920-7eb602e381bb/cmds/fmap/lib/fmap_test.go (about)

     1  // Copyright 2017 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 fmap
     6  
     7  import (
     8  	"bytes"
     9  	"crypto/sha256"
    10  	"fmt"
    11  	"io/ioutil"
    12  	"reflect"
    13  	"strings"
    14  	"testing"
    15  )
    16  
    17  // Flash map is stored in little-endian.
    18  var fmapName = []byte("Fake flash" + strings.Repeat("\x00", 32-10))
    19  var area0Name = []byte("Area Number 1\x00\x00\x00Hello" + strings.Repeat("\x00", 32-21))
    20  var area1Name = []byte("Area Number 2xxxxxxxxxxxxxxxxxxx")
    21  var fakeFlash = bytes.Join([][]byte{
    22  	// Arbitrary data
    23  	bytes.Repeat([]byte{0x53, 0x11, 0x34, 0x22}, 94387),
    24  
    25  	// Signature
    26  	[]byte("__FMAP__"),
    27  	// VerMajor, VerMinor
    28  	{1, 0},
    29  	// Base
    30  	{0xef, 0xbe, 0xad, 0xde, 0xbe, 0xba, 0xfe, 0xca},
    31  	// Size
    32  	{0x11, 0x22, 0x33, 0x44},
    33  	// Name (32 bytes)
    34  	fmapName,
    35  	// NAreas
    36  	{0x02, 0x00},
    37  
    38  	// Areas[0].Offset
    39  	{0xef, 0xbe, 0xad, 0xde},
    40  	// Areas[0].Size
    41  	{0x11, 0x11, 0x11, 0x11},
    42  	// Areas[0].Name (32 bytes)
    43  	area0Name,
    44  	// Areas[0].Flags
    45  	{0x13, 0x10},
    46  
    47  	// Areas[1].Offset
    48  	{0xbe, 0xba, 0xfe, 0xca},
    49  	// Areas[1].Size
    50  	{0x22, 0x22, 0x22, 0x22},
    51  	// Areas[1].Name (32 bytes)
    52  	area1Name,
    53  	// Areas[1].Flags
    54  	{0x00, 0x00},
    55  }, []byte{})
    56  
    57  func TestReadFMap(t *testing.T) {
    58  	r := bytes.NewReader(fakeFlash)
    59  	fmap, _, err := Read(r)
    60  	if err != nil {
    61  		t.Fatal(err)
    62  	}
    63  	expected := FMap{
    64  		Header: Header{
    65  			VerMajor: 1,
    66  			VerMinor: 0,
    67  			Base:     0xcafebabedeadbeef,
    68  			Size:     0x44332211,
    69  			NAreas:   2,
    70  		},
    71  		Areas: []Area{
    72  			{
    73  				Offset: 0xdeadbeef,
    74  				Size:   0x11111111,
    75  				Flags:  0x1013,
    76  			}, {
    77  				Offset: 0xcafebabe,
    78  				Size:   0x22222222,
    79  				Flags:  0x0000,
    80  			},
    81  		},
    82  	}
    83  	copy(expected.Signature[:], []byte("__FMAP__"))
    84  	copy(expected.Name.Value[:], fmapName)
    85  	copy(expected.Areas[0].Name.Value[:], area0Name)
    86  	copy(expected.Areas[1].Name.Value[:], area1Name)
    87  	if !reflect.DeepEqual(*fmap, expected) {
    88  		t.Errorf("expected:\n%+v\ngot:\n%+v", expected, *fmap)
    89  	}
    90  }
    91  
    92  func TestReadMetadata(t *testing.T) {
    93  	r := bytes.NewReader(fakeFlash)
    94  	_, metadata, err := Read(r)
    95  	if err != nil {
    96  		t.Fatal(err)
    97  	}
    98  	expected := Metadata{
    99  		Start: 4 * 94387,
   100  	}
   101  	if !reflect.DeepEqual(*metadata, expected) {
   102  		t.Errorf("expected:\n%+v\ngot:\n%+v", expected, *metadata)
   103  	}
   104  }
   105  
   106  func TestFieldNames(t *testing.T) {
   107  	r := bytes.NewReader(fakeFlash)
   108  	fmap, _, err := Read(r)
   109  	if err != nil {
   110  		t.Fatal(err)
   111  	}
   112  	for i, expected := range []string{"STATIC|COMPRESSED|0x1010", "0x0"} {
   113  		got := FlagNames(fmap.Areas[i].Flags)
   114  		if got != expected {
   115  			t.Errorf("expected:\n%s\ngot:\n%s", expected, got)
   116  		}
   117  	}
   118  }
   119  
   120  func TestNoSignature(t *testing.T) {
   121  	fakeFlash := bytes.Repeat([]byte{0x53, 0x11, 0x34, 0x22}, 94387)
   122  	r := bytes.NewReader(fakeFlash)
   123  	_, _, err := Read(r)
   124  	expected := "Cannot find fmap signature"
   125  	got := err.Error()
   126  	if expected != got {
   127  		t.Errorf("expected: %s; got: %s", expected, got)
   128  	}
   129  }
   130  
   131  func TestTwoSignatures(t *testing.T) {
   132  	fakeFlash := bytes.Repeat(fakeFlash, 2)
   133  	r := bytes.NewReader(fakeFlash)
   134  	_, _, err := Read(r)
   135  	expected := "Found multiple signatures"
   136  	got := err.Error()
   137  	if expected != got {
   138  		t.Errorf("expected: %s; got: %s", expected, got)
   139  	}
   140  }
   141  
   142  func TestTruncatedFmap(t *testing.T) {
   143  	r := bytes.NewReader(fakeFlash[:len(fakeFlash)-2])
   144  	_, _, err := Read(r)
   145  	expected := "Unexpected EOF while parsing fmap"
   146  	got := err.Error()
   147  	if expected != got {
   148  		t.Errorf("expected: %s; got: %s", expected, got)
   149  	}
   150  }
   151  
   152  func TestReadArea(t *testing.T) {
   153  	fmap := FMap{
   154  		Header: Header{
   155  			NAreas: 3,
   156  		},
   157  		Areas: []Area{
   158  			{
   159  				Offset: 0x0,
   160  				Size:   0x10,
   161  			}, {
   162  				Offset: 0x10,
   163  				Size:   0x20,
   164  			}, {
   165  				Offset: 0x30,
   166  				Size:   0x40,
   167  			},
   168  		},
   169  	}
   170  	fakeFlash := bytes.Repeat([]byte{0x53, 0x11, 0x34, 0x22}, 0x70)
   171  	r := bytes.NewReader(fakeFlash)
   172  	area, err := fmap.ReadArea(r, 1)
   173  	if err != nil {
   174  		t.Fatal(err)
   175  	}
   176  	expected := fakeFlash[0x10:0x30]
   177  	got, err := ioutil.ReadAll(area)
   178  	if err != nil {
   179  		t.Fatal(err)
   180  	}
   181  	if !bytes.Equal(expected, got) {
   182  		t.Errorf("expected: %v; got: %v", expected, got)
   183  	}
   184  }
   185  
   186  func TestChecksum(t *testing.T) {
   187  	fmap := FMap{
   188  		Header: Header{
   189  			NAreas: 3,
   190  		},
   191  		Areas: []Area{
   192  			{
   193  				Offset: 0x00,
   194  				Size:   0x03,
   195  				Flags:  FmapAreaStatic,
   196  			}, {
   197  				Offset: 0x03,
   198  				Size:   0x20,
   199  				Flags:  0x00,
   200  			}, {
   201  				Offset: 0x23,
   202  				Size:   0x04,
   203  				Flags:  FmapAreaStatic | FmapAreaCompressed,
   204  			},
   205  		},
   206  	}
   207  	fakeFlash := bytes.Repeat([]byte("abcd"), 0x70)
   208  	r := bytes.NewReader(fakeFlash)
   209  	checksum, err := fmap.Checksum(r, sha256.New())
   210  	if err != nil {
   211  		t.Fatal(err)
   212  	}
   213  	// $ echo -n abcdabc | sha256sum
   214  	want := "8a50a4422d673f463f8e4141d8c4b68c4f001ba16f83ad77b8a31bde53ee7273"
   215  	got := fmt.Sprintf("%x", checksum)
   216  	if want != got {
   217  		t.Errorf("want: %v; got: %v", want, got)
   218  	}
   219  }