github.com/linuxboot/fiano@v1.2.0/pkg/cbfs/image_test.go (about) 1 // Copyright 2018-2021 the LinuxBoot 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 cbfs 6 7 import ( 8 "bytes" 9 "fmt" 10 "io" 11 "os" 12 "reflect" 13 "strings" 14 "testing" 15 ) 16 17 func TestReadFile(t *testing.T) { 18 Debug = t.Logf 19 f, err := os.Open("testdata/coreboot.rom") 20 if err != nil { 21 t.Fatal(err) 22 } 23 i, err := NewImage(f) 24 if err != nil { 25 t.Fatal(err) 26 } 27 t.Logf("%s", i) 28 } 29 30 func TestCompression(t *testing.T) { 31 Debug = t.Logf 32 f, err := os.Open("testdata/coreboot.rom") 33 if err != nil { 34 t.Fatal(err) 35 } 36 i, err := NewImage(f) 37 if err != nil { 38 t.Fatal(err) 39 } 40 for s := range i.Segs { 41 f := i.Segs[s].GetFile() 42 if f.Name == "compression_test1" { 43 if f.Compression() != LZ4 { 44 t.Errorf("CBFS file '%s' has wrong compression '%s'", f.Name, f.Compression().String()) 45 } 46 d, err := f.Decompress() 47 if err != nil { 48 t.Fatal(err) 49 } 50 data := []byte(strings.Repeat("FIANO ROCKS!\n", 1024)) 51 if !bytes.Equal(data, d) { 52 t.Errorf("Decompressed file '%s' has unexpected contents: %s", f.Name, string(d)[0:12]) 53 } 54 } else if f.Name == "compression_test2" { 55 if f.Compression() != LZMA { 56 t.Errorf("CBFS file '%s' has wrong compression '%s'", f.Name, f.Compression().String()) 57 } 58 d, err := f.Decompress() 59 if err != nil { 60 t.Fatal(err) 61 } 62 63 data := []byte(strings.Repeat("FIANO ROCKS!\n", 1024)) 64 if !bytes.Equal(data, d) { 65 t.Errorf("Decompressed file '%s' has unexpected contents: %s", f.Name, string(d)[0:12]) 66 } 67 } else if f.Name == "fallback/bootblock" { 68 if f.Compression() != None { 69 t.Errorf("CBFS file '%s' has wrong compression '%s'", f.Name, f.Compression().String()) 70 } 71 } 72 } 73 t.Logf("%s", i) 74 } 75 76 func TestBogusArchives(t *testing.T) { 77 var tests = []struct { 78 n string 79 r io.ReadSeeker 80 want string 81 }{ 82 {"Short", bytes.NewReader([]byte("INUXARCHIV")), "cannot find FMAP signature"}, 83 {"Misaligned", bytes.NewReader([]byte("INUXARCHIVL")), "cannot find FMAP signature"}, 84 } 85 86 for _, tc := range tests { 87 t.Run(tc.n, func(t *testing.T) { 88 _, err := NewImage(tc.r) 89 if err == nil { 90 t.Errorf("got nil, want %v", tc.want) 91 return 92 } 93 e := fmt.Sprintf("%v", err) 94 if e != tc.want { 95 t.Errorf("got %v, want %v", e, tc.want) 96 } 97 }) 98 } 99 } 100 101 func TestReadSimple(t *testing.T) { 102 var tests = []struct { 103 n string 104 b []byte 105 want string 106 }{ 107 {"Master Only", Master, ""}, 108 } 109 Debug = t.Logf 110 for _, tc := range tests { 111 t.Run(tc.n, func(t *testing.T) { 112 r := bytes.NewReader(tc.b) 113 _, err := NewImage(r) 114 if err != nil { 115 t.Errorf("got %v, want nil", err) 116 return 117 } 118 }) 119 } 120 } 121 122 func TestConflict(t *testing.T) { 123 if err := RegisterFileReader(&SegReader{Type: 2, Name: "CBFSRaw", New: nil}); err == nil { 124 t.Fatalf("Registering conflicting entry to type 2, want error, got nil") 125 } 126 127 } 128 129 func TestStringer(t *testing.T) { 130 f, err := os.Open("testdata/coreboot.rom") 131 if err != nil { 132 t.Fatal(err) 133 } 134 i, err := NewImage(f) 135 if err != nil { 136 t.Fatal(err) 137 } 138 s := i.String() 139 140 t.Logf("Image string: %v", s) 141 } 142 143 func TestSimpleWrite(t *testing.T) { 144 Debug = t.Logf 145 f, err := os.Open("testdata/coreboot.rom") 146 if err != nil { 147 t.Fatal(err) 148 } 149 i, err := NewImage(f) 150 if err != nil { 151 t.Fatal(err) 152 } 153 f.Close() 154 out, err := os.CreateTemp("", "cbfs") 155 if err != nil { 156 t.Fatal(err) 157 } 158 defer os.Remove(out.Name()) 159 if err := i.WriteFile(out.Name(), 0666); err != nil { 160 t.Fatal(err) 161 } 162 out.Close() 163 164 fi, err := os.Stat(out.Name()) 165 if err != nil { 166 t.Fatal(err) 167 } 168 t.Logf("output file %v", fi) 169 old, err := os.ReadFile("testdata/coreboot.rom") 170 if err != nil { 171 t.Fatal(err) 172 } 173 new, err := os.ReadFile(out.Name()) 174 if err != nil { 175 t.Fatal(err) 176 } 177 if !reflect.DeepEqual(old, new) { 178 t.Fatalf("testdata/coreboot.rom and %s differ", out.Name()) 179 } 180 181 } 182 183 func TestRemovePayload(t *testing.T) { 184 Debug = t.Logf 185 f, err := os.Open("testdata/coreboot.rom") 186 if err != nil { 187 t.Fatal(err) 188 } 189 i, err := NewImage(f) 190 if err != nil { 191 t.Fatal(err) 192 } 193 f.Close() 194 out, err := os.CreateTemp("", "cbfs") 195 if err != nil { 196 t.Fatal(err) 197 } 198 // defer os.Remove(out.Name()) 199 if err := i.Remove("fallback/payload"); err != nil { 200 t.Fatal(err) 201 } 202 if err := i.Update(); err != nil { 203 t.Fatal(err) 204 } 205 if err := i.WriteFile(out.Name(), 0666); err != nil { 206 t.Fatal(err) 207 } 208 out.Close() 209 210 fi, err := os.Stat(out.Name()) 211 if err != nil { 212 t.Fatal(err) 213 } 214 t.Logf("output file %v", fi) 215 // FIXME: What is this supposed to do? `removepayload.rom` does not exist 216 /* 217 f, err = os.Open("testdata/removepayload.rom") 218 if err != nil { 219 t.Fatal(err) 220 } 221 old, err := NewImage(f) 222 if err != nil { 223 t.Fatal(err) 224 } 225 f.Close() 226 f, err = os.Open(out.Name()) 227 if err != nil { 228 t.Fatalf("%s: %v", out.Name(), err) 229 } 230 new, err := NewImage(f) 231 if err != nil { 232 t.Fatalf("%s: %v", out.Name(), err) 233 } 234 f.Close() 235 if !reflect.DeepEqual(old, new) { 236 t.Errorf("testdata/coreboot.rom and %s differ", out.Name()) 237 } 238 t.Logf("new image is %s", new.String()) 239 */ 240 241 }