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  }