started adding fakelibusb functions for testing device.go
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
package usb
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
@@ -40,6 +41,8 @@ type fakeLibusb struct {
|
||||
ts map[*libusbTransfer]*fakeTransfer
|
||||
// submitted receives a fakeTransfers when submit() is called.
|
||||
submitted chan *fakeTransfer
|
||||
// handlers is a map of device handles pointing at opened devices.
|
||||
handlers map[*libusbDevHandle]*libusbDevice
|
||||
}
|
||||
|
||||
func (f *fakeLibusb) alloc(_ *libusbDevHandle, _ uint8, _ TransferType, _ time.Duration, _ int, buf []byte) (*libusbTransfer, error) {
|
||||
@@ -80,6 +83,67 @@ func newFakeLibusb() *fakeLibusb {
|
||||
return &fakeLibusb{
|
||||
ts: make(map[*libusbTransfer]*fakeTransfer),
|
||||
submitted: make(chan *fakeTransfer, 10),
|
||||
handlers: make(map[*libusbDevHandle]*libusbDevice),
|
||||
libusbIntf: libusbImpl{},
|
||||
}
|
||||
}
|
||||
|
||||
var (
|
||||
fakeDev1 = new(libusbDevice)
|
||||
fakeDev2 = new(libusbDevice)
|
||||
)
|
||||
|
||||
func (f *fakeLibusb) getDevices(*libusbContext) ([]*libusbDevice, error) {
|
||||
return []*libusbDevice{fakeDev1, fakeDev2}, nil
|
||||
}
|
||||
|
||||
func (f *fakeLibusb) getDeviceDesc(d *libusbDevice) (*Descriptor, error) {
|
||||
switch d {
|
||||
case fakeDev1:
|
||||
// Bus 001 Device 001: ID 9999:0001
|
||||
// One config, one interface, one setup,
|
||||
// two endpoints: 0x01 write, 0x82 read.
|
||||
return &Descriptor{
|
||||
Bus: 1,
|
||||
Address: 1,
|
||||
Spec: USB_2_0,
|
||||
Device: BCD(0x0100), // 1.00
|
||||
Vendor: ID(0x9999),
|
||||
Product: ID(0x0001),
|
||||
Protocol: 255,
|
||||
Configs: []ConfigInfo{{
|
||||
Config: 1,
|
||||
Attributes: uint8(TRANSFER_TYPE_BULK),
|
||||
MaxPower: 50, // * 2mA
|
||||
Interfaces: []InterfaceInfo{{
|
||||
Number: 0,
|
||||
Setups: []InterfaceSetup{{
|
||||
Number: 0,
|
||||
Alternate: 0,
|
||||
IfClass: uint8(CLASS_VENDOR_SPEC),
|
||||
Endpoints: []EndpointInfo{},
|
||||
}},
|
||||
}},
|
||||
}},
|
||||
}, nil
|
||||
case fakeDev2:
|
||||
return &Descriptor{}, nil
|
||||
}
|
||||
return nil, errors.New("invalid USB device")
|
||||
}
|
||||
|
||||
func (f *fakeLibusb) dereference(d *libusbDevice) {}
|
||||
|
||||
func (f *fakeLibusb) open(d *libusbDevice) (*libusbDevHandle, error) {
|
||||
h := new(libusbDevHandle)
|
||||
f.mu.Lock()
|
||||
defer f.mu.Unlock()
|
||||
f.handlers[h] = d
|
||||
return h, nil
|
||||
}
|
||||
|
||||
func (f *fakeLibusb) close(h *libusbDevHandle) {
|
||||
f.mu.Lock()
|
||||
defer f.mu.Unlock()
|
||||
delete(f.handlers, h)
|
||||
}
|
||||
|
@@ -82,46 +82,6 @@ func TestEnum(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestOpenDeviceWithVidPid(t *testing.T) {
|
||||
c := NewContext()
|
||||
defer c.Close()
|
||||
c.Debug(0)
|
||||
|
||||
// Accept for all device
|
||||
devs, err := c.ListDevices(func(desc *Descriptor) bool {
|
||||
return true
|
||||
})
|
||||
defer func() {
|
||||
for _, d := range devs {
|
||||
d.Close()
|
||||
}
|
||||
}()
|
||||
|
||||
if err != nil {
|
||||
t.Fatalf("list: %s", err)
|
||||
}
|
||||
|
||||
for i := range devs {
|
||||
vid := devs[i].Vendor
|
||||
pid := devs[i].Product
|
||||
device, err := c.OpenDeviceWithVidPid((int)(vid), (int)(pid))
|
||||
|
||||
// if the context failed to open device
|
||||
if err != nil {
|
||||
t.Fail()
|
||||
}
|
||||
|
||||
// if opened device was not valid
|
||||
if device.Descriptor.Bus != devs[i].Bus ||
|
||||
device.Descriptor.Address != devs[i].Address ||
|
||||
device.Vendor != devs[i].Vendor ||
|
||||
device.Product != devs[i].Product {
|
||||
t.Fail()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
func TestMultipleContexts(t *testing.T) {
|
||||
var buf bytes.Buffer
|
||||
log.SetOutput(&buf)
|
||||
|
Reference in New Issue
Block a user