github.com/hugelgupf/u-root@v0.0.0-20191023214958-4807c632154c/pkg/bootconfig/zipconfig_test.go (about)

     1  // Copyright 2017-2019 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 bootconfig
     6  
     7  import (
     8  	"archive/zip"
     9  	"io/ioutil"
    10  	"log"
    11  	"os"
    12  	"testing"
    13  
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  // the sample ZIP file contains the following structure:
    18  // test/
    19  // test/a
    20  //
    21  // where the file "test/a" contains the ASCII string "blah"
    22  var sampleZIP = []byte("PK\x03\x04\n\x00\x00\x00\x00\x00\xa6\x858M\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x1c\x00test/UT\t\x00\x03\x88\x06\xa9[\x8b\x06\xa9[ux\x0b\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xa6\x858M-2\xc4P\x05\x00\x00\x00\x05\x00\x00\x00\x06\x00\x1c\x00test/aUT\t\x00\x03\x88\x06\xa9[\x88\x06\xa9[ux\x0b\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00blah\nPK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xa6\x858M\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xfdA\x00\x00\x00\x00test/UT\x05\x00\x03\x88\x06\xa9[ux\x0b\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xa6\x858M-2\xc4P\x05\x00\x00\x00\x05\x00\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x01\x00\x00\x00\xb4\x81?\x00\x00\x00test/aUT\x05\x00\x03\x88\x06\xa9[ux\x0b\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x05\x06\x00\x00\x00\x00\x02\x00\x02\x00\x97\x00\x00\x00\x84\x00\x00\x00\x00\x00")
    23  
    24  func TestMemoryZipReader(t *testing.T) {
    25  	r, err := zip.NewReader(&memoryZipReader{Content: sampleZIP}, int64(len(sampleZIP)))
    26  	require.NoError(t, err)
    27  	// this is ugly, but we expect exactly this sequence of files (and the
    28  	// parent directory has to be first)
    29  	var numEntries int
    30  	for idx, f := range r.File {
    31  		numEntries++
    32  		switch idx {
    33  		case 0:
    34  			require.Equal(t, "test/", f.Name)
    35  		case 1:
    36  			require.Equal(t, "test/a", f.Name)
    37  			fd, err := f.Open()
    38  			require.NoError(t, err)
    39  			buf, err := ioutil.ReadAll(fd)
    40  			require.NoError(t, err)
    41  			require.Equal(t, []byte("blah\n"), buf)
    42  		}
    43  	}
    44  	// exactly two entries in the zip file
    45  	require.Equal(t, 2, numEntries)
    46  }
    47  
    48  func TestFromZip(t *testing.T) {
    49  	manifest, tempdir, err := FromZip("testdata/bootconfig.zip", nil)
    50  	defer func() {
    51  		if tempdir != "" {
    52  			if err := os.RemoveAll(tempdir); err != nil {
    53  				log.Printf("Cannot remove temp dir %s: %v", tempdir, err)
    54  			}
    55  		}
    56  	}()
    57  	require.NoError(t, err)
    58  	require.NotEqual(t, "", tempdir)
    59  	require.NotNil(t, manifest)
    60  	require.Equal(t, 1, manifest.Version)
    61  	require.Equal(t, 1, len(manifest.Configs))
    62  	bc := manifest.Configs[0]
    63  	require.Equal(t, "first boot entry", bc.Name)
    64  	require.Equal(t, "/path/to/kernel", bc.Kernel)
    65  	require.Equal(t, "console=ttyS0", bc.KernelArgs)
    66  }
    67  
    68  func TestFromZipWithSignature(t *testing.T) {
    69  	pubkey := "testdata/pubkey"
    70  	manifest, tempdir, err := FromZip("testdata/bootconfig_signed.zip", &pubkey)
    71  	defer func() {
    72  		if tempdir != "" {
    73  			if err := os.RemoveAll(tempdir); err != nil {
    74  				log.Printf("Cannot remove temp dir %s: %v", tempdir, err)
    75  			}
    76  		}
    77  	}()
    78  	require.NoError(t, err)
    79  	require.NotEqual(t, "", tempdir)
    80  	require.NotNil(t, manifest)
    81  	require.Equal(t, 1, manifest.Version)
    82  	require.Equal(t, 1, len(manifest.Configs))
    83  	bc := manifest.Configs[0]
    84  	require.Equal(t, "boot entry 0", bc.Name)
    85  	require.Equal(t, "/path/to/kernel", bc.Kernel)
    86  }
    87  
    88  func TestFromZipWithMissingSignature(t *testing.T) {
    89  	pubkey := "testdata/pubkey"
    90  	_, tempdir, err := FromZip("testdata/bootconfig.zip", &pubkey)
    91  	defer func() {
    92  		// called just in case FromZip does not return an error
    93  		if tempdir != "" {
    94  			if err := os.RemoveAll(tempdir); err != nil {
    95  				log.Printf("Cannot remove temp dir %s: %v", tempdir, err)
    96  			}
    97  		}
    98  	}()
    99  	require.Error(t, err)
   100  }
   101  
   102  func TestFromZipNoSuchFile(t *testing.T) {
   103  	_, _, err := FromZip("testdata/nonexisting_bootconfig.zip", nil)
   104  	require.Error(t, err)
   105  }