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  }