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 }