github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/pkg/pci/bits_test.go (about) 1 // Copyright 2021 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 pci 6 7 import "testing" 8 9 func TestControlBits(t *testing.T) { 10 for _, tt := range []struct { 11 name string 12 control Control 13 want string 14 }{ 15 { 16 name: "test 0x0", 17 control: 0x0, 18 want: "I/O- Memory- DMA- Special- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisInt-", 19 }, 20 { 21 name: "test 0x001", 22 control: 0x001, 23 want: "I/O+ Memory- DMA- Special- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisInt-", 24 }, 25 { 26 name: "test 0x003", 27 control: 0x003, 28 want: "I/O+ Memory+ DMA- Special- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisInt-", 29 }, 30 { 31 name: "test 0x555", 32 control: 0x555, 33 want: "I/O+ Memory- DMA+ Special- MemWINV+ VGASnoop- ParErr+ Stepping- SERR+ FastB2B- DisInt+", 34 }, 35 { 36 name: "test 0xaaa", 37 control: 0xaaa, 38 want: "I/O- Memory+ DMA- Special+ MemWINV- VGASnoop+ ParErr- Stepping+ SERR- FastB2B+ DisInt-", 39 }, 40 { 41 name: "test 0xfff", 42 control: 0xfff, 43 want: "I/O+ Memory+ DMA+ Special+ MemWINV+ VGASnoop+ ParErr+ Stepping+ SERR+ FastB2B+ DisInt+", 44 }, 45 } { 46 t.Run(tt.name, func(t *testing.T) { 47 got := tt.control.String() 48 if got != tt.want { 49 t.Errorf("Control bits for '%#x': got: %q, want: %q", tt.control, got, tt.want) 50 } 51 }) 52 } 53 } 54 55 func TestStatusBits(t *testing.T) { 56 for _, tt := range []struct { 57 name string 58 status Status 59 want string 60 }{ 61 { 62 name: "test 0x0", 63 status: 0x0, 64 want: "INTx- Cap- 66MHz- UDF- FastB2b- ParErr- DEVSEL- DEVSEL=fast <MABORT- >SERR- <PERR-", 65 }, 66 { 67 name: "test 0x600", 68 status: 0x600, 69 want: "INTx- Cap- 66MHz- UDF- FastB2b- ParErr- DEVSEL- DEVSEL=reserved <MABORT- >SERR- <PERR-", 70 }, 71 { 72 name: "test 0x400", 73 status: 0x400, 74 want: "INTx- Cap- 66MHz- UDF- FastB2b- ParErr- DEVSEL- DEVSEL=slow <MABORT- >SERR- <PERR-", 75 }, 76 { 77 name: "test 0x200", 78 status: 0x200, 79 want: "INTx- Cap- 66MHz- UDF- FastB2b- ParErr- DEVSEL- DEVSEL=medium <MABORT- >SERR- <PERR-", 80 }, 81 { 82 name: "test 0xffff", 83 status: 0xffff, 84 want: "INTx+ Cap+ 66MHz+ UDF+ FastB2b+ ParErr+ DEVSEL+ DEVSEL=reserved <MABORT+ >SERR+ <PERR+", 85 }, 86 } { 87 t.Run(tt.name, func(t *testing.T) { 88 got := tt.status.String() 89 if got != tt.want { 90 t.Errorf("Control bits for '%#x': got: %q, want: %q", tt.status, got, tt.want) 91 } 92 }) 93 } 94 } 95 96 func TestBAR(t *testing.T) { 97 for i, tt := range []struct { 98 name string 99 bar string 100 want string 101 err string 102 }{ 103 { 104 name: "test1", 105 bar: "0x0000000000001860 0x0000000000001867 0x0000000000040101", 106 want: "Region 0: I/O ports at 1860 [size=8]", 107 }, 108 { 109 name: "test2", 110 bar: "0x0000000000001814 0x0000000000001817 0x0000000000040101", 111 want: "Region 1: I/O ports at 1814 [size=4]", 112 }, 113 { 114 name: "test3", 115 bar: "0x0000000000001818 0x000000000000181f 0x0000000000040101", 116 want: "Region 2: I/O ports at 1818 [size=8]", 117 }, 118 { 119 name: "test4", 120 bar: "0x0000000000001810 0x0000000000001813 0x0000000000040101", 121 want: "Region 3: I/O ports at 1810 [size=4]", 122 }, 123 { 124 name: "test5", 125 bar: "0x0000000000001840 0x000000000000185f 0x0000000000040101", 126 want: "Region 4: I/O ports at 1840 [size=32]", 127 }, 128 { 129 name: "test6", 130 bar: "0x00000000f2827000 0x00000000f28277ff 0x0000000000040200", 131 want: "Region 5: Memory at f2827000 (32-bit, non-prefetchable) [size=0x800]", 132 }, 133 { 134 name: "test7", 135 bar: "0x0000000000000000 0x0000000000000000 0x0000000000000000", 136 want: "", 137 }, 138 { 139 name: "test8", 140 bar: "z 0x0000000000080000 0x0000000000000000", 141 want: "", 142 err: "strconv.ParseUint: parsing \"z\": invalid syntax", 143 }, 144 { 145 name: "test9", 146 bar: " 0x0000000000080000 0x0000000000000000", 147 want: "", 148 err: "bar \" 0x0000000000080000 0x0000000000000000\" should have 3 fields", 149 }, 150 { 151 name: "test10", 152 bar: "0x00000000000c0000 0x00000000000dffff 0x0000000000000212", 153 want: "Region 9: (Disabled)Expansion ROM at 000c0000 (low 1Mbyte) [size=0x20000]", 154 }, 155 { 156 name: "test11", 157 bar: "0x00000000000c0001 0x00000000000dffff 0x0000000000000212", 158 want: "Region 10: Expansion ROM at 000c0000 (low 1Mbyte) [size=0x20000]", 159 }, 160 { 161 name: "test12", 162 bar: "0x0000000000080000 0x000000000008ffff 0x0000000000000212", 163 want: "Region 11: Memory at 00080000 (32-bit, low 1Mbyte, non-prefetchable) [size=0x10000]", 164 }, 165 } { 166 t.Run(tt.name, func(t *testing.T) { 167 base, limit, attribute, err := BaseLimType(tt.bar) 168 if err != nil && err.Error() != tt.err { 169 t.Errorf("BAR %s: got error: %q, want %q", tt.bar, err, tt.err) 170 } 171 if err == nil && len(tt.err) != 0 { 172 t.Errorf("BAR %s: got: 'nil', want %q", tt.bar, tt.err) 173 } 174 bar := BAR{Index: i, Base: base, Lim: limit, Attr: attribute} 175 got := bar.String() 176 if got != tt.want { 177 t.Errorf("BAR %s: got: %q, want: %q", tt.bar, got, tt.want) 178 } 179 }) 180 } 181 }