Skip to content

Commit 2016b8b

Browse files
authored
Merge branch 'main' into opendal-comments
2 parents bd2ffb3 + 1382071 commit 2016b8b

File tree

21 files changed

+237
-150
lines changed

21 files changed

+237
-150
lines changed

__templates__/driver/jumpstarter_driver/driver.py.tmpl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ class ${DRIVER_CLASS}(Driver):
1010
some_other_config: int = 69
1111

1212
def __post_init__(self):
13-
super().__post_init__()
13+
if hasattr(super(), "__post_init__"):
14+
super().__post_init__()
1415
# some initialization here.
1516

1617
@classmethod

packages/jumpstarter-driver-can/jumpstarter_driver_can/client.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,13 @@ class CanClient(DriverClient, can.BusABC):
3333
"""
3434

3535
def __post_init__(self):
36+
if hasattr(super(), "__post_init__"):
37+
super().__post_init__()
38+
3639
self._periodic_tasks: List[_SelfRemovingCyclicTask] = []
3740
self._filters = None
3841
self._is_shutdown: bool = False
3942

40-
super().__post_init__()
41-
4243
@property
4344
@validate_call(validate_return=True)
4445
def state(self) -> can.BusState:

packages/jumpstarter-driver-can/jumpstarter_driver_can/driver.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ def client(cls) -> str:
4545
return "jumpstarter_driver_can.client.CanClient"
4646

4747
def __post_init__(self):
48-
super().__post_init__()
48+
if hasattr(super(), "__post_init__"):
49+
super().__post_init__()
50+
4951
self.bus = can.Bus(channel=self.channel, interface=self.interface)
5052

5153
@export
@@ -195,7 +197,9 @@ def client(cls) -> str:
195197
return "jumpstarter_driver_can.client.IsoTpClient"
196198

197199
def __post_init__(self):
198-
super().__post_init__()
200+
if hasattr(super(), "__post_init__"):
201+
super().__post_init__()
202+
199203
self.bus = can.Bus(channel=self.channel, interface=self.interface)
200204
self.notifier = can.Notifier(self.bus, [])
201205
self.stack = isotp.NotifierBasedCanStack(
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import pytest
2+
import usb
3+
4+
5+
def pytest_runtest_call(item):
6+
try:
7+
item.runtest()
8+
except FileNotFoundError:
9+
pytest.skip("dutlink not available")
10+
except usb.core.USBError:
11+
pytest.skip("USB not available")
12+
except usb.core.NoBackendError:
13+
pytest.skip("No USB backend")

packages/jumpstarter-driver-dutlink/jumpstarter_driver_dutlink/driver.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ class DutlinkConfig:
2929
tty: str | None = field(init=False, default=None)
3030

3131
def __post_init__(self):
32+
if hasattr(super(), "__post_init__"):
33+
super().__post_init__()
34+
3235
for dev in usb.core.find(idVendor=0x2B23, idProduct=0x1012, find_all=True):
3336
serial = usb.util.get_string(dev, dev.iSerialNumber)
3437
if serial == self.serial or self.serial is None:
@@ -80,15 +83,17 @@ def control(self, direction, ty, actions, action, value):
8083

8184

8285
@dataclass(kw_only=True)
83-
class DutlinkSerial(DutlinkConfig, PySerial):
84-
url: str | None = field(init=False, default=None)
85-
86+
class DutlinkSerialConfig(DutlinkConfig, Driver):
8687
def __post_init__(self):
87-
super().__post_init__()
88+
if hasattr(super(), "__post_init__"):
89+
super().__post_init__()
8890

8991
self.url = self.tty
9092

91-
super(PySerial, self).__post_init__()
93+
94+
@dataclass(kw_only=True)
95+
class DutlinkSerial(PySerial, DutlinkSerialConfig):
96+
url: str | None = field(init=False, default=None)
9297

9398

9499
@dataclass(kw_only=True)
@@ -247,7 +252,8 @@ class Dutlink(DutlinkConfig, CompositeInterface, Driver):
247252
"""
248253

249254
def __post_init__(self):
250-
super().__post_init__()
255+
if hasattr(super(), "__post_init__"):
256+
super().__post_init__()
251257

