github.com/u-root/u-root@v7.0.1-0.20200915234505-ad7babab0a8e+incompatible/pkg/boot/multiboot/mutiboot_info_test.go (about) 1 // Copyright 2020 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 multiboot 6 7 import ( 8 "testing" 9 10 "github.com/google/go-cmp/cmp" 11 ) 12 13 func TestInfoMarshal(t *testing.T) { 14 for _, tt := range []struct { 15 name string 16 mi *mutibootInfo 17 want []byte 18 }{ 19 { 20 name: "no elements", 21 mi: &mutibootInfo{ 22 cmdline: 0xdeadbeef, 23 elems: nil, 24 }, 25 want: []byte{ 26 // cmdline 27 0xef, 0xbe, 0xad, 0xde, 0, 0, 0, 0, 28 // 0 elements 29 0, 0, 0, 0, 0, 0, 0, 0, 30 }, 31 }, 32 { 33 name: "one memrange element", 34 mi: &mutibootInfo{ 35 cmdline: 0xdeadbeef, 36 elems: []elem{ 37 &mutibootMemRange{ 38 startAddr: 0xbeefdead, 39 length: 0xdeadbeef, 40 memType: 2, 41 }, 42 }, 43 }, 44 want: []byte{ 45 // cmdline 46 0xef, 0xbe, 0xad, 0xde, 0, 0, 0, 0, 47 // 1 element 48 0x1, 0, 0, 0, 0, 0, 0, 0, 49 50 // TLV -- type, length, value 51 52 // type 53 byte(MUTIBOOT_MEMRANGE_TYPE), 0, 0, 0, 54 // length - 20 bytes + 8 for the length + 4 for the type 55 32, 0, 0, 0, 0, 0, 0, 0, 56 // values 57 0xad, 0xde, 0xef, 0xbe, 0, 0, 0, 0, 58 0xef, 0xbe, 0xad, 0xde, 0, 0, 0, 0, 59 2, 0, 0, 0, 60 }, 61 }, 62 { 63 name: "one module element", 64 mi: &mutibootInfo{ 65 cmdline: 0xdeadbeef, 66 elems: []elem{ 67 &mutibootModule{ 68 cmdline: 0xbeefdead, 69 moduleSize: 0x1000, 70 ranges: []mutibootModuleRange{ 71 { 72 startPageNum: 0x100, 73 numPages: 1, 74 }, 75 }, 76 }, 77 }, 78 }, 79 want: []byte{ 80 // cmdline 81 0xef, 0xbe, 0xad, 0xde, 0, 0, 0, 0, 82 // 1 element 83 0x1, 0, 0, 0, 0, 0, 0, 0, 84 85 // TLV -- type, length, value 86 87 // type 88 byte(MUTIBOOT_MODULE_TYPE), 0, 0, 0, 89 // length - 36 bytes + 8 for the length + 4 for the type 90 48, 0, 0, 0, 0, 0, 0, 0, 91 // values 92 // cmdline 93 0xad, 0xde, 0xef, 0xbe, 0, 0, 0, 0, 94 // moduleSize 95 0x00, 0x10, 0, 0, 0, 0, 0, 0, 96 // numRanges 97 1, 0, 0, 0, 98 // range - startPageNum 99 0x00, 0x01, 0, 0, 0, 0, 0, 0, 100 // range - numPages 101 1, 0, 0, 0, 102 // padding 103 0, 0, 0, 0, 104 }, 105 }, 106 { 107 name: "one zero-length module element", 108 mi: &mutibootInfo{ 109 cmdline: 0xdeadbeef, 110 elems: []elem{ 111 &mutibootModule{ 112 cmdline: 0xbeefdead, 113 moduleSize: 0, 114 }, 115 }, 116 }, 117 want: []byte{ 118 // cmdline 119 0xef, 0xbe, 0xad, 0xde, 0, 0, 0, 0, 120 // 1 element 121 0x1, 0, 0, 0, 0, 0, 0, 0, 122 123 // TLV -- type, length, value 124 125 // type 126 byte(MUTIBOOT_MODULE_TYPE), 0, 0, 0, 127 // length - 20 bytes + 8 for the length + 4 for the type 128 32, 0, 0, 0, 0, 0, 0, 0, 129 // values 130 // cmdline 131 0xad, 0xde, 0xef, 0xbe, 0, 0, 0, 0, 132 // moduleSize 133 0, 0, 0, 0, 0, 0, 0, 0, 134 // numRanges 135 0, 0, 0, 0, 136 }, 137 }, 138 } { 139 t.Run(tt.name, func(t *testing.T) { 140 got := tt.mi.marshal() 141 if !cmp.Equal(got, tt.want) { 142 t.Errorf("marshaled bytes not the same. diff (-want, +got):\n%s", cmp.Diff(tt.want, got)) 143 } 144 }) 145 } 146 }