gopkg.in/hugelgupf/u-root.v2@v2.0.0-20180831055005-3f8fdb0ce09d/pkg/boot/package_test.go (about)

     1  // Copyright 2018 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 boot
     6  
     7  import (
     8  	"crypto/rand"
     9  	"crypto/rsa"
    10  	"log"
    11  	"reflect"
    12  	"strings"
    13  	"testing"
    14  
    15  	"github.com/u-root/u-root/pkg/cpio"
    16  )
    17  
    18  type mockOSImage struct {
    19  	packErr error
    20  }
    21  
    22  var _ OSImage = &mockOSImage{}
    23  
    24  func newMockImage(*cpio.Archive) (OSImage, error) {
    25  	return &mockOSImage{}, nil
    26  }
    27  
    28  func (mockOSImage) ExecutionInfo(log *log.Logger)     {}
    29  func (mockOSImage) Execute() error                    { return nil }
    30  func (m mockOSImage) Pack(sw cpio.RecordWriter) error { return m.packErr }
    31  
    32  func packageEqual(p1, p2 *Package) bool {
    33  	li1, ok := p1.OSImage.(*LinuxImage)
    34  	if !ok {
    35  		return false
    36  	}
    37  	li2, ok := p2.OSImage.(*LinuxImage)
    38  	if !ok {
    39  		return false
    40  	}
    41  	return imageEqual(li1, li2) && reflect.DeepEqual(p1.Metadata, p2.Metadata)
    42  }
    43  
    44  func TestBootPackage(t *testing.T) {
    45  	privateKey, err := rsa.GenerateKey(rand.Reader, 4096)
    46  	if err != nil {
    47  		t.Errorf("GenerateKey() = %v", err)
    48  	}
    49  
    50  	for _, tt := range []struct {
    51  		pkg       *Package
    52  		packErr   error
    53  		unpackErr error
    54  		signer    *rsa.PrivateKey
    55  		verifier  *rsa.PublicKey
    56  	}{
    57  		{
    58  			pkg: &Package{
    59  				OSImage: &LinuxImage{
    60  					Kernel:  strings.NewReader("lana"),
    61  					Initrd:  strings.NewReader("mcnulty"),
    62  					Cmdline: "foo=bar",
    63  				},
    64  				Metadata: map[string]string{
    65  					"stuff": "fooasdf",
    66  				},
    67  			},
    68  			signer:   privateKey,
    69  			verifier: &privateKey.PublicKey,
    70  			packErr:  nil,
    71  		},
    72  		{
    73  			pkg: &Package{
    74  				OSImage: &LinuxImage{
    75  					Kernel:  strings.NewReader("lana"),
    76  					Initrd:  strings.NewReader("mcnulty"),
    77  					Cmdline: "foo=bar",
    78  				},
    79  				Metadata: map[string]string{
    80  					"stuff": "fooasdf",
    81  				},
    82  			},
    83  		},
    84  		{
    85  			pkg: &Package{
    86  				OSImage: &LinuxImage{
    87  					Kernel:  strings.NewReader("lana"),
    88  					Initrd:  strings.NewReader("mcnulty"),
    89  					Cmdline: "foo=bar",
    90  				},
    91  				Metadata: map[string]string{
    92  					"stuff": "fooasdf",
    93  				},
    94  			},
    95  			verifier:  &privateKey.PublicKey,
    96  			unpackErr: rsa.ErrVerification,
    97  		},
    98  		{
    99  			pkg: &Package{
   100  				OSImage: &LinuxImage{
   101  					Kernel:  strings.NewReader("lana"),
   102  					Initrd:  nil,
   103  					Cmdline: "foo=bar",
   104  				},
   105  				Metadata: map[string]string{},
   106  			},
   107  			signer:   privateKey,
   108  			verifier: &privateKey.PublicKey,
   109  			packErr:  nil,
   110  		},
   111  		{
   112  			pkg: &Package{
   113  				OSImage: &LinuxImage{
   114  					Kernel:  strings.NewReader("lana"),
   115  					Initrd:  nil,
   116  					Cmdline: "",
   117  				},
   118  				Metadata: map[string]string{},
   119  			},
   120  			signer:   privateKey,
   121  			verifier: &privateKey.PublicKey,
   122  			packErr:  nil,
   123  		},
   124  		{
   125  			pkg: &Package{
   126  				OSImage: &LinuxImage{
   127  					Kernel:  strings.NewReader("lana"),
   128  					Initrd:  nil,
   129  					Cmdline: "",
   130  				},
   131  				Metadata: map[string]string{
   132  					"abc":      "def",
   133  					"abcd/foo": "haha",
   134  				},
   135  			},
   136  			signer:   privateKey,
   137  			verifier: &privateKey.PublicKey,
   138  			packErr:  nil,
   139  		},
   140  		{
   141  			pkg: &Package{
   142  				OSImage: &LinuxImage{
   143  					Kernel:  strings.NewReader("lana"),
   144  					Initrd:  nil,
   145  					Cmdline: "",
   146  				},
   147  				Metadata: map[string]string{
   148  					"abc":     "def",
   149  					"abc/foo": "haha",
   150  				},
   151  			},
   152  			signer:   privateKey,
   153  			verifier: &privateKey.PublicKey,
   154  			packErr:  nil,
   155  		},
   156  	} {
   157  		a := cpio.InMemArchive()
   158  		if err := tt.pkg.Pack(a, tt.signer); err != tt.packErr {
   159  			t.Errorf("Pack(%v) = %v, want %v", tt.pkg, err, tt.packErr)
   160  		}
   161  
   162  		var p2 Package
   163  		if err := (&p2).Unpack(a.Reader(), tt.verifier); err != tt.unpackErr {
   164  			t.Errorf("Unpack() = %v, want %v", err, tt.unpackErr)
   165  		} else if err == nil {
   166  			if !packageEqual(tt.pkg, &p2) {
   167  				t.Errorf("packages are not equal: got %v\nwant %v", p2, tt.pkg)
   168  			}
   169  		}
   170  	}
   171  }