mirror of
https://github.com/NVIDIA/nvidia-container-toolkit
synced 2025-06-26 18:18:24 +00:00
Fix mode detection on Thor-based systems
This change updates github.com/NVIDIA/go-nvlib from v0.7.1 to v0.7.2 to allow Thor systems to be detected as Tegra-based. This allows fixes automatic mode detection to work on these systems. Signed-off-by: Evan Lezar <elezar@nvidia.com>
This commit is contained in:
parent
63e8ecbc8e
commit
ce6928ccca
4
go.mod
4
go.mod
@ -3,7 +3,7 @@ module github.com/NVIDIA/nvidia-container-toolkit
|
|||||||
go 1.22
|
go 1.22
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/NVIDIA/go-nvlib v0.6.1
|
github.com/NVIDIA/go-nvlib v0.7.2
|
||||||
github.com/NVIDIA/go-nvml v0.12.4-1
|
github.com/NVIDIA/go-nvml v0.12.4-1
|
||||||
github.com/fsnotify/fsnotify v1.7.0
|
github.com/fsnotify/fsnotify v1.7.0
|
||||||
github.com/moby/sys/symlink v0.3.0
|
github.com/moby/sys/symlink v0.3.0
|
||||||
@ -11,7 +11,7 @@ require (
|
|||||||
github.com/opencontainers/runtime-spec v1.2.1
|
github.com/opencontainers/runtime-spec v1.2.1
|
||||||
github.com/pelletier/go-toml v1.9.5
|
github.com/pelletier/go-toml v1.9.5
|
||||||
github.com/sirupsen/logrus v1.9.3
|
github.com/sirupsen/logrus v1.9.3
|
||||||
github.com/stretchr/testify v1.9.0
|
github.com/stretchr/testify v1.10.0
|
||||||
github.com/urfave/cli/v2 v2.27.5
|
github.com/urfave/cli/v2 v2.27.5
|
||||||
golang.org/x/mod v0.20.0
|
golang.org/x/mod v0.20.0
|
||||||
golang.org/x/sys v0.28.0
|
golang.org/x/sys v0.28.0
|
||||||
|
8
go.sum
8
go.sum
@ -1,5 +1,5 @@
|
|||||||
github.com/NVIDIA/go-nvlib v0.6.1 h1:0/5FvaKvDJoJeJ+LFlh+NDQMxMlVw9wOXrOVrGXttfE=
|
github.com/NVIDIA/go-nvlib v0.7.2 h1:7sy/NVUa4sM9FLKwH6CjBfHSWrJUmv8emVyxLTzjfOA=
|
||||||
github.com/NVIDIA/go-nvlib v0.6.1/go.mod h1:9UrsLGx/q1OrENygXjOuM5Ey5KCtiZhbvBlbUIxtGWY=
|
github.com/NVIDIA/go-nvlib v0.7.2/go.mod h1:2Kh2kYSP5IJ8EKf0/SYDzHiQKb9EJkwOf2LQzu6pXzY=
|
||||||
github.com/NVIDIA/go-nvml v0.12.4-1 h1:WKUvqshhWSNTfm47ETRhv0A0zJyr1ncCuHiXwoTrBEc=
|
github.com/NVIDIA/go-nvml v0.12.4-1 h1:WKUvqshhWSNTfm47ETRhv0A0zJyr1ncCuHiXwoTrBEc=
|
||||||
github.com/NVIDIA/go-nvml v0.12.4-1/go.mod h1:8Llmj+1Rr+9VGGwZuRer5N/aCjxGuR5nPb/9ebBiIEQ=
|
github.com/NVIDIA/go-nvml v0.12.4-1/go.mod h1:8Llmj+1Rr+9VGGwZuRer5N/aCjxGuR5nPb/9ebBiIEQ=
|
||||||
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
|
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
|
||||||
@ -60,8 +60,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
|
|||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI=
|
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI=
|
||||||
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
||||||
github.com/urfave/cli v1.19.1/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
github.com/urfave/cli v1.19.1/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||||
|
@ -216,7 +216,7 @@ func TestResolveAutoMode(t *testing.T) {
|
|||||||
HasTegraFilesFunc: func() (bool, string) {
|
HasTegraFilesFunc: func() (bool, string) {
|
||||||
return tc.info["tegra"], "tegra"
|
return tc.info["tegra"], "tegra"
|
||||||
},
|
},
|
||||||
UsesOnlyNVGPUModuleFunc: func() (bool, string) {
|
HasOnlyIntegratedGPUsFunc: func() (bool, string) {
|
||||||
return tc.info["nvgpu"], "nvgpu"
|
return tc.info["nvgpu"], "nvgpu"
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
52
vendor/github.com/NVIDIA/go-nvlib/pkg/nvlib/device/device.go
generated
vendored
52
vendor/github.com/NVIDIA/go-nvlib/pkg/nvlib/device/device.go
generated
vendored
@ -32,6 +32,7 @@ type Device interface {
|
|||||||
GetMigDevices() ([]MigDevice, error)
|
GetMigDevices() ([]MigDevice, error)
|
||||||
GetMigProfiles() ([]MigProfile, error)
|
GetMigProfiles() ([]MigProfile, error)
|
||||||
GetPCIBusID() (string, error)
|
GetPCIBusID() (string, error)
|
||||||
|
IsFabricAttached() (bool, error)
|
||||||
IsMigCapable() (bool, error)
|
IsMigCapable() (bool, error)
|
||||||
IsMigEnabled() (bool, error)
|
IsMigEnabled() (bool, error)
|
||||||
VisitMigDevices(func(j int, m MigDevice) error) error
|
VisitMigDevices(func(j int, m MigDevice) error) error
|
||||||
@ -85,7 +86,7 @@ func (d *device) GetArchitectureAsString() (string, error) {
|
|||||||
case nvml.DEVICE_ARCH_AMPERE:
|
case nvml.DEVICE_ARCH_AMPERE:
|
||||||
return "Ampere", nil
|
return "Ampere", nil
|
||||||
case nvml.DEVICE_ARCH_ADA:
|
case nvml.DEVICE_ARCH_ADA:
|
||||||
return "Ada", nil
|
return "Ada Lovelace", nil
|
||||||
case nvml.DEVICE_ARCH_HOPPER:
|
case nvml.DEVICE_ARCH_HOPPER:
|
||||||
return "Hopper", nil
|
return "Hopper", nil
|
||||||
case nvml.DEVICE_ARCH_UNKNOWN:
|
case nvml.DEVICE_ARCH_UNKNOWN:
|
||||||
@ -124,7 +125,7 @@ func (d *device) GetBrandAsString() (string, error) {
|
|||||||
case nvml.BRAND_NVIDIA_VWS:
|
case nvml.BRAND_NVIDIA_VWS:
|
||||||
return "NvidiaVWS", nil
|
return "NvidiaVWS", nil
|
||||||
// Deprecated in favor of nvml.BRAND_NVIDIA_CLOUD_GAMING
|
// Deprecated in favor of nvml.BRAND_NVIDIA_CLOUD_GAMING
|
||||||
//case nvml.BRAND_NVIDIA_VGAMING:
|
// case nvml.BRAND_NVIDIA_VGAMING:
|
||||||
// return "VGaming", nil
|
// return "VGaming", nil
|
||||||
case nvml.BRAND_NVIDIA_CLOUD_GAMING:
|
case nvml.BRAND_NVIDIA_CLOUD_GAMING:
|
||||||
return "NvidiaCloudGaming", nil
|
return "NvidiaCloudGaming", nil
|
||||||
@ -208,6 +209,53 @@ func (d *device) IsMigEnabled() (bool, error) {
|
|||||||
return (mode == nvml.DEVICE_MIG_ENABLE), nil
|
return (mode == nvml.DEVICE_MIG_ENABLE), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsFabricAttached checks if a device is attached to a GPU fabric.
|
||||||
|
func (d *device) IsFabricAttached() (bool, error) {
|
||||||
|
if d.lib.hasSymbol("nvmlDeviceGetGpuFabricInfo") {
|
||||||
|
info, ret := d.GetGpuFabricInfo()
|
||||||
|
if ret == nvml.ERROR_NOT_SUPPORTED {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
if ret != nvml.SUCCESS {
|
||||||
|
return false, fmt.Errorf("error getting GPU Fabric Info: %v", ret)
|
||||||
|
}
|
||||||
|
if info.State != nvml.GPU_FABRIC_STATE_COMPLETED {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
if info.ClusterUuid == [16]uint8{} {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
if nvml.Return(info.Status) != nvml.SUCCESS {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if d.lib.hasSymbol("nvmlDeviceGetGpuFabricInfoV") {
|
||||||
|
info, ret := d.GetGpuFabricInfoV().V2()
|
||||||
|
if ret == nvml.ERROR_NOT_SUPPORTED {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
if ret != nvml.SUCCESS {
|
||||||
|
return false, fmt.Errorf("error getting GPU Fabric Info: %v", ret)
|
||||||
|
}
|
||||||
|
if info.State != nvml.GPU_FABRIC_STATE_COMPLETED {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
if info.ClusterUuid == [16]uint8{} {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
if nvml.Return(info.Status) != nvml.SUCCESS {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
// VisitMigDevices walks a top-level device and invokes a callback function for each MIG device configured on it.
|
// VisitMigDevices walks a top-level device and invokes a callback function for each MIG device configured on it.
|
||||||
func (d *device) VisitMigDevices(visit func(int, MigDevice) error) error {
|
func (d *device) VisitMigDevices(visit func(int, MigDevice) error) error {
|
||||||
capable, err := d.IsMigCapable()
|
capable, err := d.IsMigCapable()
|
||||||
|
8
vendor/github.com/NVIDIA/go-nvlib/pkg/nvlib/device/mig_device.go
generated
vendored
8
vendor/github.com/NVIDIA/go-nvlib/pkg/nvlib/device/mig_device.go
generated
vendored
@ -63,7 +63,7 @@ func (m *migdevice) GetProfile() (MigProfile, error) {
|
|||||||
return m.profile, nil
|
return m.profile, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
parent, ret := m.Device.GetDeviceHandleFromMigDeviceHandle()
|
parent, ret := m.GetDeviceHandleFromMigDeviceHandle()
|
||||||
if ret != nvml.SUCCESS {
|
if ret != nvml.SUCCESS {
|
||||||
return nil, fmt.Errorf("error getting parent device handle: %v", ret)
|
return nil, fmt.Errorf("error getting parent device handle: %v", ret)
|
||||||
}
|
}
|
||||||
@ -73,17 +73,17 @@ func (m *migdevice) GetProfile() (MigProfile, error) {
|
|||||||
return nil, fmt.Errorf("error getting parent memory info: %v", ret)
|
return nil, fmt.Errorf("error getting parent memory info: %v", ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
attributes, ret := m.Device.GetAttributes()
|
attributes, ret := m.GetAttributes()
|
||||||
if ret != nvml.SUCCESS {
|
if ret != nvml.SUCCESS {
|
||||||
return nil, fmt.Errorf("error getting MIG device attributes: %v", ret)
|
return nil, fmt.Errorf("error getting MIG device attributes: %v", ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
giID, ret := m.Device.GetGpuInstanceId()
|
giID, ret := m.GetGpuInstanceId()
|
||||||
if ret != nvml.SUCCESS {
|
if ret != nvml.SUCCESS {
|
||||||
return nil, fmt.Errorf("error getting MIG device GPU Instance ID: %v", ret)
|
return nil, fmt.Errorf("error getting MIG device GPU Instance ID: %v", ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
ciID, ret := m.Device.GetComputeInstanceId()
|
ciID, ret := m.GetComputeInstanceId()
|
||||||
if ret != nvml.SUCCESS {
|
if ret != nvml.SUCCESS {
|
||||||
return nil, fmt.Errorf("error getting MIG device Compute Instance ID: %v", ret)
|
return nil, fmt.Errorf("error getting MIG device Compute Instance ID: %v", ret)
|
||||||
}
|
}
|
||||||
|
4
vendor/github.com/NVIDIA/go-nvlib/pkg/nvlib/info/api.go
generated
vendored
4
vendor/github.com/NVIDIA/go-nvlib/pkg/nvlib/info/api.go
generated
vendored
@ -30,12 +30,14 @@ type PlatformResolver interface {
|
|||||||
// PropertyExtractor provides a set of functions to query capabilities of the
|
// PropertyExtractor provides a set of functions to query capabilities of the
|
||||||
// system.
|
// system.
|
||||||
//
|
//
|
||||||
//go:generate moq -rm -out property-extractor_mock.go . PropertyExtractor
|
//go:generate moq -rm -fmt=goimports -out property-extractor_mock.go . PropertyExtractor
|
||||||
type PropertyExtractor interface {
|
type PropertyExtractor interface {
|
||||||
HasDXCore() (bool, string)
|
HasDXCore() (bool, string)
|
||||||
HasNvml() (bool, string)
|
HasNvml() (bool, string)
|
||||||
HasTegraFiles() (bool, string)
|
HasTegraFiles() (bool, string)
|
||||||
// Deprecated: Use HasTegraFiles instead.
|
// Deprecated: Use HasTegraFiles instead.
|
||||||
IsTegraSystem() (bool, string)
|
IsTegraSystem() (bool, string)
|
||||||
|
// Deprecated: Use HasOnlyIntegratedGPUs
|
||||||
UsesOnlyNVGPUModule() (bool, string)
|
UsesOnlyNVGPUModule() (bool, string)
|
||||||
|
HasOnlyIntegratedGPUs() (bool, string)
|
||||||
}
|
}
|
||||||
|
32
vendor/github.com/NVIDIA/go-nvlib/pkg/nvlib/info/property-extractor.go
generated
vendored
32
vendor/github.com/NVIDIA/go-nvlib/pkg/nvlib/info/property-extractor.go
generated
vendored
@ -90,16 +90,24 @@ func (i *propertyExtractor) HasTegraFiles() (bool, string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// UsesOnlyNVGPUModule checks whether the only the nvgpu module is used.
|
// UsesOnlyNVGPUModule checks whether the only the nvgpu module is used.
|
||||||
// This kernel module is used on Tegra-based systems when using the iGPU.
|
|
||||||
// Since some of these systems also support NVML, we use the device name
|
|
||||||
// reported by NVML to determine whether the system is an iGPU system.
|
|
||||||
//
|
//
|
||||||
// Devices that use the nvgpu module have their device names as:
|
// Deprecated: UsesOnlyNVGPUModule is deprecated, use HasOnlyIntegratedGPUs instead.
|
||||||
|
func (i *propertyExtractor) UsesOnlyNVGPUModule() (uses bool, reason string) {
|
||||||
|
return i.HasOnlyIntegratedGPUs()
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasOnlyIntegratedGPUs checks whether all GPUs are iGPUs that use NVML.
|
||||||
|
//
|
||||||
|
// As of Orin-based systems iGPUs also support limited NVML queries.
|
||||||
|
// In the absence of a robust API, we rely on heuristics to make this decision.
|
||||||
|
//
|
||||||
|
// The following device names are checked:
|
||||||
//
|
//
|
||||||
// GPU 0: Orin (nvgpu) (UUID: 54d0709b-558d-5a59-9c65-0c5fc14a21a4)
|
// GPU 0: Orin (nvgpu) (UUID: 54d0709b-558d-5a59-9c65-0c5fc14a21a4)
|
||||||
|
// GPU 0: NVIDIA Thor (UUID: 54d0709b-558d-5a59-9c65-0c5fc14a21a4)
|
||||||
//
|
//
|
||||||
// This function returns true if ALL devices use the nvgpu module.
|
// This function returns true if ALL devices are detected as iGPUs.
|
||||||
func (i *propertyExtractor) UsesOnlyNVGPUModule() (uses bool, reason string) {
|
func (i *propertyExtractor) HasOnlyIntegratedGPUs() (uses bool, reason string) {
|
||||||
// We ensure that this function never panics
|
// We ensure that this function never panics
|
||||||
defer func() {
|
defer func() {
|
||||||
if err := recover(); err != nil {
|
if err := recover(); err != nil {
|
||||||
@ -135,9 +143,19 @@ func (i *propertyExtractor) UsesOnlyNVGPUModule() (uses bool, reason string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, name := range names {
|
for _, name := range names {
|
||||||
if !strings.Contains(name, "(nvgpu)") {
|
if !isIntegratedGPUName(name) {
|
||||||
return false, fmt.Sprintf("device %q does not use nvgpu module", name)
|
return false, fmt.Sprintf("device %q does not use nvgpu module", name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true, "all devices use nvgpu module"
|
return true, "all devices use nvgpu module"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isIntegratedGPUName(name string) bool {
|
||||||
|
if strings.Contains(name, "(nvgpu)") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if strings.Contains(name, "NVIDIA Thor") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
47
vendor/github.com/NVIDIA/go-nvlib/pkg/nvlib/info/property-extractor_mock.go
generated
vendored
47
vendor/github.com/NVIDIA/go-nvlib/pkg/nvlib/info/property-extractor_mock.go
generated
vendored
@ -23,6 +23,9 @@ var _ PropertyExtractor = &PropertyExtractorMock{}
|
|||||||
// HasNvmlFunc: func() (bool, string) {
|
// HasNvmlFunc: func() (bool, string) {
|
||||||
// panic("mock out the HasNvml method")
|
// panic("mock out the HasNvml method")
|
||||||
// },
|
// },
|
||||||
|
// HasOnlyIntegratedGPUsFunc: func() (bool, string) {
|
||||||
|
// panic("mock out the HasOnlyIntegratedGPUs method")
|
||||||
|
// },
|
||||||
// HasTegraFilesFunc: func() (bool, string) {
|
// HasTegraFilesFunc: func() (bool, string) {
|
||||||
// panic("mock out the HasTegraFiles method")
|
// panic("mock out the HasTegraFiles method")
|
||||||
// },
|
// },
|
||||||
@ -45,6 +48,9 @@ type PropertyExtractorMock struct {
|
|||||||
// HasNvmlFunc mocks the HasNvml method.
|
// HasNvmlFunc mocks the HasNvml method.
|
||||||
HasNvmlFunc func() (bool, string)
|
HasNvmlFunc func() (bool, string)
|
||||||
|
|
||||||
|
// HasOnlyIntegratedGPUsFunc mocks the HasOnlyIntegratedGPUs method.
|
||||||
|
HasOnlyIntegratedGPUsFunc func() (bool, string)
|
||||||
|
|
||||||
// HasTegraFilesFunc mocks the HasTegraFiles method.
|
// HasTegraFilesFunc mocks the HasTegraFiles method.
|
||||||
HasTegraFilesFunc func() (bool, string)
|
HasTegraFilesFunc func() (bool, string)
|
||||||
|
|
||||||
@ -62,6 +68,9 @@ type PropertyExtractorMock struct {
|
|||||||
// HasNvml holds details about calls to the HasNvml method.
|
// HasNvml holds details about calls to the HasNvml method.
|
||||||
HasNvml []struct {
|
HasNvml []struct {
|
||||||
}
|
}
|
||||||
|
// HasOnlyIntegratedGPUs holds details about calls to the HasOnlyIntegratedGPUs method.
|
||||||
|
HasOnlyIntegratedGPUs []struct {
|
||||||
|
}
|
||||||
// HasTegraFiles holds details about calls to the HasTegraFiles method.
|
// HasTegraFiles holds details about calls to the HasTegraFiles method.
|
||||||
HasTegraFiles []struct {
|
HasTegraFiles []struct {
|
||||||
}
|
}
|
||||||
@ -72,11 +81,12 @@ type PropertyExtractorMock struct {
|
|||||||
UsesOnlyNVGPUModule []struct {
|
UsesOnlyNVGPUModule []struct {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lockHasDXCore sync.RWMutex
|
lockHasDXCore sync.RWMutex
|
||||||
lockHasNvml sync.RWMutex
|
lockHasNvml sync.RWMutex
|
||||||
lockHasTegraFiles sync.RWMutex
|
lockHasOnlyIntegratedGPUs sync.RWMutex
|
||||||
lockIsTegraSystem sync.RWMutex
|
lockHasTegraFiles sync.RWMutex
|
||||||
lockUsesOnlyNVGPUModule sync.RWMutex
|
lockIsTegraSystem sync.RWMutex
|
||||||
|
lockUsesOnlyNVGPUModule sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
// HasDXCore calls HasDXCoreFunc.
|
// HasDXCore calls HasDXCoreFunc.
|
||||||
@ -133,6 +143,33 @@ func (mock *PropertyExtractorMock) HasNvmlCalls() []struct {
|
|||||||
return calls
|
return calls
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HasOnlyIntegratedGPUs calls HasOnlyIntegratedGPUsFunc.
|
||||||
|
func (mock *PropertyExtractorMock) HasOnlyIntegratedGPUs() (bool, string) {
|
||||||
|
if mock.HasOnlyIntegratedGPUsFunc == nil {
|
||||||
|
panic("PropertyExtractorMock.HasOnlyIntegratedGPUsFunc: method is nil but PropertyExtractor.HasOnlyIntegratedGPUs was just called")
|
||||||
|
}
|
||||||
|
callInfo := struct {
|
||||||
|
}{}
|
||||||
|
mock.lockHasOnlyIntegratedGPUs.Lock()
|
||||||
|
mock.calls.HasOnlyIntegratedGPUs = append(mock.calls.HasOnlyIntegratedGPUs, callInfo)
|
||||||
|
mock.lockHasOnlyIntegratedGPUs.Unlock()
|
||||||
|
return mock.HasOnlyIntegratedGPUsFunc()
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasOnlyIntegratedGPUsCalls gets all the calls that were made to HasOnlyIntegratedGPUs.
|
||||||
|
// Check the length with:
|
||||||
|
//
|
||||||
|
// len(mockedPropertyExtractor.HasOnlyIntegratedGPUsCalls())
|
||||||
|
func (mock *PropertyExtractorMock) HasOnlyIntegratedGPUsCalls() []struct {
|
||||||
|
} {
|
||||||
|
var calls []struct {
|
||||||
|
}
|
||||||
|
mock.lockHasOnlyIntegratedGPUs.RLock()
|
||||||
|
calls = mock.calls.HasOnlyIntegratedGPUs
|
||||||
|
mock.lockHasOnlyIntegratedGPUs.RUnlock()
|
||||||
|
return calls
|
||||||
|
}
|
||||||
|
|
||||||
// HasTegraFiles calls HasTegraFilesFunc.
|
// HasTegraFiles calls HasTegraFilesFunc.
|
||||||
func (mock *PropertyExtractorMock) HasTegraFiles() (bool, string) {
|
func (mock *PropertyExtractorMock) HasTegraFiles() (bool, string) {
|
||||||
if mock.HasTegraFilesFunc == nil {
|
if mock.HasTegraFilesFunc == nil {
|
||||||
|
6
vendor/github.com/NVIDIA/go-nvlib/pkg/nvlib/info/resolver.go
generated
vendored
6
vendor/github.com/NVIDIA/go-nvlib/pkg/nvlib/info/resolver.go
generated
vendored
@ -48,13 +48,13 @@ func (p platformResolver) ResolvePlatform() Platform {
|
|||||||
hasNVML, reason := p.propertyExtractor.HasNvml()
|
hasNVML, reason := p.propertyExtractor.HasNvml()
|
||||||
p.logger.Debugf("Is NVML-based system? %v: %v", hasNVML, reason)
|
p.logger.Debugf("Is NVML-based system? %v: %v", hasNVML, reason)
|
||||||
|
|
||||||
usesOnlyNVGPUModule, reason := p.propertyExtractor.UsesOnlyNVGPUModule()
|
hasOnlyIntegratedGPUs, reason := p.propertyExtractor.HasOnlyIntegratedGPUs()
|
||||||
p.logger.Debugf("Uses nvgpu kernel module? %v: %v", usesOnlyNVGPUModule, reason)
|
p.logger.Debugf("Has only integrated GPUs? %v: %v", hasOnlyIntegratedGPUs, reason)
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case hasDXCore:
|
case hasDXCore:
|
||||||
return PlatformWSL
|
return PlatformWSL
|
||||||
case (hasTegraFiles && !hasNVML), usesOnlyNVGPUModule:
|
case (hasTegraFiles && !hasNVML), hasOnlyIntegratedGPUs:
|
||||||
return PlatformTegra
|
return PlatformTegra
|
||||||
case hasNVML:
|
case hasNVML:
|
||||||
return PlatformNVML
|
return PlatformNVML
|
||||||
|
4
vendor/github.com/NVIDIA/go-nvlib/pkg/nvpci/mmio/mmio.go
generated
vendored
4
vendor/github.com/NVIDIA/go-nvlib/pkg/nvpci/mmio/mmio.go
generated
vendored
@ -107,7 +107,7 @@ func (m *mmio) BigEndian() Mmio {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *mmio) Close() error {
|
func (m *mmio) Close() error {
|
||||||
err := syscall.Munmap(*m.Bytes.Raw())
|
err := syscall.Munmap(*m.Raw())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to munmap file: %v", err)
|
return fmt.Errorf("failed to munmap file: %v", err)
|
||||||
}
|
}
|
||||||
@ -117,7 +117,7 @@ func (m *mmio) Close() error {
|
|||||||
func (m *mmio) Sync() error {
|
func (m *mmio) Sync() error {
|
||||||
_, _, errno := syscall.Syscall(
|
_, _, errno := syscall.Syscall(
|
||||||
syscall.SYS_MSYNC,
|
syscall.SYS_MSYNC,
|
||||||
uintptr(unsafe.Pointer(&(*m.Bytes.Raw())[0])),
|
uintptr(unsafe.Pointer(&(*m.Raw())[0])),
|
||||||
uintptr(m.Len()),
|
uintptr(m.Len()),
|
||||||
uintptr(syscall.MS_SYNC|syscall.MS_INVALIDATE))
|
uintptr(syscall.MS_SYNC|syscall.MS_INVALIDATE))
|
||||||
if errno != 0 {
|
if errno != 0 {
|
||||||
|
4
vendor/github.com/NVIDIA/go-nvlib/pkg/nvpci/mmio/mock.go
generated
vendored
4
vendor/github.com/NVIDIA/go-nvlib/pkg/nvpci/mmio/mock.go
generated
vendored
@ -70,8 +70,8 @@ func (m *mockMmio) Sync() error {
|
|||||||
if !m.rw {
|
if !m.rw {
|
||||||
return fmt.Errorf("opened read-only")
|
return fmt.Errorf("opened read-only")
|
||||||
}
|
}
|
||||||
for i := range *m.Bytes.Raw() {
|
for i := range *m.Raw() {
|
||||||
(*m.source)[m.offset+i] = (*m.Bytes.Raw())[i]
|
(*m.source)[m.offset+i] = (*m.Raw())[i]
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
10
vendor/github.com/NVIDIA/go-nvlib/pkg/nvpci/mock.go
generated
vendored
10
vendor/github.com/NVIDIA/go-nvlib/pkg/nvpci/mock.go
generated
vendored
@ -98,7 +98,7 @@ func (m *MockNvpci) AddMockA100(address string, numaNode int, sriov *SriovInfo)
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err = numa.WriteString(fmt.Sprintf("%v", numaNode))
|
_, err = fmt.Fprintf(numa, "%v", numaNode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -137,7 +137,7 @@ func createNVIDIAgpuFiles(deviceDir string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err = vendor.WriteString(fmt.Sprintf("0x%x", PCINvidiaVendorID))
|
_, err = fmt.Fprintf(vendor, "0x%x", PCINvidiaVendorID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -146,7 +146,7 @@ func createNVIDIAgpuFiles(deviceDir string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err = class.WriteString(fmt.Sprintf("0x%x", PCI3dControllerClass))
|
_, err = fmt.Fprintf(class, "0x%x", PCI3dControllerClass)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -188,7 +188,7 @@ func createNVIDIAgpuFiles(deviceDir string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err = resource.WriteString(fmt.Sprintf("0x%x 0x%x 0x%x", bar0[0], bar0[1], bar0[2]))
|
_, err = fmt.Fprintf(resource, "0x%x 0x%x 0x%x", bar0[0], bar0[1], bar0[2])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -246,7 +246,7 @@ func (m *MockNvpci) createVf(pfAddress string, id, iommu_group, numaNode int) er
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err = numa.WriteString(fmt.Sprintf("%v", numaNode))
|
_, err = fmt.Fprintf(numa, "%v", numaNode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
60
vendor/github.com/NVIDIA/go-nvlib/pkg/nvpci/nvpci.go
generated
vendored
60
vendor/github.com/NVIDIA/go-nvlib/pkg/nvpci/nvpci.go
generated
vendored
@ -280,27 +280,14 @@ func (p *nvpci) getGPUByPciBusID(address string, cache map[string]*NvidiaPCIDevi
|
|||||||
return nil, fmt.Errorf("unable to convert device string to uint16: %v", deviceStr)
|
return nil, fmt.Errorf("unable to convert device string to uint16: %v", deviceStr)
|
||||||
}
|
}
|
||||||
|
|
||||||
driver, err := filepath.EvalSymlinks(path.Join(devicePath, "driver"))
|
driver, err := getDriver(devicePath)
|
||||||
if err == nil {
|
if err != nil {
|
||||||
driver = filepath.Base(driver)
|
return nil, fmt.Errorf("unable to detect driver for %s: %w", address, err)
|
||||||
} else if os.IsNotExist(err) {
|
|
||||||
driver = ""
|
|
||||||
} else {
|
|
||||||
return nil, fmt.Errorf("unable to detect driver for %s: %v", address, err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var iommuGroup int64
|
iommuGroup, err := getIOMMUGroup(devicePath)
|
||||||
iommu, err := filepath.EvalSymlinks(path.Join(devicePath, "iommu_group"))
|
if err != nil {
|
||||||
if err == nil {
|
return nil, fmt.Errorf("unable to detect IOMMU group for %s: %w", address, err)
|
||||||
iommuGroupStr := strings.TrimSpace(filepath.Base(iommu))
|
|
||||||
iommuGroup, err = strconv.ParseInt(iommuGroupStr, 0, 64)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("unable to convert iommu_group string to int64: %v", iommuGroupStr)
|
|
||||||
}
|
|
||||||
} else if os.IsNotExist(err) {
|
|
||||||
iommuGroup = -1
|
|
||||||
} else {
|
|
||||||
return nil, fmt.Errorf("unable to detect iommu_group for %s: %v", address, err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
numa, err := os.ReadFile(path.Join(devicePath, "numa_node"))
|
numa, err := os.ReadFile(path.Join(devicePath, "numa_node"))
|
||||||
@ -359,7 +346,8 @@ func (p *nvpci) getGPUByPciBusID(address string, cache map[string]*NvidiaPCIDevi
|
|||||||
var sriovInfo SriovInfo
|
var sriovInfo SriovInfo
|
||||||
// Device is a virtual function (VF) if "physfn" symlink exists.
|
// Device is a virtual function (VF) if "physfn" symlink exists.
|
||||||
physFnAddress, err := filepath.EvalSymlinks(path.Join(devicePath, "physfn"))
|
physFnAddress, err := filepath.EvalSymlinks(path.Join(devicePath, "physfn"))
|
||||||
if err == nil {
|
switch {
|
||||||
|
case err == nil:
|
||||||
physFn, err := p.getGPUByPciBusID(filepath.Base(physFnAddress), cache)
|
physFn, err := p.getGPUByPciBusID(filepath.Base(physFnAddress), cache)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to detect physfn for %s: %v", address, err)
|
return nil, fmt.Errorf("unable to detect physfn for %s: %v", address, err)
|
||||||
@ -369,12 +357,12 @@ func (p *nvpci) getGPUByPciBusID(address string, cache map[string]*NvidiaPCIDevi
|
|||||||
PhysicalFunction: physFn,
|
PhysicalFunction: physFn,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
} else if os.IsNotExist(err) {
|
case os.IsNotExist(err):
|
||||||
sriovInfo, err = p.getSriovInfoForPhysicalFunction(devicePath)
|
sriovInfo, err = p.getSriovInfoForPhysicalFunction(devicePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to read SRIOV physical function details for %s: %v", devicePath, err)
|
return nil, fmt.Errorf("unable to read SRIOV physical function details for %s: %v", devicePath, err)
|
||||||
}
|
}
|
||||||
} else {
|
default:
|
||||||
return nil, fmt.Errorf("unable to read %s: %v", path.Join(devicePath, "physfn"), err)
|
return nil, fmt.Errorf("unable to read %s: %v", path.Join(devicePath, "physfn"), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -521,3 +509,31 @@ func (p *nvpci) getSriovInfoForPhysicalFunction(devicePath string) (sriovInfo Sr
|
|||||||
}
|
}
|
||||||
return sriovInfo, nil
|
return sriovInfo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getDriver(devicePath string) (string, error) {
|
||||||
|
driver, err := filepath.EvalSymlinks(path.Join(devicePath, "driver"))
|
||||||
|
switch {
|
||||||
|
case os.IsNotExist(err):
|
||||||
|
return "", nil
|
||||||
|
case err == nil:
|
||||||
|
return filepath.Base(driver), nil
|
||||||
|
}
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
func getIOMMUGroup(devicePath string) (int64, error) {
|
||||||
|
var iommuGroup int64
|
||||||
|
iommu, err := filepath.EvalSymlinks(path.Join(devicePath, "iommu_group"))
|
||||||
|
switch {
|
||||||
|
case os.IsNotExist(err):
|
||||||
|
return -1, nil
|
||||||
|
case err == nil:
|
||||||
|
iommuGroupStr := strings.TrimSpace(filepath.Base(iommu))
|
||||||
|
iommuGroup, err = strconv.ParseInt(iommuGroupStr, 0, 64)
|
||||||
|
if err != nil {
|
||||||
|
return 0, fmt.Errorf("unable to convert iommu_group string to int64: %v", iommuGroupStr)
|
||||||
|
}
|
||||||
|
return iommuGroup, nil
|
||||||
|
}
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
6
vendor/github.com/NVIDIA/go-nvlib/pkg/nvpci/resources.go
generated
vendored
6
vendor/github.com/NVIDIA/go-nvlib/pkg/nvpci/resources.go
generated
vendored
@ -112,7 +112,7 @@ func (mrs MemoryResources) GetTotalAddressableMemory(roundUp bool) (uint64, uint
|
|||||||
if key >= pciIOVNumBAR || numBAR == pciIOVNumBAR {
|
if key >= pciIOVNumBAR || numBAR == pciIOVNumBAR {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
numBAR = numBAR + 1
|
numBAR++
|
||||||
|
|
||||||
region := mrs[key]
|
region := mrs[key]
|
||||||
|
|
||||||
@ -123,10 +123,10 @@ func (mrs MemoryResources) GetTotalAddressableMemory(roundUp bool) (uint64, uint
|
|||||||
memSize := (region.End - region.Start) + 1
|
memSize := (region.End - region.Start) + 1
|
||||||
|
|
||||||
if memType32bit {
|
if memType32bit {
|
||||||
memSize32bit = memSize32bit + uint64(memSize)
|
memSize32bit += uint64(memSize)
|
||||||
}
|
}
|
||||||
if memType64bit {
|
if memType64bit {
|
||||||
memSize64bit = memSize64bit + uint64(memSize)
|
memSize64bit += uint64(memSize)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
1444
vendor/github.com/NVIDIA/go-nvlib/pkg/pciids/default_pci.ids
generated
vendored
1444
vendor/github.com/NVIDIA/go-nvlib/pkg/pciids/default_pci.ids
generated
vendored
File diff suppressed because it is too large
Load Diff
10
vendor/github.com/NVIDIA/go-nvlib/pkg/pciids/pciids.go
generated
vendored
10
vendor/github.com/NVIDIA/go-nvlib/pkg/pciids/pciids.go
generated
vendored
@ -396,7 +396,7 @@ func (p *parser) parse() Interface {
|
|||||||
hkClass = db.classes[uint32(id)]
|
hkClass = db.classes[uint32(id)]
|
||||||
|
|
||||||
hkFullID = uint32(id) << 16
|
hkFullID = uint32(id) << 16
|
||||||
hkFullID = hkFullID & 0xFFFF0000
|
hkFullID &= 0xFFFF0000
|
||||||
hkFullName[0] = fmt.Sprintf("%s (%02x)", lit.name, id)
|
hkFullName[0] = fmt.Sprintf("%s (%02x)", lit.name, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -408,11 +408,11 @@ func (p *parser) parse() Interface {
|
|||||||
}
|
}
|
||||||
hkSubClass = hkClass.subClasses[uint32(id)]
|
hkSubClass = hkClass.subClasses[uint32(id)]
|
||||||
|
|
||||||
// Clear the last detected sub class.
|
// Clear the last detected subclass.
|
||||||
hkFullID = hkFullID & 0xFFFF0000
|
hkFullID &= 0xFFFF0000
|
||||||
hkFullID = hkFullID | uint32(id)<<8
|
hkFullID |= uint32(id) << 8
|
||||||
// Clear the last detected prog iface.
|
// Clear the last detected prog iface.
|
||||||
hkFullID = hkFullID & 0xFFFFFF00
|
hkFullID &= 0xFFFFFF00
|
||||||
hkFullName[1] = fmt.Sprintf("%s (%02x)", lit.name, id)
|
hkFullName[1] = fmt.Sprintf("%s (%02x)", lit.name, id)
|
||||||
|
|
||||||
db.classes[uint32(hkFullID)] = class{
|
db.classes[uint32(hkFullID)] = class{
|
||||||
|
35
vendor/github.com/stretchr/testify/assert/assertion_compare.go
generated
vendored
35
vendor/github.com/stretchr/testify/assert/assertion_compare.go
generated
vendored
@ -7,10 +7,13 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type CompareType int
|
// Deprecated: CompareType has only ever been for internal use and has accidentally been published since v1.6.0. Do not use it.
|
||||||
|
type CompareType = compareResult
|
||||||
|
|
||||||
|
type compareResult int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
compareLess CompareType = iota - 1
|
compareLess compareResult = iota - 1
|
||||||
compareEqual
|
compareEqual
|
||||||
compareGreater
|
compareGreater
|
||||||
)
|
)
|
||||||
@ -39,7 +42,7 @@ var (
|
|||||||
bytesType = reflect.TypeOf([]byte{})
|
bytesType = reflect.TypeOf([]byte{})
|
||||||
)
|
)
|
||||||
|
|
||||||
func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {
|
func compare(obj1, obj2 interface{}, kind reflect.Kind) (compareResult, bool) {
|
||||||
obj1Value := reflect.ValueOf(obj1)
|
obj1Value := reflect.ValueOf(obj1)
|
||||||
obj2Value := reflect.ValueOf(obj2)
|
obj2Value := reflect.ValueOf(obj2)
|
||||||
|
|
||||||
@ -325,7 +328,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {
|
|||||||
timeObj2 = obj2Value.Convert(timeType).Interface().(time.Time)
|
timeObj2 = obj2Value.Convert(timeType).Interface().(time.Time)
|
||||||
}
|
}
|
||||||
|
|
||||||
return compare(timeObj1.UnixNano(), timeObj2.UnixNano(), reflect.Int64)
|
if timeObj1.Before(timeObj2) {
|
||||||
|
return compareLess, true
|
||||||
|
}
|
||||||
|
if timeObj1.Equal(timeObj2) {
|
||||||
|
return compareEqual, true
|
||||||
|
}
|
||||||
|
return compareGreater, true
|
||||||
}
|
}
|
||||||
case reflect.Slice:
|
case reflect.Slice:
|
||||||
{
|
{
|
||||||
@ -345,7 +354,7 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) {
|
|||||||
bytesObj2 = obj2Value.Convert(bytesType).Interface().([]byte)
|
bytesObj2 = obj2Value.Convert(bytesType).Interface().([]byte)
|
||||||
}
|
}
|
||||||
|
|
||||||
return CompareType(bytes.Compare(bytesObj1, bytesObj2)), true
|
return compareResult(bytes.Compare(bytesObj1, bytesObj2)), true
|
||||||
}
|
}
|
||||||
case reflect.Uintptr:
|
case reflect.Uintptr:
|
||||||
{
|
{
|
||||||
@ -381,7 +390,7 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface
|
|||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
}
|
}
|
||||||
return compareTwoValues(t, e1, e2, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
|
return compareTwoValues(t, e1, e2, []compareResult{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GreaterOrEqual asserts that the first element is greater than or equal to the second
|
// GreaterOrEqual asserts that the first element is greater than or equal to the second
|
||||||
@ -394,7 +403,7 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in
|
|||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
}
|
}
|
||||||
return compareTwoValues(t, e1, e2, []CompareType{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
|
return compareTwoValues(t, e1, e2, []compareResult{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Less asserts that the first element is less than the second
|
// Less asserts that the first element is less than the second
|
||||||
@ -406,7 +415,7 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{})
|
|||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
}
|
}
|
||||||
return compareTwoValues(t, e1, e2, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
|
return compareTwoValues(t, e1, e2, []compareResult{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// LessOrEqual asserts that the first element is less than or equal to the second
|
// LessOrEqual asserts that the first element is less than or equal to the second
|
||||||
@ -419,7 +428,7 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter
|
|||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
}
|
}
|
||||||
return compareTwoValues(t, e1, e2, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
|
return compareTwoValues(t, e1, e2, []compareResult{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Positive asserts that the specified element is positive
|
// Positive asserts that the specified element is positive
|
||||||
@ -431,7 +440,7 @@ func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {
|
|||||||
h.Helper()
|
h.Helper()
|
||||||
}
|
}
|
||||||
zero := reflect.Zero(reflect.TypeOf(e))
|
zero := reflect.Zero(reflect.TypeOf(e))
|
||||||
return compareTwoValues(t, e, zero.Interface(), []CompareType{compareGreater}, "\"%v\" is not positive", msgAndArgs...)
|
return compareTwoValues(t, e, zero.Interface(), []compareResult{compareGreater}, "\"%v\" is not positive", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Negative asserts that the specified element is negative
|
// Negative asserts that the specified element is negative
|
||||||
@ -443,10 +452,10 @@ func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) bool {
|
|||||||
h.Helper()
|
h.Helper()
|
||||||
}
|
}
|
||||||
zero := reflect.Zero(reflect.TypeOf(e))
|
zero := reflect.Zero(reflect.TypeOf(e))
|
||||||
return compareTwoValues(t, e, zero.Interface(), []CompareType{compareLess}, "\"%v\" is not negative", msgAndArgs...)
|
return compareTwoValues(t, e, zero.Interface(), []compareResult{compareLess}, "\"%v\" is not negative", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool {
|
func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []compareResult, failMessage string, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
}
|
}
|
||||||
@ -469,7 +478,7 @@ func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedCompare
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func containsValue(values []CompareType, value CompareType) bool {
|
func containsValue(values []compareResult, value compareResult) bool {
|
||||||
for _, v := range values {
|
for _, v := range values {
|
||||||
if v == value {
|
if v == value {
|
||||||
return true
|
return true
|
||||||
|
34
vendor/github.com/stretchr/testify/assert/assertion_format.go
generated
vendored
34
vendor/github.com/stretchr/testify/assert/assertion_format.go
generated
vendored
@ -104,8 +104,8 @@ func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{},
|
|||||||
return EqualExportedValues(t, expected, actual, append([]interface{}{msg}, args...)...)
|
return EqualExportedValues(t, expected, actual, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// EqualValuesf asserts that two objects are equal or convertible to the same types
|
// EqualValuesf asserts that two objects are equal or convertible to the larger
|
||||||
// and equal.
|
// type and equal.
|
||||||
//
|
//
|
||||||
// assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted")
|
// assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted")
|
||||||
func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
||||||
@ -186,7 +186,7 @@ func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick
|
|||||||
// assert.EventuallyWithTf(t, func(c *assert.CollectT, "error message %s", "formatted") {
|
// assert.EventuallyWithTf(t, func(c *assert.CollectT, "error message %s", "formatted") {
|
||||||
// // add assertions as needed; any assertion failure will fail the current tick
|
// // add assertions as needed; any assertion failure will fail the current tick
|
||||||
// assert.True(c, externalValue, "expected 'externalValue' to be true")
|
// assert.True(c, externalValue, "expected 'externalValue' to be true")
|
||||||
// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
|
// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
|
||||||
func EventuallyWithTf(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {
|
func EventuallyWithTf(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@ -568,6 +568,23 @@ func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, a
|
|||||||
return NotContains(t, s, contains, append([]interface{}{msg}, args...)...)
|
return NotContains(t, s, contains, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified
|
||||||
|
// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
|
||||||
|
// the number of appearances of each of them in both lists should not match.
|
||||||
|
// This is an inverse of ElementsMatch.
|
||||||
|
//
|
||||||
|
// assert.NotElementsMatchf(t, [1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false
|
||||||
|
//
|
||||||
|
// assert.NotElementsMatchf(t, [1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true
|
||||||
|
//
|
||||||
|
// assert.NotElementsMatchf(t, [1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true
|
||||||
|
func NotElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
return NotElementsMatch(t, listA, listB, append([]interface{}{msg}, args...)...)
|
||||||
|
}
|
||||||
|
|
||||||
// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either
|
// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either
|
||||||
// a slice or a channel with len == 0.
|
// a slice or a channel with len == 0.
|
||||||
//
|
//
|
||||||
@ -604,7 +621,16 @@ func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg s
|
|||||||
return NotEqualValues(t, expected, actual, append([]interface{}{msg}, args...)...)
|
return NotEqualValues(t, expected, actual, append([]interface{}{msg}, args...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NotErrorIsf asserts that at none of the errors in err's chain matches target.
|
// NotErrorAsf asserts that none of the errors in err's chain matches target,
|
||||||
|
// but if so, sets target to that error value.
|
||||||
|
func NotErrorAsf(t TestingT, err error, target interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
return NotErrorAs(t, err, target, append([]interface{}{msg}, args...)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NotErrorIsf asserts that none of the errors in err's chain matches target.
|
||||||
// This is a wrapper for errors.Is.
|
// This is a wrapper for errors.Is.
|
||||||
func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) bool {
|
func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
|
68
vendor/github.com/stretchr/testify/assert/assertion_forward.go
generated
vendored
68
vendor/github.com/stretchr/testify/assert/assertion_forward.go
generated
vendored
@ -186,8 +186,8 @@ func (a *Assertions) EqualExportedValuesf(expected interface{}, actual interface
|
|||||||
return EqualExportedValuesf(a.t, expected, actual, msg, args...)
|
return EqualExportedValuesf(a.t, expected, actual, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// EqualValues asserts that two objects are equal or convertible to the same types
|
// EqualValues asserts that two objects are equal or convertible to the larger
|
||||||
// and equal.
|
// type and equal.
|
||||||
//
|
//
|
||||||
// a.EqualValues(uint32(123), int32(123))
|
// a.EqualValues(uint32(123), int32(123))
|
||||||
func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
@ -197,8 +197,8 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn
|
|||||||
return EqualValues(a.t, expected, actual, msgAndArgs...)
|
return EqualValues(a.t, expected, actual, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// EqualValuesf asserts that two objects are equal or convertible to the same types
|
// EqualValuesf asserts that two objects are equal or convertible to the larger
|
||||||
// and equal.
|
// type and equal.
|
||||||
//
|
//
|
||||||
// a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted")
|
// a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted")
|
||||||
func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {
|
||||||
@ -336,7 +336,7 @@ func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, ti
|
|||||||
// a.EventuallyWithT(func(c *assert.CollectT) {
|
// a.EventuallyWithT(func(c *assert.CollectT) {
|
||||||
// // add assertions as needed; any assertion failure will fail the current tick
|
// // add assertions as needed; any assertion failure will fail the current tick
|
||||||
// assert.True(c, externalValue, "expected 'externalValue' to be true")
|
// assert.True(c, externalValue, "expected 'externalValue' to be true")
|
||||||
// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
|
// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
|
||||||
func (a *Assertions) EventuallyWithT(condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) EventuallyWithT(condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := a.t.(tHelper); ok {
|
if h, ok := a.t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@ -361,7 +361,7 @@ func (a *Assertions) EventuallyWithT(condition func(collect *CollectT), waitFor
|
|||||||
// a.EventuallyWithTf(func(c *assert.CollectT, "error message %s", "formatted") {
|
// a.EventuallyWithTf(func(c *assert.CollectT, "error message %s", "formatted") {
|
||||||
// // add assertions as needed; any assertion failure will fail the current tick
|
// // add assertions as needed; any assertion failure will fail the current tick
|
||||||
// assert.True(c, externalValue, "expected 'externalValue' to be true")
|
// assert.True(c, externalValue, "expected 'externalValue' to be true")
|
||||||
// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
|
// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
|
||||||
func (a *Assertions) EventuallyWithTf(condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {
|
func (a *Assertions) EventuallyWithTf(condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool {
|
||||||
if h, ok := a.t.(tHelper); ok {
|
if h, ok := a.t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@ -1128,6 +1128,40 @@ func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg strin
|
|||||||
return NotContainsf(a.t, s, contains, msg, args...)
|
return NotContainsf(a.t, s, contains, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified
|
||||||
|
// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
|
||||||
|
// the number of appearances of each of them in both lists should not match.
|
||||||
|
// This is an inverse of ElementsMatch.
|
||||||
|
//
|
||||||
|
// a.NotElementsMatch([1, 1, 2, 3], [1, 1, 2, 3]) -> false
|
||||||
|
//
|
||||||
|
// a.NotElementsMatch([1, 1, 2, 3], [1, 2, 3]) -> true
|
||||||
|
//
|
||||||
|
// a.NotElementsMatch([1, 2, 3], [1, 2, 4]) -> true
|
||||||
|
func (a *Assertions) NotElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
return NotElementsMatch(a.t, listA, listB, msgAndArgs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified
|
||||||
|
// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
|
||||||
|
// the number of appearances of each of them in both lists should not match.
|
||||||
|
// This is an inverse of ElementsMatch.
|
||||||
|
//
|
||||||
|
// a.NotElementsMatchf([1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false
|
||||||
|
//
|
||||||
|
// a.NotElementsMatchf([1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true
|
||||||
|
//
|
||||||
|
// a.NotElementsMatchf([1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true
|
||||||
|
func (a *Assertions) NotElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
return NotElementsMatchf(a.t, listA, listB, msg, args...)
|
||||||
|
}
|
||||||
|
|
||||||
// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either
|
// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either
|
||||||
// a slice or a channel with len == 0.
|
// a slice or a channel with len == 0.
|
||||||
//
|
//
|
||||||
@ -1200,7 +1234,25 @@ func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg str
|
|||||||
return NotEqualf(a.t, expected, actual, msg, args...)
|
return NotEqualf(a.t, expected, actual, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NotErrorIs asserts that at none of the errors in err's chain matches target.
|
// NotErrorAs asserts that none of the errors in err's chain matches target,
|
||||||
|
// but if so, sets target to that error value.
|
||||||
|
func (a *Assertions) NotErrorAs(err error, target interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
return NotErrorAs(a.t, err, target, msgAndArgs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NotErrorAsf asserts that none of the errors in err's chain matches target,
|
||||||
|
// but if so, sets target to that error value.
|
||||||
|
func (a *Assertions) NotErrorAsf(err error, target interface{}, msg string, args ...interface{}) bool {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
return NotErrorAsf(a.t, err, target, msg, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NotErrorIs asserts that none of the errors in err's chain matches target.
|
||||||
// This is a wrapper for errors.Is.
|
// This is a wrapper for errors.Is.
|
||||||
func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface{}) bool {
|
func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := a.t.(tHelper); ok {
|
if h, ok := a.t.(tHelper); ok {
|
||||||
@ -1209,7 +1261,7 @@ func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface
|
|||||||
return NotErrorIs(a.t, err, target, msgAndArgs...)
|
return NotErrorIs(a.t, err, target, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NotErrorIsf asserts that at none of the errors in err's chain matches target.
|
// NotErrorIsf asserts that none of the errors in err's chain matches target.
|
||||||
// This is a wrapper for errors.Is.
|
// This is a wrapper for errors.Is.
|
||||||
func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...interface{}) bool {
|
func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...interface{}) bool {
|
||||||
if h, ok := a.t.(tHelper); ok {
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
10
vendor/github.com/stretchr/testify/assert/assertion_order.go
generated
vendored
10
vendor/github.com/stretchr/testify/assert/assertion_order.go
generated
vendored
@ -6,7 +6,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// isOrdered checks that collection contains orderable elements.
|
// isOrdered checks that collection contains orderable elements.
|
||||||
func isOrdered(t TestingT, object interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool {
|
func isOrdered(t TestingT, object interface{}, allowedComparesResults []compareResult, failMessage string, msgAndArgs ...interface{}) bool {
|
||||||
objKind := reflect.TypeOf(object).Kind()
|
objKind := reflect.TypeOf(object).Kind()
|
||||||
if objKind != reflect.Slice && objKind != reflect.Array {
|
if objKind != reflect.Slice && objKind != reflect.Array {
|
||||||
return false
|
return false
|
||||||
@ -50,7 +50,7 @@ func isOrdered(t TestingT, object interface{}, allowedComparesResults []CompareT
|
|||||||
// assert.IsIncreasing(t, []float{1, 2})
|
// assert.IsIncreasing(t, []float{1, 2})
|
||||||
// assert.IsIncreasing(t, []string{"a", "b"})
|
// assert.IsIncreasing(t, []string{"a", "b"})
|
||||||
func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return isOrdered(t, object, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
|
return isOrdered(t, object, []compareResult{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsNonIncreasing asserts that the collection is not increasing
|
// IsNonIncreasing asserts that the collection is not increasing
|
||||||
@ -59,7 +59,7 @@ func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) boo
|
|||||||
// assert.IsNonIncreasing(t, []float{2, 1})
|
// assert.IsNonIncreasing(t, []float{2, 1})
|
||||||
// assert.IsNonIncreasing(t, []string{"b", "a"})
|
// assert.IsNonIncreasing(t, []string{"b", "a"})
|
||||||
func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return isOrdered(t, object, []CompareType{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
|
return isOrdered(t, object, []compareResult{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsDecreasing asserts that the collection is decreasing
|
// IsDecreasing asserts that the collection is decreasing
|
||||||
@ -68,7 +68,7 @@ func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{})
|
|||||||
// assert.IsDecreasing(t, []float{2, 1})
|
// assert.IsDecreasing(t, []float{2, 1})
|
||||||
// assert.IsDecreasing(t, []string{"b", "a"})
|
// assert.IsDecreasing(t, []string{"b", "a"})
|
||||||
func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return isOrdered(t, object, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
|
return isOrdered(t, object, []compareResult{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsNonDecreasing asserts that the collection is not decreasing
|
// IsNonDecreasing asserts that the collection is not decreasing
|
||||||
@ -77,5 +77,5 @@ func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) boo
|
|||||||
// assert.IsNonDecreasing(t, []float{1, 2})
|
// assert.IsNonDecreasing(t, []float{1, 2})
|
||||||
// assert.IsNonDecreasing(t, []string{"a", "b"})
|
// assert.IsNonDecreasing(t, []string{"a", "b"})
|
||||||
func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {
|
||||||
return isOrdered(t, object, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
|
return isOrdered(t, object, []compareResult{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
157
vendor/github.com/stretchr/testify/assert/assertions.go
generated
vendored
157
vendor/github.com/stretchr/testify/assert/assertions.go
generated
vendored
@ -19,7 +19,9 @@ import (
|
|||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
"github.com/davecgh/go-spew/spew"
|
||||||
"github.com/pmezard/go-difflib/difflib"
|
"github.com/pmezard/go-difflib/difflib"
|
||||||
"gopkg.in/yaml.v3"
|
|
||||||
|
// Wrapper around gopkg.in/yaml.v3
|
||||||
|
"github.com/stretchr/testify/assert/yaml"
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_format.go.tmpl"
|
//go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_format.go.tmpl"
|
||||||
@ -45,6 +47,10 @@ type BoolAssertionFunc func(TestingT, bool, ...interface{}) bool
|
|||||||
// for table driven tests.
|
// for table driven tests.
|
||||||
type ErrorAssertionFunc func(TestingT, error, ...interface{}) bool
|
type ErrorAssertionFunc func(TestingT, error, ...interface{}) bool
|
||||||
|
|
||||||
|
// PanicAssertionFunc is a common function prototype when validating a panic value. Can be useful
|
||||||
|
// for table driven tests.
|
||||||
|
type PanicAssertionFunc = func(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool
|
||||||
|
|
||||||
// Comparison is a custom function that returns true on success and false on failure
|
// Comparison is a custom function that returns true on success and false on failure
|
||||||
type Comparison func() (success bool)
|
type Comparison func() (success bool)
|
||||||
|
|
||||||
@ -496,7 +502,13 @@ func Same(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) b
|
|||||||
h.Helper()
|
h.Helper()
|
||||||
}
|
}
|
||||||
|
|
||||||
if !samePointers(expected, actual) {
|
same, ok := samePointers(expected, actual)
|
||||||
|
if !ok {
|
||||||
|
return Fail(t, "Both arguments must be pointers", msgAndArgs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !same {
|
||||||
|
// both are pointers but not the same type & pointing to the same address
|
||||||
return Fail(t, fmt.Sprintf("Not same: \n"+
|
return Fail(t, fmt.Sprintf("Not same: \n"+
|
||||||
"expected: %p %#v\n"+
|
"expected: %p %#v\n"+
|
||||||
"actual : %p %#v", expected, expected, actual, actual), msgAndArgs...)
|
"actual : %p %#v", expected, expected, actual, actual), msgAndArgs...)
|
||||||
@ -516,7 +528,13 @@ func NotSame(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}
|
|||||||
h.Helper()
|
h.Helper()
|
||||||
}
|
}
|
||||||
|
|
||||||
if samePointers(expected, actual) {
|
same, ok := samePointers(expected, actual)
|
||||||
|
if !ok {
|
||||||
|
//fails when the arguments are not pointers
|
||||||
|
return !(Fail(t, "Both arguments must be pointers", msgAndArgs...))
|
||||||
|
}
|
||||||
|
|
||||||
|
if same {
|
||||||
return Fail(t, fmt.Sprintf(
|
return Fail(t, fmt.Sprintf(
|
||||||
"Expected and actual point to the same object: %p %#v",
|
"Expected and actual point to the same object: %p %#v",
|
||||||
expected, expected), msgAndArgs...)
|
expected, expected), msgAndArgs...)
|
||||||
@ -524,21 +542,23 @@ func NotSame(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// samePointers compares two generic interface objects and returns whether
|
// samePointers checks if two generic interface objects are pointers of the same
|
||||||
// they point to the same object
|
// type pointing to the same object. It returns two values: same indicating if
|
||||||
func samePointers(first, second interface{}) bool {
|
// they are the same type and point to the same object, and ok indicating that
|
||||||
|
// both inputs are pointers.
|
||||||
|
func samePointers(first, second interface{}) (same bool, ok bool) {
|
||||||
firstPtr, secondPtr := reflect.ValueOf(first), reflect.ValueOf(second)
|
firstPtr, secondPtr := reflect.ValueOf(first), reflect.ValueOf(second)
|
||||||
if firstPtr.Kind() != reflect.Ptr || secondPtr.Kind() != reflect.Ptr {
|
if firstPtr.Kind() != reflect.Ptr || secondPtr.Kind() != reflect.Ptr {
|
||||||
return false
|
return false, false //not both are pointers
|
||||||
}
|
}
|
||||||
|
|
||||||
firstType, secondType := reflect.TypeOf(first), reflect.TypeOf(second)
|
firstType, secondType := reflect.TypeOf(first), reflect.TypeOf(second)
|
||||||
if firstType != secondType {
|
if firstType != secondType {
|
||||||
return false
|
return false, true // both are pointers, but of different types
|
||||||
}
|
}
|
||||||
|
|
||||||
// compare pointer addresses
|
// compare pointer addresses
|
||||||
return first == second
|
return first == second, true
|
||||||
}
|
}
|
||||||
|
|
||||||
// formatUnequalValues takes two values of arbitrary types and returns string
|
// formatUnequalValues takes two values of arbitrary types and returns string
|
||||||
@ -572,8 +592,8 @@ func truncatingFormat(data interface{}) string {
|
|||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
// EqualValues asserts that two objects are equal or convertible to the same types
|
// EqualValues asserts that two objects are equal or convertible to the larger
|
||||||
// and equal.
|
// type and equal.
|
||||||
//
|
//
|
||||||
// assert.EqualValues(t, uint32(123), int32(123))
|
// assert.EqualValues(t, uint32(123), int32(123))
|
||||||
func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
|
||||||
@ -615,21 +635,6 @@ func EqualExportedValues(t TestingT, expected, actual interface{}, msgAndArgs ..
|
|||||||
return Fail(t, fmt.Sprintf("Types expected to match exactly\n\t%v != %v", aType, bType), msgAndArgs...)
|
return Fail(t, fmt.Sprintf("Types expected to match exactly\n\t%v != %v", aType, bType), msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
if aType.Kind() == reflect.Ptr {
|
|
||||||
aType = aType.Elem()
|
|
||||||
}
|
|
||||||
if bType.Kind() == reflect.Ptr {
|
|
||||||
bType = bType.Elem()
|
|
||||||
}
|
|
||||||
|
|
||||||
if aType.Kind() != reflect.Struct {
|
|
||||||
return Fail(t, fmt.Sprintf("Types expected to both be struct or pointer to struct \n\t%v != %v", aType.Kind(), reflect.Struct), msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
if bType.Kind() != reflect.Struct {
|
|
||||||
return Fail(t, fmt.Sprintf("Types expected to both be struct or pointer to struct \n\t%v != %v", bType.Kind(), reflect.Struct), msgAndArgs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
expected = copyExportedFields(expected)
|
expected = copyExportedFields(expected)
|
||||||
actual = copyExportedFields(actual)
|
actual = copyExportedFields(actual)
|
||||||
|
|
||||||
@ -1170,6 +1175,39 @@ func formatListDiff(listA, listB interface{}, extraA, extraB []interface{}) stri
|
|||||||
return msg.String()
|
return msg.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified
|
||||||
|
// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
|
||||||
|
// the number of appearances of each of them in both lists should not match.
|
||||||
|
// This is an inverse of ElementsMatch.
|
||||||
|
//
|
||||||
|
// assert.NotElementsMatch(t, [1, 1, 2, 3], [1, 1, 2, 3]) -> false
|
||||||
|
//
|
||||||
|
// assert.NotElementsMatch(t, [1, 1, 2, 3], [1, 2, 3]) -> true
|
||||||
|
//
|
||||||
|
// assert.NotElementsMatch(t, [1, 2, 3], [1, 2, 4]) -> true
|
||||||
|
func NotElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface{}) (ok bool) {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
if isEmpty(listA) && isEmpty(listB) {
|
||||||
|
return Fail(t, "listA and listB contain the same elements", msgAndArgs)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !isList(t, listA, msgAndArgs...) {
|
||||||
|
return Fail(t, "listA is not a list type", msgAndArgs...)
|
||||||
|
}
|
||||||
|
if !isList(t, listB, msgAndArgs...) {
|
||||||
|
return Fail(t, "listB is not a list type", msgAndArgs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
extraA, extraB := diffLists(listA, listB)
|
||||||
|
if len(extraA) == 0 && len(extraB) == 0 {
|
||||||
|
return Fail(t, "listA and listB contain the same elements", msgAndArgs)
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
// Condition uses a Comparison to assert a complex condition.
|
// Condition uses a Comparison to assert a complex condition.
|
||||||
func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool {
|
func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
@ -1488,6 +1526,9 @@ func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAnd
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return Fail(t, err.Error(), msgAndArgs...)
|
return Fail(t, err.Error(), msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
if math.IsNaN(actualEpsilon) {
|
||||||
|
return Fail(t, "relative error is NaN", msgAndArgs...)
|
||||||
|
}
|
||||||
if actualEpsilon > epsilon {
|
if actualEpsilon > epsilon {
|
||||||
return Fail(t, fmt.Sprintf("Relative error is too high: %#v (expected)\n"+
|
return Fail(t, fmt.Sprintf("Relative error is too high: %#v (expected)\n"+
|
||||||
" < %#v (actual)", epsilon, actualEpsilon), msgAndArgs...)
|
" < %#v (actual)", epsilon, actualEpsilon), msgAndArgs...)
|
||||||
@ -1611,7 +1652,6 @@ func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...in
|
|||||||
|
|
||||||
// matchRegexp return true if a specified regexp matches a string.
|
// matchRegexp return true if a specified regexp matches a string.
|
||||||
func matchRegexp(rx interface{}, str interface{}) bool {
|
func matchRegexp(rx interface{}, str interface{}) bool {
|
||||||
|
|
||||||
var r *regexp.Regexp
|
var r *regexp.Regexp
|
||||||
if rr, ok := rx.(*regexp.Regexp); ok {
|
if rr, ok := rx.(*regexp.Regexp); ok {
|
||||||
r = rr
|
r = rr
|
||||||
@ -1619,7 +1659,14 @@ func matchRegexp(rx interface{}, str interface{}) bool {
|
|||||||
r = regexp.MustCompile(fmt.Sprint(rx))
|
r = regexp.MustCompile(fmt.Sprint(rx))
|
||||||
}
|
}
|
||||||
|
|
||||||
return (r.FindStringIndex(fmt.Sprint(str)) != nil)
|
switch v := str.(type) {
|
||||||
|
case []byte:
|
||||||
|
return r.Match(v)
|
||||||
|
case string:
|
||||||
|
return r.MatchString(v)
|
||||||
|
default:
|
||||||
|
return r.MatchString(fmt.Sprint(v))
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1872,7 +1919,7 @@ var spewConfigStringerEnabled = spew.ConfigState{
|
|||||||
MaxDepth: 10,
|
MaxDepth: 10,
|
||||||
}
|
}
|
||||||
|
|
||||||
type tHelper interface {
|
type tHelper = interface {
|
||||||
Helper()
|
Helper()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1911,6 +1958,9 @@ func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick t
|
|||||||
|
|
||||||
// CollectT implements the TestingT interface and collects all errors.
|
// CollectT implements the TestingT interface and collects all errors.
|
||||||
type CollectT struct {
|
type CollectT struct {
|
||||||
|
// A slice of errors. Non-nil slice denotes a failure.
|
||||||
|
// If it's non-nil but len(c.errors) == 0, this is also a failure
|
||||||
|
// obtained by direct c.FailNow() call.
|
||||||
errors []error
|
errors []error
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1919,9 +1969,10 @@ func (c *CollectT) Errorf(format string, args ...interface{}) {
|
|||||||
c.errors = append(c.errors, fmt.Errorf(format, args...))
|
c.errors = append(c.errors, fmt.Errorf(format, args...))
|
||||||
}
|
}
|
||||||
|
|
||||||
// FailNow panics.
|
// FailNow stops execution by calling runtime.Goexit.
|
||||||
func (*CollectT) FailNow() {
|
func (c *CollectT) FailNow() {
|
||||||
panic("Assertion failed")
|
c.fail()
|
||||||
|
runtime.Goexit()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deprecated: That was a method for internal usage that should not have been published. Now just panics.
|
// Deprecated: That was a method for internal usage that should not have been published. Now just panics.
|
||||||
@ -1934,6 +1985,16 @@ func (*CollectT) Copy(TestingT) {
|
|||||||
panic("Copy() is deprecated")
|
panic("Copy() is deprecated")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *CollectT) fail() {
|
||||||
|
if !c.failed() {
|
||||||
|
c.errors = []error{} // Make it non-nil to mark a failure.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CollectT) failed() bool {
|
||||||
|
return c.errors != nil
|
||||||
|
}
|
||||||
|
|
||||||
// EventuallyWithT asserts that given condition will be met in waitFor time,
|
// EventuallyWithT asserts that given condition will be met in waitFor time,
|
||||||
// periodically checking target function each tick. In contrast to Eventually,
|
// periodically checking target function each tick. In contrast to Eventually,
|
||||||
// it supplies a CollectT to the condition function, so that the condition
|
// it supplies a CollectT to the condition function, so that the condition
|
||||||
@ -1951,14 +2012,14 @@ func (*CollectT) Copy(TestingT) {
|
|||||||
// assert.EventuallyWithT(t, func(c *assert.CollectT) {
|
// assert.EventuallyWithT(t, func(c *assert.CollectT) {
|
||||||
// // add assertions as needed; any assertion failure will fail the current tick
|
// // add assertions as needed; any assertion failure will fail the current tick
|
||||||
// assert.True(c, externalValue, "expected 'externalValue' to be true")
|
// assert.True(c, externalValue, "expected 'externalValue' to be true")
|
||||||
// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
|
// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
|
||||||
func EventuallyWithT(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {
|
func EventuallyWithT(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
}
|
}
|
||||||
|
|
||||||
var lastFinishedTickErrs []error
|
var lastFinishedTickErrs []error
|
||||||
ch := make(chan []error, 1)
|
ch := make(chan *CollectT, 1)
|
||||||
|
|
||||||
timer := time.NewTimer(waitFor)
|
timer := time.NewTimer(waitFor)
|
||||||
defer timer.Stop()
|
defer timer.Stop()
|
||||||
@ -1978,16 +2039,16 @@ func EventuallyWithT(t TestingT, condition func(collect *CollectT), waitFor time
|
|||||||
go func() {
|
go func() {
|
||||||
collect := new(CollectT)
|
collect := new(CollectT)
|
||||||
defer func() {
|
defer func() {
|
||||||
ch <- collect.errors
|
ch <- collect
|
||||||
}()
|
}()
|
||||||
condition(collect)
|
condition(collect)
|
||||||
}()
|
}()
|
||||||
case errs := <-ch:
|
case collect := <-ch:
|
||||||
if len(errs) == 0 {
|
if !collect.failed() {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// Keep the errors from the last ended condition, so that they can be copied to t if timeout is reached.
|
// Keep the errors from the last ended condition, so that they can be copied to t if timeout is reached.
|
||||||
lastFinishedTickErrs = errs
|
lastFinishedTickErrs = collect.errors
|
||||||
tick = ticker.C
|
tick = ticker.C
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2049,7 +2110,7 @@ func ErrorIs(t TestingT, err, target error, msgAndArgs ...interface{}) bool {
|
|||||||
), msgAndArgs...)
|
), msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NotErrorIs asserts that at none of the errors in err's chain matches target.
|
// NotErrorIs asserts that none of the errors in err's chain matches target.
|
||||||
// This is a wrapper for errors.Is.
|
// This is a wrapper for errors.Is.
|
||||||
func NotErrorIs(t TestingT, err, target error, msgAndArgs ...interface{}) bool {
|
func NotErrorIs(t TestingT, err, target error, msgAndArgs ...interface{}) bool {
|
||||||
if h, ok := t.(tHelper); ok {
|
if h, ok := t.(tHelper); ok {
|
||||||
@ -2090,6 +2151,24 @@ func ErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{
|
|||||||
), msgAndArgs...)
|
), msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NotErrorAs asserts that none of the errors in err's chain matches target,
|
||||||
|
// but if so, sets target to that error value.
|
||||||
|
func NotErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{}) bool {
|
||||||
|
if h, ok := t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
if !errors.As(err, target) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
chain := buildErrorChainString(err)
|
||||||
|
|
||||||
|
return Fail(t, fmt.Sprintf("Target error should not be in err chain:\n"+
|
||||||
|
"found: %q\n"+
|
||||||
|
"in chain: %s", target, chain,
|
||||||
|
), msgAndArgs...)
|
||||||
|
}
|
||||||
|
|
||||||
func buildErrorChainString(err error) string {
|
func buildErrorChainString(err error) string {
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return ""
|
return ""
|
||||||
|
25
vendor/github.com/stretchr/testify/assert/yaml/yaml_custom.go
generated
vendored
Normal file
25
vendor/github.com/stretchr/testify/assert/yaml/yaml_custom.go
generated
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
//go:build testify_yaml_custom && !testify_yaml_fail && !testify_yaml_default
|
||||||
|
// +build testify_yaml_custom,!testify_yaml_fail,!testify_yaml_default
|
||||||
|
|
||||||
|
// Package yaml is an implementation of YAML functions that calls a pluggable implementation.
|
||||||
|
//
|
||||||
|
// This implementation is selected with the testify_yaml_custom build tag.
|
||||||
|
//
|
||||||
|
// go test -tags testify_yaml_custom
|
||||||
|
//
|
||||||
|
// This implementation can be used at build time to replace the default implementation
|
||||||
|
// to avoid linking with [gopkg.in/yaml.v3].
|
||||||
|
//
|
||||||
|
// In your test package:
|
||||||
|
//
|
||||||
|
// import assertYaml "github.com/stretchr/testify/assert/yaml"
|
||||||
|
//
|
||||||
|
// func init() {
|
||||||
|
// assertYaml.Unmarshal = func (in []byte, out interface{}) error {
|
||||||
|
// // ...
|
||||||
|
// return nil
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
package yaml
|
||||||
|
|
||||||
|
var Unmarshal func(in []byte, out interface{}) error
|
37
vendor/github.com/stretchr/testify/assert/yaml/yaml_default.go
generated
vendored
Normal file
37
vendor/github.com/stretchr/testify/assert/yaml/yaml_default.go
generated
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
//go:build !testify_yaml_fail && !testify_yaml_custom
|
||||||
|
// +build !testify_yaml_fail,!testify_yaml_custom
|
||||||
|
|
||||||
|
// Package yaml is just an indirection to handle YAML deserialization.
|
||||||
|
//
|
||||||
|
// This package is just an indirection that allows the builder to override the
|
||||||
|
// indirection with an alternative implementation of this package that uses
|
||||||
|
// another implementation of YAML deserialization. This allows to not either not
|
||||||
|
// use YAML deserialization at all, or to use another implementation than
|
||||||
|
// [gopkg.in/yaml.v3] (for example for license compatibility reasons, see [PR #1120]).
|
||||||
|
//
|
||||||
|
// Alternative implementations are selected using build tags:
|
||||||
|
//
|
||||||
|
// - testify_yaml_fail: [Unmarshal] always fails with an error
|
||||||
|
// - testify_yaml_custom: [Unmarshal] is a variable. Caller must initialize it
|
||||||
|
// before calling any of [github.com/stretchr/testify/assert.YAMLEq] or
|
||||||
|
// [github.com/stretchr/testify/assert.YAMLEqf].
|
||||||
|
//
|
||||||
|
// Usage:
|
||||||
|
//
|
||||||
|
// go test -tags testify_yaml_fail
|
||||||
|
//
|
||||||
|
// You can check with "go list" which implementation is linked:
|
||||||
|
//
|
||||||
|
// go list -f '{{.Imports}}' github.com/stretchr/testify/assert/yaml
|
||||||
|
// go list -tags testify_yaml_fail -f '{{.Imports}}' github.com/stretchr/testify/assert/yaml
|
||||||
|
// go list -tags testify_yaml_custom -f '{{.Imports}}' github.com/stretchr/testify/assert/yaml
|
||||||
|
//
|
||||||
|
// [PR #1120]: https://github.com/stretchr/testify/pull/1120
|
||||||
|
package yaml
|
||||||
|
|
||||||
|
import goyaml "gopkg.in/yaml.v3"
|
||||||
|
|
||||||
|
// Unmarshal is just a wrapper of [gopkg.in/yaml.v3.Unmarshal].
|
||||||
|
func Unmarshal(in []byte, out interface{}) error {
|
||||||
|
return goyaml.Unmarshal(in, out)
|
||||||
|
}
|
18
vendor/github.com/stretchr/testify/assert/yaml/yaml_fail.go
generated
vendored
Normal file
18
vendor/github.com/stretchr/testify/assert/yaml/yaml_fail.go
generated
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
//go:build testify_yaml_fail && !testify_yaml_custom && !testify_yaml_default
|
||||||
|
// +build testify_yaml_fail,!testify_yaml_custom,!testify_yaml_default
|
||||||
|
|
||||||
|
// Package yaml is an implementation of YAML functions that always fail.
|
||||||
|
//
|
||||||
|
// This implementation can be used at build time to replace the default implementation
|
||||||
|
// to avoid linking with [gopkg.in/yaml.v3]:
|
||||||
|
//
|
||||||
|
// go test -tags testify_yaml_fail
|
||||||
|
package yaml
|
||||||
|
|
||||||
|
import "errors"
|
||||||
|
|
||||||
|
var errNotImplemented = errors.New("YAML functions are not available (see https://pkg.go.dev/github.com/stretchr/testify/assert/yaml)")
|
||||||
|
|
||||||
|
func Unmarshal([]byte, interface{}) error {
|
||||||
|
return errNotImplemented
|
||||||
|
}
|
432
vendor/github.com/stretchr/testify/require/require.go
generated
vendored
432
vendor/github.com/stretchr/testify/require/require.go
generated
vendored
File diff suppressed because it is too large
Load Diff
2
vendor/github.com/stretchr/testify/require/require.go.tmpl
generated
vendored
2
vendor/github.com/stretchr/testify/require/require.go.tmpl
generated
vendored
@ -1,4 +1,4 @@
|
|||||||
{{.Comment}}
|
{{ replace .Comment "assert." "require."}}
|
||||||
func {{.DocInfo.Name}}(t TestingT, {{.Params}}) {
|
func {{.DocInfo.Name}}(t TestingT, {{.Params}}) {
|
||||||
if h, ok := t.(tHelper); ok { h.Helper() }
|
if h, ok := t.(tHelper); ok { h.Helper() }
|
||||||
if assert.{{.DocInfo.Name}}(t, {{.ForwardedParams}}) { return }
|
if assert.{{.DocInfo.Name}}(t, {{.ForwardedParams}}) { return }
|
||||||
|
68
vendor/github.com/stretchr/testify/require/require_forward.go
generated
vendored
68
vendor/github.com/stretchr/testify/require/require_forward.go
generated
vendored
@ -187,8 +187,8 @@ func (a *Assertions) EqualExportedValuesf(expected interface{}, actual interface
|
|||||||
EqualExportedValuesf(a.t, expected, actual, msg, args...)
|
EqualExportedValuesf(a.t, expected, actual, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// EqualValues asserts that two objects are equal or convertible to the same types
|
// EqualValues asserts that two objects are equal or convertible to the larger
|
||||||
// and equal.
|
// type and equal.
|
||||||
//
|
//
|
||||||
// a.EqualValues(uint32(123), int32(123))
|
// a.EqualValues(uint32(123), int32(123))
|
||||||
func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
|
func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {
|
||||||
@ -198,8 +198,8 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn
|
|||||||
EqualValues(a.t, expected, actual, msgAndArgs...)
|
EqualValues(a.t, expected, actual, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// EqualValuesf asserts that two objects are equal or convertible to the same types
|
// EqualValuesf asserts that two objects are equal or convertible to the larger
|
||||||
// and equal.
|
// type and equal.
|
||||||
//
|
//
|
||||||
// a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted")
|
// a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted")
|
||||||
func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) {
|
func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) {
|
||||||
@ -337,7 +337,7 @@ func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, ti
|
|||||||
// a.EventuallyWithT(func(c *assert.CollectT) {
|
// a.EventuallyWithT(func(c *assert.CollectT) {
|
||||||
// // add assertions as needed; any assertion failure will fail the current tick
|
// // add assertions as needed; any assertion failure will fail the current tick
|
||||||
// assert.True(c, externalValue, "expected 'externalValue' to be true")
|
// assert.True(c, externalValue, "expected 'externalValue' to be true")
|
||||||
// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
|
// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
|
||||||
func (a *Assertions) EventuallyWithT(condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {
|
func (a *Assertions) EventuallyWithT(condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) {
|
||||||
if h, ok := a.t.(tHelper); ok {
|
if h, ok := a.t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@ -362,7 +362,7 @@ func (a *Assertions) EventuallyWithT(condition func(collect *assert.CollectT), w
|
|||||||
// a.EventuallyWithTf(func(c *assert.CollectT, "error message %s", "formatted") {
|
// a.EventuallyWithTf(func(c *assert.CollectT, "error message %s", "formatted") {
|
||||||
// // add assertions as needed; any assertion failure will fail the current tick
|
// // add assertions as needed; any assertion failure will fail the current tick
|
||||||
// assert.True(c, externalValue, "expected 'externalValue' to be true")
|
// assert.True(c, externalValue, "expected 'externalValue' to be true")
|
||||||
// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false")
|
// }, 10*time.Second, 1*time.Second, "external state has not changed to 'true'; still false")
|
||||||
func (a *Assertions) EventuallyWithTf(condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {
|
func (a *Assertions) EventuallyWithTf(condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) {
|
||||||
if h, ok := a.t.(tHelper); ok {
|
if h, ok := a.t.(tHelper); ok {
|
||||||
h.Helper()
|
h.Helper()
|
||||||
@ -1129,6 +1129,40 @@ func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg strin
|
|||||||
NotContainsf(a.t, s, contains, msg, args...)
|
NotContainsf(a.t, s, contains, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NotElementsMatch asserts that the specified listA(array, slice...) is NOT equal to specified
|
||||||
|
// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
|
||||||
|
// the number of appearances of each of them in both lists should not match.
|
||||||
|
// This is an inverse of ElementsMatch.
|
||||||
|
//
|
||||||
|
// a.NotElementsMatch([1, 1, 2, 3], [1, 1, 2, 3]) -> false
|
||||||
|
//
|
||||||
|
// a.NotElementsMatch([1, 1, 2, 3], [1, 2, 3]) -> true
|
||||||
|
//
|
||||||
|
// a.NotElementsMatch([1, 2, 3], [1, 2, 4]) -> true
|
||||||
|
func (a *Assertions) NotElementsMatch(listA interface{}, listB interface{}, msgAndArgs ...interface{}) {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
NotElementsMatch(a.t, listA, listB, msgAndArgs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NotElementsMatchf asserts that the specified listA(array, slice...) is NOT equal to specified
|
||||||
|
// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements,
|
||||||
|
// the number of appearances of each of them in both lists should not match.
|
||||||
|
// This is an inverse of ElementsMatch.
|
||||||
|
//
|
||||||
|
// a.NotElementsMatchf([1, 1, 2, 3], [1, 1, 2, 3], "error message %s", "formatted") -> false
|
||||||
|
//
|
||||||
|
// a.NotElementsMatchf([1, 1, 2, 3], [1, 2, 3], "error message %s", "formatted") -> true
|
||||||
|
//
|
||||||
|
// a.NotElementsMatchf([1, 2, 3], [1, 2, 4], "error message %s", "formatted") -> true
|
||||||
|
func (a *Assertions) NotElementsMatchf(listA interface{}, listB interface{}, msg string, args ...interface{}) {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
NotElementsMatchf(a.t, listA, listB, msg, args...)
|
||||||
|
}
|
||||||
|
|
||||||
// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either
|
// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either
|
||||||
// a slice or a channel with len == 0.
|
// a slice or a channel with len == 0.
|
||||||
//
|
//
|
||||||
@ -1201,7 +1235,25 @@ func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg str
|
|||||||
NotEqualf(a.t, expected, actual, msg, args...)
|
NotEqualf(a.t, expected, actual, msg, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NotErrorIs asserts that at none of the errors in err's chain matches target.
|
// NotErrorAs asserts that none of the errors in err's chain matches target,
|
||||||
|
// but if so, sets target to that error value.
|
||||||
|
func (a *Assertions) NotErrorAs(err error, target interface{}, msgAndArgs ...interface{}) {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
NotErrorAs(a.t, err, target, msgAndArgs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NotErrorAsf asserts that none of the errors in err's chain matches target,
|
||||||
|
// but if so, sets target to that error value.
|
||||||
|
func (a *Assertions) NotErrorAsf(err error, target interface{}, msg string, args ...interface{}) {
|
||||||
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
h.Helper()
|
||||||
|
}
|
||||||
|
NotErrorAsf(a.t, err, target, msg, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NotErrorIs asserts that none of the errors in err's chain matches target.
|
||||||
// This is a wrapper for errors.Is.
|
// This is a wrapper for errors.Is.
|
||||||
func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface{}) {
|
func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface{}) {
|
||||||
if h, ok := a.t.(tHelper); ok {
|
if h, ok := a.t.(tHelper); ok {
|
||||||
@ -1210,7 +1262,7 @@ func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface
|
|||||||
NotErrorIs(a.t, err, target, msgAndArgs...)
|
NotErrorIs(a.t, err, target, msgAndArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NotErrorIsf asserts that at none of the errors in err's chain matches target.
|
// NotErrorIsf asserts that none of the errors in err's chain matches target.
|
||||||
// This is a wrapper for errors.Is.
|
// This is a wrapper for errors.Is.
|
||||||
func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...interface{}) {
|
func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...interface{}) {
|
||||||
if h, ok := a.t.(tHelper); ok {
|
if h, ok := a.t.(tHelper); ok {
|
||||||
|
2
vendor/github.com/stretchr/testify/require/requirements.go
generated
vendored
2
vendor/github.com/stretchr/testify/require/requirements.go
generated
vendored
@ -6,7 +6,7 @@ type TestingT interface {
|
|||||||
FailNow()
|
FailNow()
|
||||||
}
|
}
|
||||||
|
|
||||||
type tHelper interface {
|
type tHelper = interface {
|
||||||
Helper()
|
Helper()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
5
vendor/modules.txt
vendored
5
vendor/modules.txt
vendored
@ -1,4 +1,4 @@
|
|||||||
# github.com/NVIDIA/go-nvlib v0.6.1
|
# github.com/NVIDIA/go-nvlib v0.7.2
|
||||||
## explicit; go 1.20
|
## explicit; go 1.20
|
||||||
github.com/NVIDIA/go-nvlib/pkg/nvlib/device
|
github.com/NVIDIA/go-nvlib/pkg/nvlib/device
|
||||||
github.com/NVIDIA/go-nvlib/pkg/nvlib/info
|
github.com/NVIDIA/go-nvlib/pkg/nvlib/info
|
||||||
@ -61,9 +61,10 @@ github.com/russross/blackfriday/v2
|
|||||||
## explicit; go 1.13
|
## explicit; go 1.13
|
||||||
github.com/sirupsen/logrus
|
github.com/sirupsen/logrus
|
||||||
github.com/sirupsen/logrus/hooks/test
|
github.com/sirupsen/logrus/hooks/test
|
||||||
# github.com/stretchr/testify v1.9.0
|
# github.com/stretchr/testify v1.10.0
|
||||||
## explicit; go 1.17
|
## explicit; go 1.17
|
||||||
github.com/stretchr/testify/assert
|
github.com/stretchr/testify/assert
|
||||||
|
github.com/stretchr/testify/assert/yaml
|
||||||
github.com/stretchr/testify/require
|
github.com/stretchr/testify/require
|
||||||
# github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635
|
# github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635
|
||||||
## explicit
|
## explicit
|
||||||
|
Loading…
Reference in New Issue
Block a user