252258
self.children["power"] = DutlinkPower(serial=self.serial, timeout_s=self.timeout_s)
253259
self.children["storage"] = DutlinkStorageMux(
Lines changed: 49 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,64 @@
1-
import pytest
2-
import usb
1+
from time import sleep
2+
33
from jumpstarter_driver_network.adapters import PexpectAdapter
44

5-
from jumpstarter_driver_dutlink.driver import Dutlink
5+
from jumpstarter_driver_dutlink.driver import Dutlink, DutlinkPower, DutlinkSerial, DutlinkStorageMux
66

77
from jumpstarter.common.utils import serve
88

9+
STORAGE_DEVICE = "/dev/null" # MANUAL: replace with path to block device
910

10-
def test_drivers_dutlink():
11-
try:
12-
instance = Dutlink(
13-
storage_device="/dev/null",
14-
)
15-
except FileNotFoundError:
16-
pytest.skip("dutlink not available")
17-
except usb.core.USBError:
18-
pytest.skip("USB not available")
19-
except usb.core.NoBackendError:
20-
pytest.skip("No USB backend")
11+
12+
def power_test(power):
13+
power.on() # MANUAL: led DUT_ON should be turned on
14+
sleep(1)
15+
assert next(power.read()).current != 0
16+
power.off() # MANUAL: led DUT_ON should be turned off
17+
18+
19+
def storage_test(storage):
20+
storage.write_local_file("/dev/null")
21+
22+
23+
def serial_test(serial):
24+
with PexpectAdapter(client=serial) as expect:
25+
expect.send("\x02" * 5)
26+
27+
expect.send("about\r\n")
28+
expect.expect("Jumpstarter test-harness")
29+
30+
expect.send("console\r\n")
31+
expect.expect("Entering console mode")
32+
33+
expect.send("hello")
34+
expect.expect("hello")
35+
36+
37+
def test_drivers_dutlink_power():
38+
instance = DutlinkPower()
2139

2240
with serve(instance) as client:
23-
with PexpectAdapter(client=client.console) as expect:
24-
expect.send("\x02" * 5)
41+
power_test(client)
2542

26-
expect.send("about\r\n")
27-
expect.expect("Jumpstarter test-harness")
2843

29-
expect.send("console\r\n")
30-
expect.expect("Entering console mode")
44+
def test_drivers_dutlink_storage_mux():
45+
instance = DutlinkStorageMux(storage_device=STORAGE_DEVICE)
3146

32-
client.power.off()
47+
with serve(instance) as client:
48+
storage_test(client)
3349

34-
client.storage.write_local_file("/dev/null")
35-
client.storage.dut()
3650

37-
client.power.on()
51+
def test_drivers_dutlink_serial():
52+
instance = DutlinkSerial() # MANUAL: connect tx to rx
3853

39-
expect.send("\x02" * 5)
40-
expect.expect("Exiting console mode")
54+
with serve(instance) as client:
55+
serial_test(client)
4156

42-
client.power.off()
57+
58+
def test_drivers_dutlink():
59+
instance = Dutlink(storage_device=STORAGE_DEVICE)
60+
61+
with serve(instance) as client:
62+
power_test(client.power)
63+
storage_test(client.storage)
64+
serial_test(client.console)

packages/jumpstarter-driver-http/jumpstarter_driver_http/driver.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ class HttpServer(Driver):
2929
runner: Optional[web.AppRunner] = field(init=False, default=None)
3030

3131
def __post_init__(self):
32-
super().__post_init__()
32+
if hasattr(super(), "__post_init__"):
33+
super().__post_init__()
34+
3335
os.makedirs(self.root_dir, exist_ok=True)
3436
self.app.router.add_routes(
3537
[

packages/jumpstarter-driver-pyserial/jumpstarter_driver_pyserial/driver.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ class PySerial(Driver):
3333
baudrate: int = field(default=115200)
3434

3535
def __post_init__(self):
36-
super().__post_init__()
36+
if hasattr(super(), "__post_init__"):
37+
super().__post_init__()
38+
3739
self.device = serial_for_url(self.url, baudrate=self.baudrate)
3840

3941
@classmethod

packages/jumpstarter-driver-raspberrypi/jumpstarter_driver_raspberrypi/driver.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ def client(cls) -> str:
1515
return "jumpstarter_driver_raspberrypi.client.DigitalOutputClient"
1616

1717
def __post_init__(self):
18-
super().__post_init__()
18+
if hasattr(super(), "__post_init__"):
19+
super().__post_init__()
1920
# Initialize as InputDevice first
2021
self.device = InputDevice(pin=self.pin)
2122

@@ -49,7 +50,8 @@ def client(cls) -> str:
4950
return "jumpstarter_driver_raspberrypi.client.DigitalInputClient"
5051

5152
def __post_init__(self):
52-
super().__post_init__()
53+
if hasattr(super(), "__post_init__"):
54+
super().__post_init__()
5355
self.device = DigitalInputDevice(pin=self.pin)
5456

5557
@export

packages/jumpstarter-driver-sdwire/jumpstarter_driver_sdwire/driver.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ class SDWire(StorageMuxInterface, Driver):
2222
storage_device: str | None = field(default=None)
2323

2424
def __post_init__(self):
25-
super().__post_init__()
25+
if hasattr(super(), "__post_init__"):
26+
super().__post_init__()
27+
2628
for dev in usb.core.find(idVendor=0x04E8, idProduct=0x6001, find_all=True):
2729
if self.storage_device is None:
2830
context = pyudev.Context()

0 commit comments

Comments
 (0)