github.com/linuxboot/fiano@v1.2.0/pkg/intel/metadata/fit/get_entries_test.go (about)

     1  // Copyright 2017-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 fit
     6  
     7  import (
     8  	"bytes"
     9  	"compress/bzip2"
    10  	"encoding/base64"
    11  	"fmt"
    12  	"io"
    13  	"testing"
    14  
    15  	"github.com/stretchr/testify/assert"
    16  	"github.com/stretchr/testify/require"
    17  )
    18  
    19  var (
    20  	fitHeadersSampleBZ2, _ = base64.StdEncoding.DecodeString(
    21  		"QlpoOTFBWSZTWeqFfFEBARl/z/6cAAhAEAJAISIUAMAAYADAABBMUgACAI4AAAiwANiQkhUepkNBk0A0Gj0nqGMmmQMmhkGRpgRgVJRHqBPUGmBPQQB6mu/KQvlYVFwVWSqIERBhUJJEkSR53rKJMcLkAQB4VEmzyuIBAGNSSaLY2elZ4gEAapJc7BvQ6GAOz3zzwaWQh1wYvXevCRHSI64eYVYAyTeHJJpz9TxxkkkkkgAA+ewChlSjX5WsDQH+LuSKcKEh1Qr4og==")
    22  )
    23  
    24  func panicIfError(err error) {
    25  	if err != nil {
    26  		panic(err)
    27  	}
    28  }
    29  
    30  func TestGetEntries(t *testing.T) {
    31  	firmwareBytes, err := io.ReadAll(bzip2.NewReader(bytes.NewReader(fitHeadersSampleBZ2)))
    32  	panicIfError(err)
    33  
    34  	entries, err := GetEntries(firmwareBytes)
    35  	assert.NoError(t, err)
    36  
    37  	assert.Equal(t, 27, len(entries))
    38  }
    39  
    40  func TestGetEntriesInvalidAddr(t *testing.T) {
    41  	sampleEntries := getSampleEntries(t)
    42  	for _, entry := range sampleEntries[1:] {
    43  		entry.GetEntryBase().Headers.Address = 2<<32 + 1 // overflow
    44  		entry.GetEntryBase().DataSegmentBytes = nil
    45  	}
    46  
    47  	dummyImage := make([]byte, 1024)
    48  	err := sampleEntries.Inject(dummyImage, 512)
    49  	require.NoError(t, err)
    50  
    51  	// There should be no panic, and the errors should be inside entry headers.
    52  	entries, err := GetEntries(dummyImage)
    53  	require.NoError(t, err)
    54  	for _, entry := range entries[1:] {
    55  		switch entry := entry.(type) {
    56  		case *EntrySkip:
    57  			continue
    58  		default:
    59  			require.Contains(t, fmt.Sprintf("%v", entry.GetEntryBase().HeadersErrors), "index")
    60  		}
    61  	}
    62  }
    63  
    64  // BenchmarkGetEntries-8             520621              2357 ns/op            2944 B/op         59 allocs/op
    65  func BenchmarkGetEntries(b *testing.B) {
    66  	firmwareBytes, err := io.ReadAll(bzip2.NewReader(bytes.NewReader(fitHeadersSampleBZ2)))
    67  	panicIfError(err)
    68  
    69  	b.ReportAllocs()
    70  	b.ResetTimer()
    71  	for i := 0; i < b.N; i++ {
    72  		_, _ = GetEntries(firmwareBytes)
    73  	}
    74  }