github.com/u-root/u-root@v7.0.1-0.20200915234505-ad7babab0a8e+incompatible/cmds/exp/bzimage/bzimage_test.go (about)

     1  // Copyright 2017-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 main
     6  
     7  import (
     8  	"io/ioutil"
     9  	"os"
    10  	"path/filepath"
    11  	"syscall"
    12  	"testing"
    13  
    14  	"github.com/u-root/u-root/pkg/boot/bzimage"
    15  	"github.com/u-root/u-root/pkg/testutil"
    16  )
    17  
    18  var (
    19  	// Test BzImage we are not using yet.
    20  	b = bzimage.BzImage{
    21  		BootCode:     []byte{1, 2, 3, 4},
    22  		KernelCode:   []byte{5, 6, 7, 8},
    23  		KernelBase:   0x100000,
    24  		KernelOffset: 620,
    25  		Header: bzimage.LinuxHeader{
    26  			MBRCode: [192]byte{
    27  				0xea, 0x05, 0x00, 0xc0, 0x07, 0x8c, 0xc8, 0x8e,
    28  				0xd8, 0x8e, 0xc0, 0x8e, 0xd0, 0x31, 0xe4, 0xfb,
    29  				0xfc, 0xbe, 0x2d, 0x00, 0xac, 0x20, 0xc0, 0x74,
    30  				0x09, 0xb4, 0x0e, 0xbb, 0x07, 0x00, 0xcd, 0x10,
    31  				0xeb, 0xf2, 0x31, 0xc0, 0xcd, 0x16, 0xcd, 0x19,
    32  				0xea, 0xf0, 0xff, 0x00, 0xf0, 0x55, 0x73, 0x65,
    33  				0x20, 0x61, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x20,
    34  				0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x0d,
    35  				0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65,
    36  				0x20, 0x64, 0x69, 0x73, 0x6b, 0x20, 0x61, 0x6e,
    37  				0x64, 0x20, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20,
    38  				0x61, 0x6e, 0x79, 0x20, 0x6b, 0x65, 0x79, 0x20,
    39  				0x74, 0x6f, 0x20, 0x72, 0x65, 0x62, 0x6f, 0x6f,
    40  				0x74, 0x2e, 0x2e, 0x2e, 0x0d, 0x0a, 0x00, 0x00,
    41  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    42  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    43  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    44  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    45  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    46  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    47  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    48  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    49  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    50  				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    51  			ExtRamdiskImage:     00,
    52  			ExtRamdiskSize:      00,
    53  			ExtCmdlinePtr:       00,
    54  			SetupSects:          0x1e,
    55  			RootFlags:           0x01,
    56  			Syssize:             0xb51d,
    57  			RamSize:             0x00,
    58  			Vidmode:             0xffff,
    59  			RootDev:             0x00,
    60  			Bootsectormagic:     0xaa55,
    61  			Jump:                0x66eb,
    62  			HeaderMagic:         [4]byte{0x48, 0x64, 0x72, 0x53},
    63  			Protocolversion:     0x20d,
    64  			RealModeSwitch:      0x00,
    65  			StartSys:            0x1000,
    66  			Kveraddr:            0x3140,
    67  			TypeOfLoader:        0x00,
    68  			Loadflags:           0x01,
    69  			Setupmovesize:       0x8000,
    70  			Code32Start:         0x100000,
    71  			RamDiskImage:        0x00,
    72  			RamDiskSize:         0x00,
    73  			BootSectKludge:      [4]uint8{},
    74  			Heapendptr:          0x5320,
    75  			ExtLoaderVer:        0x00,
    76  			ExtLoaderType:       0x00,
    77  			Cmdlineptr:          0x00,
    78  			InitrdAddrMax:       0x7fffffff,
    79  			Kernelalignment:     0x200000,
    80  			RelocatableKernel:   0x00,
    81  			MinAlignment:        0x15,
    82  			XLoadFlags:          0x01,
    83  			CmdLineSize:         0x7ff,
    84  			HardwareSubArch:     0x00,
    85  			HardwareSubArchData: 0x00,
    86  			PayloadOffset:       0x255,
    87  			PayloadSize:         0x9532c,
    88  			SetupData:           0x00,
    89  			PrefAddress:         0x1000000,
    90  			InitSize:            0x6e0000,
    91  			HandoverOffset:      0x00,
    92  		},
    93  	}
    94  	uskip = len("2018/08/10 21:20:42 ")
    95  )
    96  
    97  func TestSimple(t *testing.T) {
    98  	tmpDir, err := ioutil.TempDir("", "bzImage")
    99  	if err != nil {
   100  		t.Fatal(err)
   101  	}
   102  	defer os.RemoveAll(tmpDir)
   103  
   104  	var tests = []struct {
   105  		args   []string
   106  		name   string
   107  		status int
   108  		out    string
   109  		skip   int
   110  	}{
   111  		{
   112  			args:   []string{"initramfs", "bzImage", "init.cpio", "zz/zz/zz"},
   113  			name:   "too big initramfs",
   114  			status: 1,
   115  			out:    "new initramfs is 1536 bytes, won't fit in 480 byte old one\n",
   116  			skip:   uskip,
   117  		},
   118  		{
   119  			args:   []string{"initramfs", "bzImage", "/dev/null", "zz/zz/zz"},
   120  			name:   "Bad output file",
   121  			status: 1,
   122  			out:    "open zz/zz/zz: no such file or directory\n",
   123  			skip:   uskip,
   124  		},
   125  		{
   126  			args:   []string{"initramfs", "bzImage", "/dev/null", filepath.Join(tmpDir, "zz")},
   127  			name:   "correct initramfs test",
   128  			status: 0,
   129  			out:    "",
   130  		},
   131  		{
   132  			args:   []string{},
   133  			name:   "no args",
   134  			status: 1,
   135  			out:    cmdUsage + "\n",
   136  			skip:   uskip,
   137  		},
   138  		{
   139  			args:   []string{"dump", "bzImage"},
   140  			name:   "dump",
   141  			status: 0,
   142  			out:    "MBRCode:0xea0500c0078cc88ed88ec08ed031e4fbfcbe2d00ac20c07409b40ebb0700cd10ebf231c0cd16cd19eaf0ff00f0557365206120626f6f74206c6f616465722e0d0a0a52656d6f7665206469736b20616e6420707265737320616e79206b657920746f207265626f6f742e2e2e0d0a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nExtRamdiskImage:0x00\nExtRamdiskSize:0x00\nExtCmdlinePtr:0x00\nO:0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff\nSetupSects:0x1e\nRootFlags:0x01\nSyssize:0xb51d\nRamSize:0x00\nVidmode:0xffff\nRootDev:0x00\nBootsectormagic:0xaa55\nJump:0x66eb\nHeaderMagic:0x48647253\nProtocolversion:0x20d\nRealModeSwitch:0x00\nStartSys:0x1000\nKveraddr:0x3140\nTypeOfLoader:0x00\nLoadflags:0x01\nSetupmovesize:0x8000\nCode32Start:0x100000\nRamDiskImage:0x00\nRamDiskSize:0x00\nBootSectKludge:0x00000000\nHeapendptr:0x5320\nExtLoaderVer:0x00\nExtLoaderType:0x00\nCmdlineptr:0x00\nInitrdAddrMax:0x7fffffff\nKernelalignment:0x200000\nRelocatableKernel:0x00\nMinAlignment:0x15\nXLoadFlags:0x01\nCmdLineSize:0x7ff\nHardwareSubArch:0x00\nHardwareSubArchData:0x00\nPayloadOffset:0x255\nPayloadSize:0x9532c\nSetupData:0x00\nPrefAddress:0x1000000\nInitSize:0x6e0000\nHandoverOffset:0x00\n",
   143  		},
   144  		{
   145  			args:   []string{"initramfs"},
   146  			name:   "initramfs with no args",
   147  			status: 1,
   148  			out:    cmdUsage + "\n",
   149  			skip:   uskip,
   150  		},
   151  		{
   152  			args:   []string{"initramfs", "a", "b", "c", "too many"},
   153  			name:   "initramfs with too many args",
   154  			status: 1,
   155  			out:    cmdUsage + "\n",
   156  			skip:   uskip,
   157  		},
   158  		{
   159  			args:   []string{"initramfs", "a", "b", "c"},
   160  			name:   "initramfs with bad input file",
   161  			status: 1,
   162  			out:    "open a: no such file or directory\n",
   163  			skip:   uskip,
   164  		},
   165  		{
   166  			args:   []string{"initramfs", "bzImage", "b", "c"},
   167  			name:   "initramfs with bad initramfs file",
   168  			status: 1,
   169  			out:    "open b: no such file or directory\n",
   170  			skip:   uskip,
   171  		},
   172  	}
   173  
   174  	// Table-driven testing
   175  	for _, tt := range tests {
   176  		t.Run(tt.name, func(t *testing.T) {
   177  			c := testutil.Command(t, tt.args...)
   178  			c.Dir = "../../../pkg/boot/bzimage/testdata"
   179  			// ignore the error, we deal with it via process status,
   180  			// and most of these commands are supposed to get an error.
   181  			out, _ := c.CombinedOutput()
   182  			status := c.ProcessState.Sys().(syscall.WaitStatus).ExitStatus()
   183  			if tt.status != status {
   184  				t.Errorf("err got: %v want %v", status, tt.status)
   185  			}
   186  			m := string(out[tt.skip:])
   187  			if m != tt.out {
   188  				t.Errorf("got:'%q'(%d bytes)want:'%q'(%d bytes)", m, len(m), tt.out, len(tt.out))
   189  			}
   190  		})
   191  	}
   192  }
   193  
   194  func TestMain(m *testing.M) {
   195  	testutil.Run(m, main)
   196  }