mirror of https://github.com/jetkvm/kvm.git
116 lines
3.4 KiB
Go
116 lines
3.4 KiB
Go
//go:build arm && linux
|
|
|
|
package usbgadget
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
var (
|
|
usbConfig = &Config{
|
|
VendorId: "0x1d6b", //The Linux Foundation
|
|
ProductId: "0x0104", //Multifunction Composite Gadget
|
|
SerialNumber: "",
|
|
Manufacturer: "JetKVM",
|
|
Product: "USB Emulation Device",
|
|
strictMode: true,
|
|
}
|
|
usbDevices = &Devices{
|
|
AbsoluteMouse: true,
|
|
RelativeMouse: true,
|
|
Keyboard: true,
|
|
MassStorage: true,
|
|
}
|
|
usbGadgetName = "jetkvm"
|
|
usbGadget *UsbGadget
|
|
)
|
|
|
|
var oldAbsoluteMouseCombinedReportDesc = []byte{
|
|
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
|
|
0x09, 0x02, // Usage (Mouse)
|
|
0xA1, 0x01, // Collection (Application)
|
|
|
|
// Report ID 1: Absolute Mouse Movement
|
|
0x85, 0x01, // Report ID (1)
|
|
0x09, 0x01, // Usage (Pointer)
|
|
0xA1, 0x00, // Collection (Physical)
|
|
0x05, 0x09, // Usage Page (Button)
|
|
0x19, 0x01, // Usage Minimum (0x01)
|
|
0x29, 0x03, // Usage Maximum (0x03)
|
|
0x15, 0x00, // Logical Minimum (0)
|
|
0x25, 0x01, // Logical Maximum (1)
|
|
0x75, 0x01, // Report Size (1)
|
|
0x95, 0x03, // Report Count (3)
|
|
0x81, 0x02, // Input (Data, Var, Abs)
|
|
0x95, 0x01, // Report Count (1)
|
|
0x75, 0x05, // Report Size (5)
|
|
0x81, 0x03, // Input (Cnst, Var, Abs)
|
|
0x05, 0x01, // Usage Page (Generic Desktop Ctrls)
|
|
0x09, 0x30, // Usage (X)
|
|
0x09, 0x31, // Usage (Y)
|
|
0x16, 0x00, 0x00, // Logical Minimum (0)
|
|
0x26, 0xFF, 0x7F, // Logical Maximum (32767)
|
|
0x36, 0x00, 0x00, // Physical Minimum (0)
|
|
0x46, 0xFF, 0x7F, // Physical Maximum (32767)
|
|
0x75, 0x10, // Report Size (16)
|
|
0x95, 0x02, // Report Count (2)
|
|
0x81, 0x02, // Input (Data, Var, Abs)
|
|
0xC0, // End Collection
|
|
|
|
// Report ID 2: Relative Wheel Movement
|
|
0x85, 0x02, // Report ID (2)
|
|
0x09, 0x38, // Usage (Wheel)
|
|
0x15, 0x81, // Logical Minimum (-127)
|
|
0x25, 0x7F, // Logical Maximum (127)
|
|
0x75, 0x08, // Report Size (8)
|
|
0x95, 0x01, // Report Count (1)
|
|
0x81, 0x06, // Input (Data, Var, Rel)
|
|
|
|
0xC0, // End Collection
|
|
}
|
|
|
|
func TestUsbGadgetInit(t *testing.T) {
|
|
assert := assert.New(t)
|
|
usbGadget = NewUsbGadget(usbGadgetName, usbDevices, usbConfig, nil)
|
|
|
|
assert.NotNil(usbGadget)
|
|
}
|
|
|
|
func TestUsbGadgetStrictModeInitFail(t *testing.T) {
|
|
usbConfig.strictMode = true
|
|
u := NewUsbGadget("test", usbDevices, usbConfig, nil)
|
|
assert.Nil(t, u, "should be nil")
|
|
}
|
|
|
|
func TestUsbGadgetUDCNotBoundAfterReportDescrChanged(t *testing.T) {
|
|
assert := assert.New(t)
|
|
usbGadget = NewUsbGadget(usbGadgetName, usbDevices, usbConfig, nil)
|
|
assert.NotNil(usbGadget)
|
|
|
|
// release the usb gadget and create a new one
|
|
usbGadget = nil
|
|
|
|
altGadgetConfig := defaultGadgetConfig
|
|
|
|
oldAbsoluteMouseConfig := altGadgetConfig["absolute_mouse"]
|
|
oldAbsoluteMouseConfig.reportDesc = oldAbsoluteMouseCombinedReportDesc
|
|
altGadgetConfig["absolute_mouse"] = oldAbsoluteMouseConfig
|
|
|
|
usbGadget = newUsbGadget(usbGadgetName, altGadgetConfig, usbDevices, usbConfig, nil)
|
|
assert.NotNil(usbGadget)
|
|
|
|
udcs := getUdcs()
|
|
assert.Equal(1, len(udcs), "should be only one UDC")
|
|
// check if the UDC is bound
|
|
udc := udcs[0]
|
|
assert.NotNil(udc, "UDC should exist")
|
|
|
|
udcStr, err := os.ReadFile("/sys/kernel/config/usb_gadget/jetkvm/UDC")
|
|
assert.Nil(err, "usb_gadget/UDC should exist")
|
|
assert.Equal(strings.TrimSpace(udc), strings.TrimSpace(string(udcStr)), "UDC should be the same")
|
|
}
|