blob: 3ad76ffbad341417f355193b972e6ed7c1450b6c [file]
// Copyright The Prometheus Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//go:build linux
package sysfs
import (
"testing"
"github.com/google/go-cmp/cmp"
)
func TestPciDevices(t *testing.T) {
fs, err := NewFS(sysTestFixtures)
if err != nil {
t.Fatal(err)
}
got, err := fs.PciDevices()
if err != nil {
t.Fatal(err)
}
var (
LinkSpeed8GTs = 8.0
LinkSpeed16GTs = 16.0
LinkWidth4 = 4.0
LinkWidth8 = 8.0
// SR-IOV test values
SriovDriversAutoprobe = true
SriovNumvfs = uint32(0)
SriovOffset = uint32(8)
SriovStride = uint32(1)
SriovTotalvfs = uint32(128)
SriovVfDevice = uint32(0x1889)
SriovVfTotalMsix = uint64(4294967033)
// Optional device test values
NumaNode = int32(1)
NumaNodeNeg1 = int32(-1)
D3coldAllowed = true
PowerState = PciPowerStateD0
)
want := PciDevices{
"0000:00:02:1": PciDevice{
Location: PciDeviceLocation{
Segment: 0,
Bus: 0,
Device: 2,
Function: 1,
},
ParentLocation: nil,
Class: 0x060400,
Vendor: 0x1022,
Device: 0x1634,
SubsystemVendor: 0x17aa,
SubsystemDevice: 0x5095,
Revision: 0x00,
NumaNode: &NumaNodeNeg1,
MaxLinkSpeed: &LinkSpeed8GTs,
MaxLinkWidth: &LinkWidth8,
CurrentLinkSpeed: &LinkSpeed8GTs,
CurrentLinkWidth: &LinkWidth4,
D3coldAllowed: &D3coldAllowed,
PowerState: &PowerState,
},
"0000:01:00:0": PciDevice{
Location: PciDeviceLocation{
Segment: 0,
Bus: 1,
Device: 0,
Function: 0,
},
ParentLocation: &PciDeviceLocation{
Segment: 0,
Bus: 0,
Device: 2,
Function: 1,
},
Class: 0x010802,
Vendor: 0xc0a9,
Device: 0x540a,
SubsystemVendor: 0xc0a9,
SubsystemDevice: 0x5021,
Revision: 0x01,
NumaNode: &NumaNodeNeg1,
MaxLinkSpeed: &LinkSpeed8GTs,
MaxLinkWidth: &LinkWidth4,
CurrentLinkSpeed: &LinkSpeed8GTs,
CurrentLinkWidth: &LinkWidth4,
D3coldAllowed: &D3coldAllowed,
PowerState: &PowerState,
},
"0000:a2:00:0": PciDevice{
Location: PciDeviceLocation{
Segment: 0,
Bus: 0xa2,
Device: 0,
Function: 0,
},
ParentLocation: nil,
Class: 0x020000,
Vendor: 0x8086,
Device: 0x159b,
SubsystemVendor: 0x8086,
SubsystemDevice: 0x0003,
Revision: 0x02,
NumaNode: &NumaNode,
MaxLinkSpeed: &LinkSpeed16GTs,
MaxLinkWidth: &LinkWidth8,
CurrentLinkSpeed: &LinkSpeed16GTs,
CurrentLinkWidth: &LinkWidth8,
// SR-IOV fields
SriovDriversAutoprobe: &SriovDriversAutoprobe,
SriovNumvfs: &SriovNumvfs,
SriovOffset: &SriovOffset,
SriovStride: &SriovStride,
SriovTotalvfs: &SriovTotalvfs,
SriovVfDevice: &SriovVfDevice,
SriovVfTotalMsix: &SriovVfTotalMsix,
// Power management fields
D3coldAllowed: &D3coldAllowed,
PowerState: &PowerState,
},
}
if diff := cmp.Diff(want, got); diff != "" {
t.Fatalf("unexpected PciDevices (-want +got):\n%s", diff)
}
}
func TestParseDeviceLocation(t *testing.T) {
got, err := parsePciDeviceLocation("0001:9b:0c.0")
if err != nil {
t.Fatal(err)
}
want := &PciDeviceLocation{
Segment: 1,
Bus: 0x9b,
Device: 0xc,
Function: 0,
}
if diff := cmp.Diff(want, got); diff != "" {
t.Fatalf("unexpected location (-want +got):\n%s", diff)
}
}