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 }