From 4d2d4064b269fa9f59ffa89fe41b5b4a28564bd0 Mon Sep 17 00:00:00 2001 From: Ian Chamberlain Date: Mon, 28 Nov 2022 23:03:15 -0700 Subject: [PATCH 1/4] Rework a bunch of stuff in citra dockerfile --- .gitignore | 3 - README.md | 16 +- citra/qt-config.ini | 496 --------------------------------- docker-compose.yml | 26 -- docker/citra.dockerfile | 37 ++- docker/citra/download_citra.sh | 15 + docker/citra/sdl2-config.ini | 342 +++++++++++++++++++++++ docker/driver.dockerfile | 10 - driver/citra-controls.png | Bin 117457 -> 0 bytes driver/citra-hotkeys.png | Bin 90327 -> 0 bytes driver/main.vdo | 16 -- driver/vncdo.sh | 8 - run.sh | 20 -- test-crate/.gitignore | 1 + test-crate/Cargo.lock | 119 ++++++++ test-crate/Cargo.toml | 9 + test-crate/src/main.rs | 53 ++++ 17 files changed, 576 insertions(+), 595 deletions(-) delete mode 100644 citra/qt-config.ini delete mode 100644 docker-compose.yml create mode 100755 docker/citra/download_citra.sh create mode 100644 docker/citra/sdl2-config.ini delete mode 100644 docker/driver.dockerfile delete mode 100644 driver/citra-controls.png delete mode 100644 driver/citra-hotkeys.png delete mode 100644 driver/main.vdo delete mode 100755 driver/vncdo.sh delete mode 100755 run.sh create mode 100644 test-crate/.gitignore create mode 100644 test-crate/Cargo.lock create mode 100644 test-crate/Cargo.toml create mode 100644 test-crate/src/main.rs diff --git a/.gitignore b/.gitignore index 2a6b1e1..e69de29 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +0,0 @@ -# Ignore files generated by citra or the VNC client -citra/out -driver/out diff --git a/README.md b/README.md index 1901e4b..d987acc 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,19 @@ A set of tools for running automated Rust tests against Citra (3DS emulator). 1. Build a test executable (type tbd) 1. `citra-emu` container: bind-mount test executable and choose it 1. `driver` container perform input / output as needed for test, via VNC - * possible extension: `3dslink -s` to get actual stdout/stderr (return code?) - * acceptance testing of images, hopefully via screenshot + +## To do work + +* [ ] Reorganize docker build files vs runtime files a bit +* [ ] Make this repo useable as a github action +* [ ] Run itself as part of CI? I guess? +* [ ] Simpler user-run workflow: + * Ideally, a single command to spin everything up, build + load a 3dsx and run a vdo script. + * Maybe cargo args passed in as environment variable or something? +* [ ] Clearly defined dependencies + use cases: + * Should this be usable without Rust? + * Is docker the only real dependency? + * Does this need a separate binary, or can we just use native cargo test + capabilities? diff --git a/citra/qt-config.ini b/citra/qt-config.ini deleted file mode 100644 index 1ad0544..0000000 --- a/citra/qt-config.ini +++ /dev/null @@ -1,496 +0,0 @@ -[Audio] -enable_audio_stretching=true -enable_audio_stretching\default=true -enable_dsp_lle=false -enable_dsp_lle\default=true -enable_dsp_lle_multithread=false -enable_dsp_lle_multithread\default=true -mic_input_device=Default -mic_input_device\default=true -mic_input_type=0 -mic_input_type\default=true -output_device=auto -output_device\default=true -output_engine=auto -output_engine\default=true -volume=@Variant(\0\0\0\x87?\x80\0\0) -volume\default=true - -[Camera] -camera_inner_config= -camera_inner_config\default=true -camera_inner_flip=0 -camera_inner_flip\default=true -camera_inner_name=blank -camera_inner_name\default=true -camera_outer_left_config= -camera_outer_left_config\default=true -camera_outer_left_flip=0 -camera_outer_left_flip\default=true -camera_outer_left_name=blank -camera_outer_left_name\default=true -camera_outer_right_config= -camera_outer_right_config\default=true -camera_outer_right_flip=0 -camera_outer_right_flip\default=true -camera_outer_right_name=blank -camera_outer_right_name\default=true - -[Controls] -profile=0 -profile\default=true -profiles\1\button_a="code:65,engine:keyboard" -profiles\1\button_a\default=true -profiles\1\button_b="code:83,engine:keyboard" -profiles\1\button_b\default=true -profiles\1\button_debug="code:79,engine:keyboard" -profiles\1\button_debug\default=true -profiles\1\button_down="code:71,engine:keyboard" -profiles\1\button_down\default=true -profiles\1\button_gpio14="code:80,engine:keyboard" -profiles\1\button_gpio14\default=true -profiles\1\button_home="code:66,engine:keyboard" -profiles\1\button_home\default=true -profiles\1\button_l="code:81,engine:keyboard" -profiles\1\button_l\default=true -profiles\1\button_left="code:70,engine:keyboard" -profiles\1\button_left\default=true -profiles\1\button_r="code:87,engine:keyboard" -profiles\1\button_r\default=true -profiles\1\button_right="code:72,engine:keyboard" -profiles\1\button_right\default=true -profiles\1\button_select="code:78,engine:keyboard" -profiles\1\button_select\default=true -profiles\1\button_start="code:77,engine:keyboard" -profiles\1\button_start\default=true -profiles\1\button_up="code:84,engine:keyboard" -profiles\1\button_up\default=true -profiles\1\button_x="code:90,engine:keyboard" -profiles\1\button_x\default=true -profiles\1\button_y="code:88,engine:keyboard" -profiles\1\button_y\default=true -profiles\1\button_zl="code:49,engine:keyboard" -profiles\1\button_zl\default=true -profiles\1\button_zr="code:50,engine:keyboard" -profiles\1\button_zr\default=true -profiles\1\c_stick="down:code$075$1engine$0keyboard,engine:analog_from_button,left:code$074$1engine$0keyboard,modifier:code$068$1engine$0keyboard,modifier_scale:0.500000,right:code$076$1engine$0keyboard,up:code$073$1engine$0keyboard" -profiles\1\c_stick\default=true -profiles\1\circle_pad="down:code$016777237$1engine$0keyboard,engine:analog_from_button,left:code$016777234$1engine$0keyboard,modifier:code$068$1engine$0keyboard,modifier_scale:0.500000,right:code$016777236$1engine$0keyboard,up:code$016777235$1engine$0keyboard" -profiles\1\circle_pad\default=true -profiles\1\motion_device="engine:motion_emu,update_period:100,sensitivity:0.01,tilt_clamp:90.0" -profiles\1\motion_device\default=true -profiles\1\name=default -profiles\1\name\default=true -profiles\1\touch_device=engine:emu_window -profiles\1\touch_device\default=true -profiles\1\touch_from_button_map=0 -profiles\1\touch_from_button_map\default=true -profiles\1\udp_input_address=127.0.0.1 -profiles\1\udp_input_address\default=true -profiles\1\udp_input_port=26760 -profiles\1\udp_input_port\default=true -profiles\1\udp_pad_index=0 -profiles\1\udp_pad_index\default=true -profiles\1\use_touch_from_button=false -profiles\1\use_touch_from_button\default=true -profiles\size=1 -touch_from_button_maps\1\entries\size=0 -touch_from_button_maps\1\name=default -touch_from_button_maps\1\name\default=true -touch_from_button_maps\size=1 - -[Core] -cpu_clock_percentage=100 -cpu_clock_percentage\default=true -use_cpu_jit=true -use_cpu_jit\default=true - -[Data%20Storage] -nand_directory=/root/.local/share/citra-emu/nand/ -nand_directory\default=true -sdmc_directory=/root/.local/share/citra-emu/sdmc/ -sdmc_directory\default=true -use_virtual_sd=true -use_virtual_sd\default=true - -[Debugging] -LLE\AC=false -LLE\AC\default=true -LLE\ACT=false -LLE\ACT\default=true -LLE\AM=false -LLE\AM\default=true -LLE\BOSS=false -LLE\BOSS\default=true -LLE\CAM=false -LLE\CAM\default=true -LLE\CDC=false -LLE\CDC\default=true -LLE\CECD=false -LLE\CECD\default=true -LLE\CFG=false -LLE\CFG\default=true -LLE\CSND=false -LLE\CSND\default=true -LLE\DLP=false -LLE\DLP\default=true -LLE\DSP=false -LLE\DSP\default=true -LLE\ERR=false -LLE\ERR\default=true -LLE\FRD=false -LLE\FRD\default=true -LLE\FS=false -LLE\FS\default=true -LLE\GPIO=false -LLE\GPIO\default=true -LLE\GSP=false -LLE\GSP\default=true -LLE\HID=false -LLE\HID\default=true -LLE\HTTP=false -LLE\HTTP\default=true -LLE\I2C=false -LLE\I2C\default=true -LLE\IR=false -LLE\IR\default=true -LLE\LDR=false -LLE\LDR\default=true -LLE\MCU=false -LLE\MCU\default=true -LLE\MIC=false -LLE\MIC\default=true -LLE\MP=false -LLE\MP\default=true -LLE\MVD=false -LLE\MVD\default=true -LLE\NDM=false -LLE\NDM\default=true -LLE\NEWS=false -LLE\NEWS\default=true -LLE\NFC=false -LLE\NFC\default=true -LLE\NIM=false -LLE\NIM\default=true -LLE\NS=false -LLE\NS\default=true -LLE\NWM=false -LLE\NWM\default=true -LLE\PDN=false -LLE\PDN\default=true -LLE\PM=false -LLE\PM\default=true -LLE\PS=false -LLE\PS\default=true -LLE\PTM=false -LLE\PTM\default=true -LLE\PXI=false -LLE\PXI\default=true -LLE\QTM=false -LLE\QTM\default=true -LLE\SOC=false -LLE\SOC\default=true -LLE\SPI=false -LLE\SPI\default=true -LLE\SSL=false -LLE\SSL\default=true -gdbstub_port=24689 -gdbstub_port\default=true -record_frame_times=false -use_gdbstub=false -use_gdbstub\default=true - -[Layout] -custom_bottom_bottom=480 -custom_bottom_bottom\default=true -custom_bottom_left=40 -custom_bottom_left\default=true -custom_bottom_right=360 -custom_bottom_right\default=true -custom_bottom_top=240 -custom_bottom_top\default=true -custom_layout=false -custom_layout\default=true -custom_top_bottom=240 -custom_top_bottom\default=true -custom_top_left=0 -custom_top_left\default=true -custom_top_right=400 -custom_top_right\default=true -custom_top_top=0 -custom_top_top\default=true -factor_3d=0 -factor_3d\default=true -filter_mode=true -filter_mode\default=true -layout_option=0 -pp_shader_name=none (builtin) -pp_shader_name\default=true -render_3d=0 -render_3d\default=true -swap_screen=false -swap_screen\default=true -upright_screen=false -upright_screen\default=true - -[Miscellaneous] -log_filter=*:Info -log_filter\default=true - -[Renderer] -bg_blue=0.545098066329956 -bg_blue\default=false -bg_green=0.545098066329956 -bg_green\default=false -bg_red=0.545098066329956 -bg_red\default=false -frame_limit=100 -frame_limit\default=true -frame_limit_alternate=200 -frame_limit_alternate\default=true -resolution_factor=1 -resolution_factor\default=true -shaders_accurate_mul=true -shaders_accurate_mul\default=true -texture_filter_name=none -texture_filter_name\default=true -use_disk_shader_cache=true -use_disk_shader_cache\default=true -use_frame_limit_alternate=false -use_frame_limit_alternate\default=true -use_hw_renderer=true -use_hw_renderer\default=true -use_hw_shader=true -use_hw_shader\default=true -use_shader_jit=true -use_shader_jit\default=true -use_vsync_new=true -use_vsync_new\default=true - -[System] -init_clock=0 -init_clock\default=true -init_time=946681277 -init_time\default=true -is_new_3ds=true -is_new_3ds\default=true -region_value=-1 -region_value\default=true - -[UI] -GameList\hideNoIcon=false -GameList\hideNoIcon\default=true -GameList\iconSize=2 -GameList\iconSize\default=true -GameList\row1=2 -GameList\row1\default=true -GameList\row2=0 -GameList\row2\default=true -GameList\singleLineMode=false -GameList\singleLineMode\default=true -Multiplayer\game_id=0 -Multiplayer\game_id\default=true -Multiplayer\host_type=0 -Multiplayer\host_type\default=true -Multiplayer\ip= -Multiplayer\ip\default=true -Multiplayer\ip_ban_list\size=0 -Multiplayer\max_player=8 -Multiplayer\max_player\default=true -Multiplayer\nickname= -Multiplayer\nickname\default=true -Multiplayer\port=24872 -Multiplayer\port\default=true -Multiplayer\room_description= -Multiplayer\room_description\default=true -Multiplayer\room_name= -Multiplayer\room_name\default=true -Multiplayer\room_nickname= -Multiplayer\room_nickname\default=true -Multiplayer\room_port=24872 -Multiplayer\room_port\default=true -Multiplayer\username_ban_list\size=0 -Paths\gamedirs\1\deep_scan=false -Paths\gamedirs\1\deep_scan\default=true -Paths\gamedirs\1\expanded=true -Paths\gamedirs\1\expanded\default=true -Paths\gamedirs\1\path=INSTALLED -Paths\gamedirs\2\deep_scan=false -Paths\gamedirs\2\deep_scan\default=true -Paths\gamedirs\2\expanded=true -Paths\gamedirs\2\expanded\default=true -Paths\gamedirs\2\path=SYSTEM -Paths\gamedirs\size=2 -Paths\language=en -Paths\language\default=false -Paths\moviePlaybackPath= -Paths\movieRecordPath= -Paths\recentFiles=@Invalid() -Paths\romsPath= -Paths\screenshotPath= -Paths\symbolsPath= -Paths\videoDumpingPath= -Shortcuts\Main%20Window\Advance%20Frame\Context=2 -Shortcuts\Main%20Window\Advance%20Frame\Context\default=true -Shortcuts\Main%20Window\Advance%20Frame\KeySeq=\\ -Shortcuts\Main%20Window\Advance%20Frame\KeySeq\default=true -Shortcuts\Main%20Window\Capture%20Screenshot\Context=2 -Shortcuts\Main%20Window\Capture%20Screenshot\Context\default=true -Shortcuts\Main%20Window\Capture%20Screenshot\KeySeq=Ctrl+P -Shortcuts\Main%20Window\Capture%20Screenshot\KeySeq\default=true -Shortcuts\Main%20Window\Continue\Pause%20Emulation\Context=1 -Shortcuts\Main%20Window\Continue\Pause%20Emulation\Context\default=true -Shortcuts\Main%20Window\Continue\Pause%20Emulation\KeySeq=F4 -Shortcuts\Main%20Window\Continue\Pause%20Emulation\KeySeq\default=true -Shortcuts\Main%20Window\Decrease%20Speed%20Limit\Context=2 -Shortcuts\Main%20Window\Decrease%20Speed%20Limit\Context\default=true -Shortcuts\Main%20Window\Decrease%20Speed%20Limit\KeySeq=- -Shortcuts\Main%20Window\Decrease%20Speed%20Limit\KeySeq\default=true -Shortcuts\Main%20Window\Exit%20Citra\Context=1 -Shortcuts\Main%20Window\Exit%20Citra\Context\default=true -Shortcuts\Main%20Window\Exit%20Citra\KeySeq=Ctrl+Q -Shortcuts\Main%20Window\Exit%20Citra\KeySeq\default=true -Shortcuts\Main%20Window\Exit%20Fullscreen\Context=1 -Shortcuts\Main%20Window\Exit%20Fullscreen\Context\default=true -Shortcuts\Main%20Window\Exit%20Fullscreen\KeySeq=Esc -Shortcuts\Main%20Window\Exit%20Fullscreen\KeySeq\default=true -Shortcuts\Main%20Window\Fullscreen\Context=1 -Shortcuts\Main%20Window\Fullscreen\Context\default=true -Shortcuts\Main%20Window\Fullscreen\KeySeq=F11 -Shortcuts\Main%20Window\Fullscreen\KeySeq\default=true -Shortcuts\Main%20Window\Increase%20Speed%20Limit\Context=2 -Shortcuts\Main%20Window\Increase%20Speed%20Limit\Context\default=true -Shortcuts\Main%20Window\Increase%20Speed%20Limit\KeySeq=+ -Shortcuts\Main%20Window\Increase%20Speed%20Limit\KeySeq\default=true -Shortcuts\Main%20Window\Load%20Amiibo\Context=2 -Shortcuts\Main%20Window\Load%20Amiibo\Context\default=true -Shortcuts\Main%20Window\Load%20Amiibo\KeySeq=F2 -Shortcuts\Main%20Window\Load%20Amiibo\KeySeq\default=true -Shortcuts\Main%20Window\Load%20File\Context=1 -Shortcuts\Main%20Window\Load%20File\Context\default=true -Shortcuts\Main%20Window\Load%20File\KeySeq=Ctrl+O -Shortcuts\Main%20Window\Load%20File\KeySeq\default=true -Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\Context=1 -Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\Context\default=true -Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\KeySeq=Ctrl+V -Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\KeySeq\default=true -Shortcuts\Main%20Window\Remove%20Amiibo\Context=2 -Shortcuts\Main%20Window\Remove%20Amiibo\Context\default=true -Shortcuts\Main%20Window\Remove%20Amiibo\KeySeq=F3 -Shortcuts\Main%20Window\Remove%20Amiibo\KeySeq\default=true -Shortcuts\Main%20Window\Restart%20Emulation\Context=1 -Shortcuts\Main%20Window\Restart%20Emulation\Context\default=true -Shortcuts\Main%20Window\Restart%20Emulation\KeySeq=F6 -Shortcuts\Main%20Window\Restart%20Emulation\KeySeq\default=true -Shortcuts\Main%20Window\Rotate%20Screens%20Upright\Context=1 -Shortcuts\Main%20Window\Rotate%20Screens%20Upright\Context\default=true -Shortcuts\Main%20Window\Rotate%20Screens%20Upright\KeySeq=F8 -Shortcuts\Main%20Window\Rotate%20Screens%20Upright\KeySeq\default=true -Shortcuts\Main%20Window\Save%20to%20Oldest%20Slot\Context=1 -Shortcuts\Main%20Window\Save%20to%20Oldest%20Slot\Context\default=true -Shortcuts\Main%20Window\Save%20to%20Oldest%20Slot\KeySeq=Ctrl+C -Shortcuts\Main%20Window\Save%20to%20Oldest%20Slot\KeySeq\default=true -Shortcuts\Main%20Window\Stop%20Emulation\Context=1 -Shortcuts\Main%20Window\Stop%20Emulation\Context\default=true -Shortcuts\Main%20Window\Stop%20Emulation\KeySeq=F5 -Shortcuts\Main%20Window\Stop%20Emulation\KeySeq\default=true -Shortcuts\Main%20Window\Swap%20Screens\Context=1 -Shortcuts\Main%20Window\Swap%20Screens\Context\default=true -Shortcuts\Main%20Window\Swap%20Screens\KeySeq=F9 -Shortcuts\Main%20Window\Swap%20Screens\KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Alternate%20Speed\Context=2 -Shortcuts\Main%20Window\Toggle%20Alternate%20Speed\Context\default=true -Shortcuts\Main%20Window\Toggle%20Alternate%20Speed\KeySeq=Ctrl+Z -Shortcuts\Main%20Window\Toggle%20Alternate%20Speed\KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Context=1 -Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Context\default=true -Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq=Ctrl+F -Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\Context=2 -Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\Context\default=true -Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\KeySeq=Ctrl+A -Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Screen%20Layout\Context=1 -Shortcuts\Main%20Window\Toggle%20Screen%20Layout\Context\default=true -Shortcuts\Main%20Window\Toggle%20Screen%20Layout\KeySeq=F10 -Shortcuts\Main%20Window\Toggle%20Screen%20Layout\KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Status%20Bar\Context=1 -Shortcuts\Main%20Window\Toggle%20Status%20Bar\Context\default=true -Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq=Ctrl+S -Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\Context=2 -Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\Context\default=true -Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\KeySeq=Ctrl+D -Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\KeySeq\default=true -UILayout\gameListHeaderState=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x5\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x4\x98\0\0\0\x5\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0h\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x5\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0h\0\0\0\x1\0\0\0\0\0\0\0h\0\0\0\x1\0\0\0\0\0\0\0h\0\0\0\x1\0\0\0\0\0\0\0\xe0\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0h) -UILayout\geometry="@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\xe3\0\0\0\x99\0\0\x4r\0\0\x2\x31\0\0\0\xe4\0\0\0\xad\0\0\x4q\0\0\x2,\0\0\0\0\0\0\0\0\x5V\0\0\0\xe4\0\0\0\xad\0\0\x4q\0\0\x2,)" -UILayout\geometryRenderWindow=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31\0\0\0\0\0\0\0\0\x5V\0\0\0\0\0\0\0\x14\0\0\0\x63\0\0\0\x31) -UILayout\microProfileDialogGeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x14\0\0\x3\xe7\0\0\x2k\0\0\0\0\0\0\0\x14\0\0\x3\xe7\0\0\x2k\0\0\0\0\0\0\0\0\x5V\0\0\0\0\0\0\0\x14\0\0\x3\xe7\0\0\x2k) -UILayout\microProfileDialogVisible=false -UILayout\microProfileDialogVisible\default=true -UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x8d\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x8d\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xb8\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0G\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xcb\0\xff\xff\xff\0\0\x3\x8e\0\0\x1J\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) -Updater\check_for_update_on_start=true -Updater\check_for_update_on_start\default=true -Updater\update_on_close=false -Updater\update_on_close\default=true -calloutFlags=1 -calloutFlags\default=false -confirmClose=true -confirmClose\default=true -displayTitleBars=true -displayTitleBars\default=true -enable_discord_presence=false -enable_discord_presence\default=false -firstStart=false -firstStart\default=false -fullscreen=false -fullscreen\default=true -hideInactiveMouse=false -hideInactiveMouse\default=true -pauseWhenInBackground=false -pauseWhenInBackground\default=true -screenshot_resolution_factor=0 -screenshot_resolution_factor\default=true -showConsole=false -showConsole\default=true -showFilterBar=true -showFilterBar\default=true -showStatusBar=true -showStatusBar\default=true -singleWindowMode=true -singleWindowMode\default=true -theme=colorful_dark -theme\default=false - -[Utility] -custom_textures=false -custom_textures\default=true -dump_textures=false -dump_textures\default=true -preload_textures=false -preload_textures\default=true - -[VideoDumping] -audio_bitrate=64000 -audio_bitrate\default=true -audio_encoder=libvorbis -audio_encoder\default=true -audio_encoder_options= -audio_encoder_options\default=true -format_options= -output_format=webm -output_format\default=true -video_bitrate=2500000 -video_bitrate\default=true -video_encoder=libvpx-vp9 -video_encoder\default=true -video_encoder_options="quality:realtime,speed:6,tile-columns:4,frame-parallel:1,threads:8,row-mt:1" -video_encoder_options\default=true - -[WebService] -citra_token= -citra_username= -enable_telemetry=false -enable_telemetry\default=false -web_api_url=https://api.citra-emu.org -web_api_url\default=true diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 8600c14..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,26 +0,0 @@ -version: '2' -services: - citra: - build: - context: . - dockerfile: docker/citra.dockerfile - shm_size: 2G - environment: - OPENBOX_ARGS: '--startup "citra-qt ${TEST_FILE:?}"' - RESOLUTION: 1366x768 - ports: - - "6080:80" - - "5900:5900" - volumes: - - "./citra:/tmp/citra" - - "${TEST_FILE:?}:${TEST_FILE:?}:ro" - - driver: - build: - context: . - dockerfile: docker/driver.dockerfile - volumes: - - "./driver:/tmp/driver" - working_dir: /tmp/driver/out - command: ["/usr/libexec/vncdo.sh", "/tmp/driver/main.vdo"] - diff --git a/docker/citra.dockerfile b/docker/citra.dockerfile index 6597747..18cb7a4 100644 --- a/docker/citra.dockerfile +++ b/docker/citra.dockerfile @@ -1,20 +1,29 @@ -FROM dorowu/ubuntu-desktop-lxde-vnc +FROM buildpack-deps:latest as builder -RUN apt-get update -y && \ - apt-get install -y \ - libqt5gui5 \ - libqt5multimedia5 +# ARG CITRA_RELEASE=nightly-1783 +# ARG CITRA_RELEASE_FILE=citra-linux-20220902-746609f.tar.xz - -ARG CITRA_RELEASE=nightly-1763 -ARG CITRA_RELEASE_FILE=citra-linux-20220503-856b3d6.tar.xz +ARG CITRA_CHANNEL=nightly +ARG CITRA_RELEASE=1816 WORKDIR /tmp -RUN wget https://github.com/citra-emu/citra-nightly/releases/download/${CITRA_RELEASE}/${CITRA_RELEASE_FILE} -RUN mkdir -p citra && \ - tar --strip-components 1 -C citra -xvf ${CITRA_RELEASE_FILE} && \ - cp citra/citra-qt citra/citra /usr/local/bin +COPY ./citra/download_citra.sh /usr/local/bin/download_citra +RUN apt-get update -y && apt-get install -y jq +RUN download_citra ${CITRA_CHANNEL} ${CITRA_RELEASE} + +FROM ubuntu:latest + +RUN apt-get update -y && \ + apt-get install -y \ + libswscale5 \ + libsdl2-2.0-0 \ + libavformat58 \ + libavfilter7 \ + xvfb + +COPY --from=builder /tmp/citra /usr/local/bin +COPY ./citra/sdl2-config.ini /root/.config/citra-emu/ -COPY citra/qt-config.ini /root/.config/citra-emu/ +WORKDIR /app -ENV OPENBOX_ARGS='--startup "citra-qt /root/hello-world.3dsx"' +CMD [ "citra", "--version" ] diff --git a/docker/citra/download_citra.sh b/docker/citra/download_citra.sh new file mode 100755 index 0000000..bacb06a --- /dev/null +++ b/docker/citra/download_citra.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +set -euxo pipefail + +CITRA_CHANNEL=$1 +CITRA_RELEASE=$2 + +RELEASE_API="https://api.github.com/repos/citra-emu/citra-${CITRA_CHANNEL}/releases/tags/${CITRA_CHANNEL}-${CITRA_RELEASE}" + +curl "${RELEASE_API}" | + jq --raw-output '.assets[].browser_download_url' | + grep -E 'citra-linux-.*.tar.xz' | + xargs wget -O citra-linux.tar.xz + +tar --strip-components 1 -xvf citra-linux.tar.xz diff --git a/docker/citra/sdl2-config.ini b/docker/citra/sdl2-config.ini new file mode 100644 index 0000000..2abb7bb --- /dev/null +++ b/docker/citra/sdl2-config.ini @@ -0,0 +1,342 @@ + +[Controls] +# The input devices and parameters for each 3DS native input +# It should be in the format of "engine:[engine_name],[param1]:[value1],[param2]:[value2]..." +# Escape characters $0 (for ':'), $1 (for ',') and $2 (for '$') can be used in values + +# for button input, the following devices are available: +# - "keyboard" (default) for keyboard input. Required parameters: +# - "code": the code of the key to bind +# - "sdl" for joystick input using SDL. Required parameters: +# - "joystick": the index of the joystick to bind +# - "button"(optional): the index of the button to bind +# - "hat"(optional): the index of the hat to bind as direction buttons +# - "axis"(optional): the index of the axis to bind +# - "direction"(only used for hat): the direction name of the hat to bind. Can be "up", "down", "left" or "right" +# - "threshold"(only used for axis): a float value in (-1.0, 1.0) which the button is +# triggered if the axis value crosses +# - "direction"(only used for axis): "+" means the button is triggered when the axis value +# is greater than the threshold; "-" means the button is triggered when the axis value +# is smaller than the threshold +button_a= +button_b= +button_x= +button_y= +button_up= +button_down= +button_left= +button_right= +button_l= +button_r= +button_start= +button_select= +button_debug= +button_gpio14= +button_zl= +button_zr= +button_home= + +# for analog input, the following devices are available: +# - "analog_from_button" (default) for emulating analog input from direction buttons. Required parameters: +# - "up", "down", "left", "right": sub-devices for each direction. +# Should be in the format as a button input devices using escape characters, for example, "engine$0keyboard$1code$00" +# - "modifier": sub-devices as a modifier. +# - "modifier_scale": a float number representing the applied modifier scale to the analog input. +# Must be in range of 0.0-1.0. Defaults to 0.5 +# - "sdl" for joystick input using SDL. Required parameters: +# - "joystick": the index of the joystick to bind +# - "axis_x": the index of the axis to bind as x-axis (default to 0) +# - "axis_y": the index of the axis to bind as y-axis (default to 1) +circle_pad= +c_stick= + +# for motion input, the following devices are available: +# - "motion_emu" (default) for emulating motion input from mouse input. Required parameters: +# - "update_period": update period in milliseconds (default to 100) +# - "sensitivity": the coefficient converting mouse movement to tilting angle (default to 0.01) +# - "tilt_clamp": the max value of the tilt angle in degrees (default to 90) +# - "cemuhookudp" reads motion input from a udp server that uses cemuhook's udp protocol +motion_device= + +# for touch input, the following devices are available: +# - "emu_window" (default) for emulating touch input from mouse input to the emulation window. No parameters required +# - "cemuhookudp" reads touch input from a udp server that uses cemuhook's udp protocol +# - "min_x", "min_y", "max_x", "max_y": defines the udp device's touch screen coordinate system +touch_device= + +# Most desktop operating systems do not expose a way to poll the motion state of the controllers +# so as a way around it, cemuhook created a udp client/server protocol to broadcast the data directly +# from a controller device to the client program. Citra has a client that can connect and read +# from any cemuhook compatible motion program. + +# IPv4 address of the udp input server (Default "127.0.0.1") +udp_input_address= + +# Port of the udp input server. (Default 26760) +udp_input_port= + +# The pad to request data on. Should be between 0 (Pad 1) and 3 (Pad 4). (Default 0) +udp_pad_index= + +[Core] +# Whether to use the Just-In-Time (JIT) compiler for CPU emulation +# 0: Interpreter (slow), 1 (default): JIT (fast) +use_cpu_jit = + +# Change the Clock Frequency of the emulated 3DS CPU. +# Underclocking can increase the performance of the game at the risk of freezing. +# Overclocking may fix lag that happens on console, but also comes with the risk of freezing. +# Range is any positive integer (but we suspect 25 - 400 is a good idea) Default is 100 +cpu_clock_percentage = + +[Renderer] +# Whether to render using GLES or OpenGL +# 0 (default): OpenGL, 1: GLES +use_gles = + +# Whether to use software or hardware rendering. +# 0: Software, 1 (default): Hardware +use_hw_renderer = + +# Whether to use hardware shaders to emulate 3DS shaders +# 0: Software, 1 (default): Hardware +use_hw_shader = + +# Whether to use separable shaders to emulate 3DS shaders (macOS only) +# 0: Off (Default), 1 : On +separable_shader = + +# Whether to use accurate multiplication in hardware shaders +# 0: Off (Faster, but causes issues in some games) 1: On (Default. Slower, but correct) +shaders_accurate_mul = + +# Whether to use the Just-In-Time (JIT) compiler for shader emulation +# 0: Interpreter (slow), 1 (default): JIT (fast) +use_shader_jit = + +# Forces VSync on the display thread. Usually doesn't impact performance, but on some drivers it can +# so only turn this off if you notice a speed difference. +# 0: Off, 1 (default): On +use_vsync_new = + +# Reduce stuttering by storing and loading generated shaders to disk +# 0: Off, 1 (default. On) +use_disk_shader_cache = + +# Resolution scale factor +# 0: Auto (scales resolution to window size), 1: Native 3DS screen resolution, Otherwise a scale +# factor for the 3DS resolution +resolution_factor = + +# Texture filter name +texture_filter_name = + +# Limits the speed of the game to run no faster than this value as a percentage of target speed. +# Will not have an effect if unthrottled is enabled. +# 5 - 995: Speed limit as a percentage of target game speed. 0 for unthrottled. 100 (default) +frame_limit = + +# Overrides the frame limiter to use frame_limit_alternate instead of frame_limit. +# 0: Off (default), 1: On +use_frame_limit_alternate = + +# Alternate speed limit to be used instead of frame_limit if use_frame_limit_alternate is enabled +# 5 - 995: Speed limit as a percentage of target game speed. 0 for unthrottled. 200 (default) +frame_limit_alternate = + +# The clear color for the renderer. What shows up on the sides of the bottom screen. +# Must be in range of 0.0-1.0. Defaults to 0.0 for all. +bg_red = 0.5 +bg_blue = 0.5 +bg_green = 0.5 + +# Whether and how Stereoscopic 3D should be rendered +# 0 (default): Off, 1: Side by Side, 2: Anaglyph, 3: Interlaced, 4: Reverse Interlaced +render_3d = + +# Change 3D Intensity +# 0 - 100: Intensity. 0 (default) +factor_3d = + +# The name of the post processing shader to apply. +# Loaded from shaders if render_3d is off or side by side. +# Loaded from shaders/anaglyph if render_3d is anaglyph +pp_shader_name = + +# Whether to enable linear filtering or not +# This is required for some shaders to work correctly +# 0: Nearest, 1 (default): Linear +filter_mode = + +[Layout] +# Layout for the screen inside the render window. +# 0 (default): Default Top Bottom Screen, 1: Single Screen Only, 2: Large Screen Small Screen, 3: Side by Side +layout_option = + +# Toggle custom layout (using the settings below) on or off. +# 0 (default): Off, 1: On +custom_layout = + +# Screen placement when using Custom layout option +# 0x, 0y is the top left corner of the render window. +custom_top_left = +custom_top_top = +custom_top_right = +custom_top_bottom = +custom_bottom_left = +custom_bottom_top = +custom_bottom_right = +custom_bottom_bottom = + +# Swaps the prominent screen with the other screen. +# For example, if Single Screen is chosen, setting this to 1 will display the bottom screen instead of the top screen. +# 0 (default): Top Screen is prominent, 1: Bottom Screen is prominent +swap_screen = + +# Toggle upright orientation, for book style games. +# 0 (default): Off, 1: On +upright_screen = + +# Dumps textures as PNG to dump/textures/[Title ID]/. +# 0 (default): Off, 1: On +dump_textures = + +# Reads PNG files from load/textures/[Title ID]/ and replaces textures. +# 0 (default): Off, 1: On +custom_textures = + +# Loads all custom textures into memory before booting. +# 0 (default): Off, 1: On +preload_textures = + +[Audio] +# Whether or not to enable DSP LLE +# 0 (default): No, 1: Yes +enable_dsp_lle = + +# Whether or not to run DSP LLE on a different thread +# 0 (default): No, 1: Yes +enable_dsp_lle_thread = + + +# Which audio output engine to use. +# auto (default): Auto-select, null: No audio output, sdl2: SDL2 (if available) +output_engine = + +# Whether or not to enable the audio-stretching post-processing effect. +# This effect adjusts audio speed to match emulation speed and helps prevent audio stutter, +# at the cost of increasing audio latency. +# 0: No, 1 (default): Yes +enable_audio_stretching = + +# Which audio device to use. +# auto (default): Auto-select +output_device = + +# Output volume. +# 1.0 (default): 100%, 0.0; mute +volume = + +[Data Storage] +# Whether to create a virtual SD card. +# 1 (default): Yes, 0: No +use_virtual_sd = + +# The path of the virtual SD card directory. +# empty (default) will use the user_path +sdmc_directory = + +# The path of NAND directory. +# empty (default) will use the user_path +nand_directory = + +[System] +# The system model that Citra will try to emulate +# 0: Old 3DS, 1: New 3DS (default) +is_new_3ds = + +# The system region that Citra will use during emulation +# -1: Auto-select (default), 0: Japan, 1: USA, 2: Europe, 3: Australia, 4: China, 5: Korea, 6: Taiwan +region_value = + +# The clock to use when citra starts +# 0: System clock (default), 1: fixed time +init_clock = + +# Time used when init_clock is set to fixed_time in the format %Y-%m-%d %H:%M:%S +# set to fixed time. Default 2000-01-01 00:00:01 +# Note: 3DS can only handle times later then Jan 1 2000 +init_time = + +[Camera] +# Which camera engine to use for the right outer camera +# blank (default): a dummy camera that always returns black image +camera_outer_right_name = + +# A config string for the right outer camera. Its meaning is defined by the camera engine +camera_outer_right_config = + +# The image flip to apply +# 0: None (default), 1: Horizontal, 2: Vertical, 3: Reverse +camera_outer_right_flip = + +# ... for the left outer camera +camera_outer_left_name = +camera_outer_left_config = +camera_outer_left_flip = + +# ... for the inner camera +camera_inner_name = +camera_inner_config = +camera_inner_flip = + +[Miscellaneous] +# A filter which removes logs below a certain logging level. +# Examples: *:Debug Kernel.SVC:Trace Service.*:Critical +log_filter = *:Info Debug.Emulated:Debug +# Kernel:Debug Service.APT:Trace + +[Debugging] +# Record frame time data, can be found in the log directory. Boolean value +record_frame_times = +# Port for listening to GDB connections. +use_gdbstub=false +gdbstub_port=24689 +# To LLE a service module add "LLE\=true" + +[WebService] +# Whether or not to enable telemetry +# 0: No, 1 (default): Yes +enable_telemetry = 1 +# URL for Web API +web_api_url = https://api.citra-emu.org +# Username and token for Citra Web Service +# See https://profile.citra-emu.org/ for more info +citra_username = +citra_token = + +[Video Dumping] +# Format of the video to output, default: webm +output_format = + +# Options passed to the muxer (optional) +# This is a param package, format: [key1]:[value1],[key2]:[value2],... +format_options = + +# Video encoder used, default: libvpx-vp9 +video_encoder = libvpx-vp9 + +# Options passed to the video codec (optional) +video_encoder_options = quality:realtime,speed:6,tile-columns:4,frame-parallel:1,threads:8,row-mt:1 + +# Video bitrate, default: 2500000 +video_bitrate = + +# Audio encoder used, default: libvorbis +audio_encoder = libvorbis + +# Options passed to the audio codec (optional) +audio_encoder_options = + +# Audio bitrate, default: 64000 +audio_bitrate = diff --git a/docker/driver.dockerfile b/docker/driver.dockerfile deleted file mode 100644 index a993ace..0000000 --- a/docker/driver.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM ghcr.io/ian-h-chamberlain/rust-devkitarm - -RUN apt-get update -y && \ - apt-get install -y python3 python3-pip python3-pil - -RUN pip3 install vncdotool - -COPY driver/vncdo.sh /usr/libexec/ - -CMD [ "vncdo", "--version" ] diff --git a/driver/citra-controls.png b/driver/citra-controls.png deleted file mode 100644 index 13cf6d92bd4a8dcc9e5239dea06f7829ac597773..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117457 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�&2TBvTaB_ItB=#jG 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%0DpjqO6RP5qG^q)wEi%j7IKv)uUB5PY6I!@Dj- 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�D@@d=-{ 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 EAHEm}2mk;8 diff --git a/driver/citra-hotkeys.png b/driver/citra-hotkeys.png deleted file mode 100644 index 3bc55749707bfd870bdb7451e59fc8f9010c1ccf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90327 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≶I`-j(vvjn5 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 diff --git a/driver/main.vdo b/driver/main.vdo deleted file mode 100644 index 40060d7..0000000 --- a/driver/main.vdo +++ /dev/null @@ -1,16 +0,0 @@ -# Wait for citra to finish startup -sleep 3 - -# Main test logic -key ctrl-p type "/tmp/citra/out/screenshot0.png" key enter -keydown a keyup a -keydown s keyup s -keydown z keyup z -keydown q - keydown a keyup a - keydown s keyup s - keydown z keyup z -keyup q -key ctrl-p type "/tmp/citra/out/screenshot1.png" key enter - -capture final.png diff --git a/driver/vncdo.sh b/driver/vncdo.sh deleted file mode 100755 index b02c161..0000000 --- a/driver/vncdo.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -while ! vncdo -s citra pause 0 &>/dev/null; do - echo "waiting for VNC server..." - sleep 1 -done - -exec vncdo -s citra --nocursor --delay 400 "$@" diff --git a/run.sh b/run.sh deleted file mode 100755 index 712eabc..0000000 --- a/run.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -set -eux -o pipefail - -if [[ $# -lt 1 ]]; then - echo "Usage: run.sh 3DSX_FILE" - exit 1 -fi - -trap 'docker-compose down' EXIT - -rm -rf citra/out driver/out -mkdir -p citra/out driver/out - -TEST_FILE=$(realpath "$1") -export TEST_FILE - -docker-compose build -docker-compose up -d citra -docker-compose run driver diff --git a/test-crate/.gitignore b/test-crate/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/test-crate/.gitignore @@ -0,0 +1 @@ +/target diff --git a/test-crate/Cargo.lock b/test-crate/Cargo.lock new file mode 100644 index 0000000..edd7621 --- /dev/null +++ b/test-crate/Cargo.lock @@ -0,0 +1,119 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "const-zero" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d3d68618a1f2c2d86e0bd2adec82e31960ca11aaeb5f353ff01746a4e08f36" + +[[package]] +name = "ctru-rs" +version = "0.7.1" +source = "git+https://github.com/Meziu/ctru-rs.git#ac6c81e7819185be46576af3441f5260d39a2320" +dependencies = [ + "bitflags", + "cfg-if", + "const-zero", + "ctru-sys", + "libc", + "linker-fix-3ds", + "once_cell", + "pthread-3ds", + "toml", + "widestring", +] + +[[package]] +name = "ctru-sys" +version = "0.4.1" +source = "git+https://github.com/Meziu/ctru-rs.git#ac6c81e7819185be46576af3441f5260d39a2320" +dependencies = [ + "libc", +] + +[[package]] +name = "libc" +version = "0.2.132" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" + +[[package]] +name = "linker-fix-3ds" +version = "0.1.0" +source = "git+https://github.com/Meziu/rust-linker-fix-3ds.git#d5d3be4a0da876df6d6ac55cc8b48488713e149a" +dependencies = [ + "ctru-sys", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" + +[[package]] +name = "pthread-3ds" +version = "0.1.0" +source = "git+https://github.com/Meziu/pthread-3ds.git#42a80c0e816251138df535648258671d93e047a6" +dependencies = [ + "ctru-sys", + "libc", + "spin", + "static_assertions", +] + +[[package]] +name = "serde" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" + +[[package]] +name = "spin" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c530c2b0d0bf8b69304b39fe2001993e267461948b890cd037d8ad4293fa1a0d" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "test-crate" +version = "0.1.0" +dependencies = [ + "ctru-rs", + "ctru-sys", +] + +[[package]] +name = "toml" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +dependencies = [ + "serde", +] + +[[package]] +name = "widestring" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7157704c2e12e3d2189c507b7482c52820a16dfa4465ba91add92f266667cadb" diff --git a/test-crate/Cargo.toml b/test-crate/Cargo.toml new file mode 100644 index 0000000..b5dd4a7 --- /dev/null +++ b/test-crate/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "test-crate" +version = "0.1.0" +edition = "2021" +authors = [""] + +[dependencies] +ctru-rs = { git = "https://github.com/Meziu/ctru-rs.git" } +ctru-sys = { git = "https://github.com/Meziu/ctru-rs.git" } diff --git a/test-crate/src/main.rs b/test-crate/src/main.rs new file mode 100644 index 0000000..c8957bf --- /dev/null +++ b/test-crate/src/main.rs @@ -0,0 +1,53 @@ +use std::time::Duration; + +use ctru::console::Console; +use ctru::gfx::Gfx; +use ctru::services::apt::Apt; +use ctru::services::hid::{Hid, KeyPad}; + +fn main() { + ctru::init(); + let gfx = Gfx::init().expect("Couldn't obtain GFX controller"); + let hid = Hid::init().expect("Couldn't obtain HID controller"); + let apt = Apt::init().expect("Couldn't obtain APT controller"); + // let _console = Console::init(gfx.top_screen.borrow_mut()); + + let _ = unsafe { ctru_sys::consoleDebugInit(ctru_sys::debugDevice_SVC) }; + + std::env::set_var("RUST_BACKTRACE", "full"); + + let res = unsafe { ctru_sys::gdbHioDevInit() }; + if res != 0 { + eprintln!("failed to init gdbHIO: {res}"); + } else { + eprintln!("init gdb hio"); + } + + // let res = unsafe { ctru_sys::gdbHioDevRedirectStdStreams(false, true, true) }; + // if res != 0 { + // eprintln!("failed to redirect gdbHIO: {res}"); + // } else { + // eprintln!("redirected gdb hio"); + // } + + println!("hey stdout"); + eprintln!("hey stderr"); + + // Main loop + while apt.main_loop() { + //Scan all the inputs. This should be done once for each frame + hid.scan_input(); + + if hid.keys_down().contains(KeyPad::KEY_START) { + break; + } + // Flush and swap framebuffers + gfx.flush_buffers(); + gfx.swap_buffers(); + + //Wait for VBlank + gfx.wait_for_vblank(); + } + + unsafe { ctru_sys::gdbHioDevExit() }; +} From 98fc093c435fde3fe426a73eb76ca524a22f62d4 Mon Sep 17 00:00:00 2001 From: Ian Chamberlain Date: Sun, 6 Aug 2023 17:22:33 -0400 Subject: [PATCH 2/4] Copy test runner and actions from ctru-rs --- .github/CODEOWNERS | 1 + .github/actions/setup/action.yml | 40 +++++++ .github/workflows/ci.yml | 67 ++++++++++++ .gitignore | 14 +++ Cargo.toml | 15 +++ docker/citra.dockerfile | 29 ----- docker/{citra => }/download_citra.sh | 0 docker/{citra => }/sdl2-config.ini | 0 docker/test-runner.gdb | 16 +++ src/console.rs | 51 +++++++++ src/gdb.rs | 48 ++++++++ src/lib.rs | 158 +++++++++++++++++++++++++++ src/socket.rs | 27 +++++ test-crate/.gitignore | 1 - test-crate/Cargo.lock | 119 -------------------- test-crate/Cargo.toml | 9 -- test-crate/src/main.rs | 53 --------- tests/integration.rs | 13 +++ 18 files changed, 450 insertions(+), 211 deletions(-) create mode 100644 .github/CODEOWNERS create mode 100644 .github/actions/setup/action.yml create mode 100644 .github/workflows/ci.yml create mode 100644 Cargo.toml delete mode 100644 docker/citra.dockerfile rename docker/{citra => }/download_citra.sh (100%) rename docker/{citra => }/sdl2-config.ini (100%) create mode 100644 docker/test-runner.gdb create mode 100644 src/console.rs create mode 100644 src/gdb.rs create mode 100644 src/lib.rs create mode 100644 src/socket.rs delete mode 100644 test-crate/.gitignore delete mode 100644 test-crate/Cargo.lock delete mode 100644 test-crate/Cargo.toml delete mode 100644 test-crate/src/main.rs create mode 100644 tests/integration.rs diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..0163641 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @rust3ds/active diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml new file mode 100644 index 0000000..4a1db0b --- /dev/null +++ b/.github/actions/setup/action.yml @@ -0,0 +1,40 @@ +name: Setup Rust3DS +description: Set up CI environment for Rust + 3DS development + +inputs: + toolchain: + description: The Rust toolchain to use for the steps + required: true + default: nightly + +runs: + using: composite + steps: + # https://github.com/nektos/act/issues/917#issuecomment-1074421318 + - if: ${{ env.ACT }} + shell: bash + name: Hack container for local development + run: | + curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - + sudo apt-get install -y nodejs + + - name: Setup default Rust toolchain + # Use this helper action so we get matcher support + # https://github.com/actions-rust-lang/setup-rust-toolchain/pull/15 + uses: actions-rust-lang/setup-rust-toolchain@v1 + with: + components: clippy, rustfmt, rust-src + toolchain: ${{ inputs.toolchain }} + + - name: Install build tools for host + shell: bash + run: sudo apt-get update && sudo apt-get install -y build-essential + + - name: Install cargo-3ds + shell: bash + run: cargo install cargo-3ds + + - name: Set PATH to include devkitARM + shell: bash + # For some reason devkitARM/bin is not part of the default PATH in the container + run: echo "${DEVKITARM}/bin" >> $GITHUB_PATH diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..657c5f9 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,67 @@ +name: CI + +on: + push: + branches: + - master + pull_request: + branches: + - master + workflow_dispatch: + +env: + # actions-rust-lang/setup-rust-toolchain sets some default RUSTFLAGS, which we don't want to use + RUSTFLAGS: "" + +jobs: + lint: + strategy: + matrix: + toolchain: + - nightly-2023-06-01 + + runs-on: ubuntu-latest + container: devkitpro/devkitarm + steps: + - name: Checkout branch + uses: actions/checkout@v2 + + - uses: ./.github/actions/setup + with: + toolchain: ${{ matrix.toolchain }} + + - name: Check formatting + run: cargo fmt --all --verbose -- --check + + - name: Run clippy + # We have to build the test crate here since it's not included in build-std by default + run: cargo 3ds clippy -Zbuild-std=std,test --color=always --verbose --all-targets + + test: + strategy: + matrix: + toolchain: + # Oldest supported nightly + - nightly-2023-06-01 + - nightly + + continue-on-error: ${{ matrix.toolchain == 'nightly' }} + runs-on: ubuntu-latest + container: devkitpro/devkitarm + steps: + - name: Checkout branch + uses: actions/checkout@v3 + + - uses: ./.github/actions/setup + with: + toolchain: ${{ matrix.toolchain }} + + - name: Build lib tests + run: cargo 3ds test --no-run --lib + + - name: Build integration tests + run: cargo 3ds test --no-run --test integration + + - name: Build doc tests + # need build-std=test until https://github.com/rust3ds/cargo-3ds/pull/42 + run: cargo 3ds test --doc -Zbuild-std=std,test diff --git a/.gitignore b/.gitignore index e69de29..6985cf1 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,14 @@ +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..60a6399 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "test-runner" +version = "0.1.0" +edition = "2021" + +[features] +console = [] +gdb = [] +socket = [] + +[dependencies] +ctru-rs = { git = "https://github.com/rust3ds/ctru-rs" } +ctru-sys = { git = "https://github.com/rust3ds/ctru-rs" } +libc = "0.2.147" +shim-3ds = { git = "https://github.com/rust3ds/shim-3ds", version = "0.1.0" } diff --git a/docker/citra.dockerfile b/docker/citra.dockerfile deleted file mode 100644 index 18cb7a4..0000000 --- a/docker/citra.dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -FROM buildpack-deps:latest as builder - -# ARG CITRA_RELEASE=nightly-1783 -# ARG CITRA_RELEASE_FILE=citra-linux-20220902-746609f.tar.xz - -ARG CITRA_CHANNEL=nightly -ARG CITRA_RELEASE=1816 - -WORKDIR /tmp -COPY ./citra/download_citra.sh /usr/local/bin/download_citra -RUN apt-get update -y && apt-get install -y jq -RUN download_citra ${CITRA_CHANNEL} ${CITRA_RELEASE} - -FROM ubuntu:latest - -RUN apt-get update -y && \ - apt-get install -y \ - libswscale5 \ - libsdl2-2.0-0 \ - libavformat58 \ - libavfilter7 \ - xvfb - -COPY --from=builder /tmp/citra /usr/local/bin -COPY ./citra/sdl2-config.ini /root/.config/citra-emu/ - -WORKDIR /app - -CMD [ "citra", "--version" ] diff --git a/docker/citra/download_citra.sh b/docker/download_citra.sh similarity index 100% rename from docker/citra/download_citra.sh rename to docker/download_citra.sh diff --git a/docker/citra/sdl2-config.ini b/docker/sdl2-config.ini similarity index 100% rename from docker/citra/sdl2-config.ini rename to docker/sdl2-config.ini diff --git a/docker/test-runner.gdb b/docker/test-runner.gdb new file mode 100644 index 0000000..c3258a7 --- /dev/null +++ b/docker/test-runner.gdb @@ -0,0 +1,16 @@ +# https://github.com/devkitPro/libctru/blob/master/libctru/source/system/stack_adjust.s#LL28C23-L28C23 +# or should this be `_exit` ? +break __ctru_exit +commands + # TODO: needed? + continue + # ARM calling convention will put the exit code in r0 when __ctru_exit is called. + # Just tell GDB to exit with the same code, since it doesn't get passed back when + # the program exits + quit $r0 +end + +# TODO: parametrize or pass as command line arg instead +target extended-remote 192.168.0.167:4003 +# target extended-remote :4000 +continue diff --git a/src/console.rs b/src/console.rs new file mode 100644 index 0000000..5e61951 --- /dev/null +++ b/src/console.rs @@ -0,0 +1,51 @@ +use ctru::prelude::*; +use ctru::services::gfx::{Flush, Swap}; + +use super::TestRunner; + +pub struct ConsoleRunner { + gfx: Gfx, + hid: Hid, + apt: Apt, +} + +impl Default for ConsoleRunner { + fn default() -> Self { + let gfx = Gfx::new().unwrap(); + let hid = Hid::new().unwrap(); + let apt = Apt::new().unwrap(); + + gfx.top_screen.borrow_mut().set_wide_mode(true); + + Self { gfx, hid, apt } + } +} + +impl TestRunner for ConsoleRunner { + type Context<'this> = Console<'this>; + + fn setup(&mut self) -> Self::Context<'_> { + Console::new(self.gfx.top_screen.borrow_mut()) + } + + fn cleanup(mut self, _test_result: std::io::Result) { + // We don't actually care about the test result, either way we'll stop + // and show the results to the user + + // Wait to make sure the user can actually see the results before we exit + println!("Press START to exit."); + + while self.apt.main_loop() { + let mut screen = self.gfx.top_screen.borrow_mut(); + screen.flush_buffers(); + screen.swap_buffers(); + + self.gfx.wait_for_vblank(); + + self.hid.scan_input(); + if self.hid.keys_down().contains(KeyPad::START) { + break; + } + } + } +} diff --git a/src/gdb.rs b/src/gdb.rs new file mode 100644 index 0000000..d8a7c46 --- /dev/null +++ b/src/gdb.rs @@ -0,0 +1,48 @@ +use ctru::error::ResultCode; + +use super::TestRunner; + +#[derive(Default)] +pub struct GdbRunner; + +impl Drop for GdbRunner { + fn drop(&mut self) { + unsafe { ctru_sys::gdbHioDevExit() } + } +} + +impl TestRunner for GdbRunner { + type Context<'this> = (); + + fn setup(&mut self) -> Self::Context<'_> { + // TODO: `ctru` expose safe API to do this and call that instead + || -> ctru::Result<()> { + unsafe { + ResultCode(ctru_sys::gdbHioDevInit())?; + // TODO: should we actually redirect stdin or nah? + ResultCode(ctru_sys::gdbHioDevRedirectStdStreams(true, true, true))?; + } + Ok(()) + }() + .expect("failed to redirect I/O streams to GDB"); + } + + fn cleanup(self, test_result: std::io::Result) { + // GDB actually has the opportunity to inspect the exit code, + // unlike other runners, so let's follow the default behavior of the + // stdlib test runner. + match test_result { + Ok(success) => { + if success { + std::process::exit(0); + } else { + std::process::exit(101); + } + } + Err(err) => { + eprintln!("Error: {err}"); + std::process::exit(101); + } + } + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..3f9597c --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,158 @@ +//! Custom test runner for building/running tests on the 3DS. +//! +//! This library can be used with +//! [`custom_test_frameworks`](https://doc.rust-lang.org/unstable-book/language-features/custom-test-frameworks.html) +//! to enable normal Rust testing workflows for 3DS homebrew. + +#![feature(test)] +#![feature(custom_test_frameworks)] +#![test_runner(run_gdb)] + +extern crate test; + +mod console; +mod gdb; +mod socket; + +use console::ConsoleRunner; +use gdb::GdbRunner; +use socket::SocketRunner; + +use test::{ColorConfig, OutputFormat, TestDescAndFn, TestFn, TestOpts}; + +/// Show test output in GDB, using the [File I/O Protocol] (called HIO in some 3DS +/// homebrew resources). Both stdout and stderr will be printed to the GDB console. +/// +/// [File I/O Protocol]: https://sourceware.org/gdb/onlinedocs/gdb/File_002dI_002fO-Overview.html#File_002dI_002fO-Overview +pub fn run_gdb(tests: &[&TestDescAndFn]) { + run::(tests) +} + +/// Run tests using the `ctru` [`Console`] (print results to the 3DS screen). +/// This is mostly useful for running tests manually, especially on real hardware. +/// +/// [`Console`]: ctru::console::Console +pub fn run_console(tests: &[&TestDescAndFn]) { + run::(tests) +} + +/// Show test output via a network socket to `3dslink`. This runner is only useful +/// on real hardware, since `3dslink` doesn't work with emulators. +/// +/// See [`Soc::redirect_to_3dslink`] for more details. +/// +/// [`Soc::redirect_to_3dslink`]: ctru::services::soc::Soc::redirect_to_3dslink +pub fn run_socket(tests: &[&TestDescAndFn]) { + run::(tests) +} + +fn run(tests: &[&TestDescAndFn]) { + std::env::set_var("RUST_BACKTRACE", "1"); + + let mut runner = Runner::default(); + let ctx = runner.setup(); + + let opts = TestOpts { + force_run_in_process: true, + run_tests: true, + // TODO: color doesn't work because of TERM/TERMINFO. + // With RomFS we might be able to fake this out nicely... + color: ColorConfig::AlwaysColor, + format: OutputFormat::Pretty, + test_threads: Some(1), + // Hopefully this interface is more stable vs specifying individual options, + // and parsing the empty list of args should always work, I think. + // TODO Ideally we could pass actual std::env::args() here too + ..test::test::parse_opts(&[]).unwrap().unwrap() + }; + + let tests = tests.iter().map(|t| make_owned_test(t)).collect(); + let result = test::run_tests_console(&opts, tests); + + drop(ctx); + + runner.cleanup(result); +} + +/// Adapted from [`test::make_owned_test`]. +/// Clones static values for putting into a dynamic vector, which `test_main()` +/// needs to hand out ownership of tests to parallel test runners. +/// +/// This will panic when fed any dynamic tests, because they cannot be cloned. +fn make_owned_test(test: &TestDescAndFn) -> TestDescAndFn { + let testfn = match test.testfn { + TestFn::StaticTestFn(f) => TestFn::StaticTestFn(f), + TestFn::StaticBenchFn(f) => TestFn::StaticBenchFn(f), + _ => panic!("non-static tests passed to test::test_main_static"), + }; + + TestDescAndFn { + testfn, + desc: test.desc.clone(), + } +} + +/// A helper trait to make the behavior of test runners consistent. +trait TestRunner: Sized + Default { + /// Any context the test runner needs to remain alive for the duration of + /// the test. This can be used for things that need to borrow the test runner + /// itself. + // TODO: with associated type defaults this could be `= ();` + type Context<'this> + where + Self: 'this; + + /// Create the [`Context`](Self::Context), if any. + fn setup(&mut self) -> Self::Context<'_>; + + /// Handle the results of the test and perform any necessary cleanup. + /// The [`Context`](Self::Context) will be dropped just before this is called. + fn cleanup(self, test_result: std::io::Result); +} + +/// This module has stubs needed to link the test library, but they do nothing +/// because we don't actually need them for the runner to work. +mod link_fix { + #[no_mangle] + extern "C" fn execvp( + _argc: *const libc::c_char, + _argv: *mut *const libc::c_char, + ) -> libc::c_int { + -1 + } + + #[no_mangle] + extern "C" fn pipe(_fildes: *mut libc::c_int) -> libc::c_int { + -1 + } + + #[no_mangle] + extern "C" fn sigemptyset(_arg1: *mut libc::sigset_t) -> ::libc::c_int { + -1 + } +} + +/// Verify that doctests work as expected +/// ``` +/// assert_eq!(2 + 2, 4); +/// ``` +/// +/// ```should_panic +/// assert_eq!(2 + 2, 5); +/// ``` +#[cfg(doctest)] +struct Dummy; + +#[cfg(test)] +mod tests { + #[test] + fn it_works() { + assert_eq!(2 + 2, 4); + } + + #[test] + #[should_panic] + fn it_fails() { + assert_eq!(2 + 2, 5); + } +} diff --git a/src/socket.rs b/src/socket.rs new file mode 100644 index 0000000..dab54d1 --- /dev/null +++ b/src/socket.rs @@ -0,0 +1,27 @@ +use ctru::prelude::*; + +use super::TestRunner; + +pub struct SocketRunner { + soc: Soc, +} + +impl Default for SocketRunner { + fn default() -> Self { + Self { + soc: Soc::new().expect("failed to initialize network service"), + } + } +} + +impl TestRunner for SocketRunner { + type Context<'this> = (); + + fn setup(&mut self) -> Self::Context<'_> { + self.soc + .redirect_to_3dslink(true, true) + .expect("failed to redirect to socket"); + } + + fn cleanup(self, _test_result: std::io::Result) {} +} diff --git a/test-crate/.gitignore b/test-crate/.gitignore deleted file mode 100644 index ea8c4bf..0000000 --- a/test-crate/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target diff --git a/test-crate/Cargo.lock b/test-crate/Cargo.lock deleted file mode 100644 index edd7621..0000000 --- a/test-crate/Cargo.lock +++ /dev/null @@ -1,119 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "const-zero" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d3d68618a1f2c2d86e0bd2adec82e31960ca11aaeb5f353ff01746a4e08f36" - -[[package]] -name = "ctru-rs" -version = "0.7.1" -source = "git+https://github.com/Meziu/ctru-rs.git#ac6c81e7819185be46576af3441f5260d39a2320" -dependencies = [ - "bitflags", - "cfg-if", - "const-zero", - "ctru-sys", - "libc", - "linker-fix-3ds", - "once_cell", - "pthread-3ds", - "toml", - "widestring", -] - -[[package]] -name = "ctru-sys" -version = "0.4.1" -source = "git+https://github.com/Meziu/ctru-rs.git#ac6c81e7819185be46576af3441f5260d39a2320" -dependencies = [ - "libc", -] - -[[package]] -name = "libc" -version = "0.2.132" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" - -[[package]] -name = "linker-fix-3ds" -version = "0.1.0" -source = "git+https://github.com/Meziu/rust-linker-fix-3ds.git#d5d3be4a0da876df6d6ac55cc8b48488713e149a" -dependencies = [ - "ctru-sys", - "libc", -] - -[[package]] -name = "once_cell" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" - -[[package]] -name = "pthread-3ds" -version = "0.1.0" -source = "git+https://github.com/Meziu/pthread-3ds.git#42a80c0e816251138df535648258671d93e047a6" -dependencies = [ - "ctru-sys", - "libc", - "spin", - "static_assertions", -] - -[[package]] -name = "serde" -version = "1.0.137" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" - -[[package]] -name = "spin" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c530c2b0d0bf8b69304b39fe2001993e267461948b890cd037d8ad4293fa1a0d" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "test-crate" -version = "0.1.0" -dependencies = [ - "ctru-rs", - "ctru-sys", -] - -[[package]] -name = "toml" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" -dependencies = [ - "serde", -] - -[[package]] -name = "widestring" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7157704c2e12e3d2189c507b7482c52820a16dfa4465ba91add92f266667cadb" diff --git a/test-crate/Cargo.toml b/test-crate/Cargo.toml deleted file mode 100644 index b5dd4a7..0000000 --- a/test-crate/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "test-crate" -version = "0.1.0" -edition = "2021" -authors = [""] - -[dependencies] -ctru-rs = { git = "https://github.com/Meziu/ctru-rs.git" } -ctru-sys = { git = "https://github.com/Meziu/ctru-rs.git" } diff --git a/test-crate/src/main.rs b/test-crate/src/main.rs deleted file mode 100644 index c8957bf..0000000 --- a/test-crate/src/main.rs +++ /dev/null @@ -1,53 +0,0 @@ -use std::time::Duration; - -use ctru::console::Console; -use ctru::gfx::Gfx; -use ctru::services::apt::Apt; -use ctru::services::hid::{Hid, KeyPad}; - -fn main() { - ctru::init(); - let gfx = Gfx::init().expect("Couldn't obtain GFX controller"); - let hid = Hid::init().expect("Couldn't obtain HID controller"); - let apt = Apt::init().expect("Couldn't obtain APT controller"); - // let _console = Console::init(gfx.top_screen.borrow_mut()); - - let _ = unsafe { ctru_sys::consoleDebugInit(ctru_sys::debugDevice_SVC) }; - - std::env::set_var("RUST_BACKTRACE", "full"); - - let res = unsafe { ctru_sys::gdbHioDevInit() }; - if res != 0 { - eprintln!("failed to init gdbHIO: {res}"); - } else { - eprintln!("init gdb hio"); - } - - // let res = unsafe { ctru_sys::gdbHioDevRedirectStdStreams(false, true, true) }; - // if res != 0 { - // eprintln!("failed to redirect gdbHIO: {res}"); - // } else { - // eprintln!("redirected gdb hio"); - // } - - println!("hey stdout"); - eprintln!("hey stderr"); - - // Main loop - while apt.main_loop() { - //Scan all the inputs. This should be done once for each frame - hid.scan_input(); - - if hid.keys_down().contains(KeyPad::KEY_START) { - break; - } - // Flush and swap framebuffers - gfx.flush_buffers(); - gfx.swap_buffers(); - - //Wait for VBlank - gfx.wait_for_vblank(); - } - - unsafe { ctru_sys::gdbHioDevExit() }; -} diff --git a/tests/integration.rs b/tests/integration.rs new file mode 100644 index 0000000..b00b99f --- /dev/null +++ b/tests/integration.rs @@ -0,0 +1,13 @@ +// Workaround for https://github.com/rust-lang/rust/issues/94348 +extern crate shim_3ds; + +#[test] +fn it_works() { + assert_eq!(2 + 2, 4); +} + +#[test] +#[should_panic] +fn it_fails() { + assert_eq!(2 + 2, 5); +} From 05b8c86e71aeb0abddfc9072b057e4c507662c6f Mon Sep 17 00:00:00 2001 From: Ian Chamberlain Date: Sun, 6 Aug 2023 21:05:05 -0400 Subject: [PATCH 3/4] Create reusable action for running citra Minor updates to setup etc as well --- .dockerignore | 2 + .github/CODEOWNERS | 1 - .github/actions/citra/action.yml | 12 ++ .github/actions/setup/action.yml | 6 +- .github/workflows/ci.yml | 13 +- Dockerfile | 38 ++++ README.md | 39 +--- docker/download_citra.sh | 6 +- docker/entrypoint.sh | 26 +++ docker/sdl2-config.ini | 338 +------------------------------ docker/test-runner.gdb | 7 +- 11 files changed, 112 insertions(+), 376 deletions(-) create mode 100644 .dockerignore delete mode 100644 .github/CODEOWNERS create mode 100644 .github/actions/citra/action.yml create mode 100644 Dockerfile create mode 100755 docker/entrypoint.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..ca27d87 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +** +!docker/ diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 0163641..0000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @rust3ds/active diff --git a/.github/actions/citra/action.yml b/.github/actions/citra/action.yml new file mode 100644 index 0000000..18441f0 --- /dev/null +++ b/.github/actions/citra/action.yml @@ -0,0 +1,12 @@ +name: 'Run 3DS Executable' +description: 'Run a given 3DS executable with citra and GDB' +inputs: + executable: + description: > + The 3DS executable(s) to run. Globs and space separated lists allowed. + required: true +runs: + using: docker + image: ../../../Dockerfile + args: + - ${{ inputs.executable }} diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 4a1db0b..077222b 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -26,13 +26,17 @@ runs: components: clippy, rustfmt, rust-src toolchain: ${{ inputs.toolchain }} + - name: Set up Rust cache + uses: Swatinem/rust-cache@v2 + - name: Install build tools for host shell: bash run: sudo apt-get update && sudo apt-get install -y build-essential - name: Install cargo-3ds shell: bash - run: cargo install cargo-3ds + # TODO: replace with crates.io version once published + run: cargo install --git https://github.com/rust3ds/cargo-3ds --branch feature/verbose-flag - name: Set PATH to include devkitARM shell: bash diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 657c5f9..a8810fa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,10 +3,10 @@ name: CI on: push: branches: - - master + - main pull_request: branches: - - master + - main workflow_dispatch: env: @@ -65,3 +65,12 @@ jobs: - name: Build doc tests # need build-std=test until https://github.com/rust3ds/cargo-3ds/pull/42 run: cargo 3ds test --doc -Zbuild-std=std,test + + - name: Run lib + integration tests + uses: ./.github/actions/citra + with: + executable: ./target/armv6k-nintendo-3ds/debug/deps/*.elf + + # TODO: run doc tests. We might be able to do something with e.g. + # cargo's "runner" configuration, but it seems we also need a test + # runtime and stuff for that to work. diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b0f5728 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,38 @@ +FROM buildpack-deps:latest as builder + +ARG CITRA_CHANNEL=nightly +ARG CITRA_RELEASE=1962 + +WORKDIR /tmp +COPY ./docker/download_citra.sh /usr/local/bin/download_citra +RUN apt-get update -y && apt-get install -y jq +RUN download_citra ${CITRA_CHANNEL} ${CITRA_RELEASE} + +RUN wget https://apt.devkitpro.org/install-devkitpro-pacman && \ + chmod +x ./install-devkitpro-pacman && \ + yes | /tmp/install-devkitpro-pacman +RUN dkp-pacman -S --noconfirm \ + devkitARM-gdb \ + libctru + +FROM ubuntu:latest + +RUN apt-get update -y && \ + apt-get install -y \ + libswscale5 \ + libsdl2-2.0-0 \ + libavformat58 \ + libavfilter7 \ + xvfb + +COPY --from=builder /opt/devkitpro /opt/devkitpro +ENV PATH=/opt/devkitpro/devkitARM/bin:${PATH} + +COPY --from=builder /tmp/citra.AppImage /usr/local/bin/citra +COPY ./docker/sdl2-config.ini /root/.config/citra-emu/ +COPY ./docker/test-runner.gdb /app/ +COPY ./docker/entrypoint.sh /app/ + +WORKDIR /app + +ENTRYPOINT [ "/app/entrypoint.sh" ] diff --git a/README.md b/README.md index d987acc..6141473 100644 --- a/README.md +++ b/README.md @@ -3,35 +3,14 @@ A set of tools for running automated Rust tests against Citra (3DS emulator). -## Usage +## Components -`./run.sh 3DSX_FILE` +* `test-runner`: a Rust crate for writing tests for 3DS homebrew +* `Dockerfile`: builds a container for running test executables with Citra. +* GitHub Actions: + * `.github/actions/setup`: action for setting up the Rust 3DS toolchain in + workflows + * `.github/actions/citra`: action for running test executables with Citra in + workflows -## Goals - -* Docker container for manually running tests against Citra -* GitHub Action for running automated tests -* Rust testing framework (custom runner) for use with the 3ds -* (maybe) Acceptance testing framework or glue for one? - -## Workflow / Notes - -1. Build a test executable (type tbd) -1. `citra-emu` container: bind-mount test executable and choose it -1. `driver` container perform input / output as needed for test, via VNC - * possible extension: `3dslink -s` to get actual stdout/stderr (return code?) - * acceptance testing of images, hopefully via screenshot - -## To do work - -* [ ] Reorganize docker build files vs runtime files a bit -* [ ] Make this repo useable as a github action -* [ ] Run itself as part of CI? I guess? -* [ ] Simpler user-run workflow: - * Ideally, a single command to spin everything up, build + load a 3dsx and run a vdo script. - * Maybe cargo args passed in as environment variable or something? -* [ ] Clearly defined dependencies + use cases: - * Should this be usable without Rust? - * Is docker the only real dependency? - * Does this need a separate binary, or can we just use native cargo test - capabilities? + diff --git a/docker/download_citra.sh b/docker/download_citra.sh index bacb06a..ec6699c 100755 --- a/docker/download_citra.sh +++ b/docker/download_citra.sh @@ -9,7 +9,7 @@ RELEASE_API="https://api.github.com/repos/citra-emu/citra-${CITRA_CHANNEL}/relea curl "${RELEASE_API}" | jq --raw-output '.assets[].browser_download_url' | - grep -E 'citra-linux-.*.tar.xz' | - xargs wget -O citra-linux.tar.xz + grep -E 'citra-linux-.*.tar.gz' | + xargs wget -O citra-linux.tar.gz -tar --strip-components 1 -xvf citra-linux.tar.xz +tar --strip-components 1 -xvf citra-linux.tar.gz diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100755 index 0000000..b514fdd --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# Clean up child processes on exit: https://stackoverflow.com/a/2173421/14436105 +trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT + +ls -lart $@ + +ERRS=0 +# shellcheck disable=SC2068 +for EXE in $@; do + VIDEO_OUT="$(dirname "$EXE")/$(basename "$EXE" .elf)_out.webm" + + # colored logs would be nice, but we can always just grab the plaintext log file + xvfb-run citra --appimage-extract-and-run --dump-video="$VIDEO_OUT" "$EXE" &>/dev/null & + + # Citra takes a little while to start up, so wait a little before we try to connect + sleep 3 + + arm-none-eabi-gdb --batch-silent --command /app/test-runner.gdb "$EXE" + STATUS=$? + if [ $STATUS -ne 0 ]; then + ERRS=$((ERRS + 1)) + fi +done + +exit $ERRS diff --git a/docker/sdl2-config.ini b/docker/sdl2-config.ini index 2abb7bb..3aeb006 100644 --- a/docker/sdl2-config.ini +++ b/docker/sdl2-config.ini @@ -1,342 +1,12 @@ - -[Controls] -# The input devices and parameters for each 3DS native input -# It should be in the format of "engine:[engine_name],[param1]:[value1],[param2]:[value2]..." -# Escape characters $0 (for ':'), $1 (for ',') and $2 (for '$') can be used in values - -# for button input, the following devices are available: -# - "keyboard" (default) for keyboard input. Required parameters: -# - "code": the code of the key to bind -# - "sdl" for joystick input using SDL. Required parameters: -# - "joystick": the index of the joystick to bind -# - "button"(optional): the index of the button to bind -# - "hat"(optional): the index of the hat to bind as direction buttons -# - "axis"(optional): the index of the axis to bind -# - "direction"(only used for hat): the direction name of the hat to bind. Can be "up", "down", "left" or "right" -# - "threshold"(only used for axis): a float value in (-1.0, 1.0) which the button is -# triggered if the axis value crosses -# - "direction"(only used for axis): "+" means the button is triggered when the axis value -# is greater than the threshold; "-" means the button is triggered when the axis value -# is smaller than the threshold -button_a= -button_b= -button_x= -button_y= -button_up= -button_down= -button_left= -button_right= -button_l= -button_r= -button_start= -button_select= -button_debug= -button_gpio14= -button_zl= -button_zr= -button_home= - -# for analog input, the following devices are available: -# - "analog_from_button" (default) for emulating analog input from direction buttons. Required parameters: -# - "up", "down", "left", "right": sub-devices for each direction. -# Should be in the format as a button input devices using escape characters, for example, "engine$0keyboard$1code$00" -# - "modifier": sub-devices as a modifier. -# - "modifier_scale": a float number representing the applied modifier scale to the analog input. -# Must be in range of 0.0-1.0. Defaults to 0.5 -# - "sdl" for joystick input using SDL. Required parameters: -# - "joystick": the index of the joystick to bind -# - "axis_x": the index of the axis to bind as x-axis (default to 0) -# - "axis_y": the index of the axis to bind as y-axis (default to 1) -circle_pad= -c_stick= - -# for motion input, the following devices are available: -# - "motion_emu" (default) for emulating motion input from mouse input. Required parameters: -# - "update_period": update period in milliseconds (default to 100) -# - "sensitivity": the coefficient converting mouse movement to tilting angle (default to 0.01) -# - "tilt_clamp": the max value of the tilt angle in degrees (default to 90) -# - "cemuhookudp" reads motion input from a udp server that uses cemuhook's udp protocol -motion_device= - -# for touch input, the following devices are available: -# - "emu_window" (default) for emulating touch input from mouse input to the emulation window. No parameters required -# - "cemuhookudp" reads touch input from a udp server that uses cemuhook's udp protocol -# - "min_x", "min_y", "max_x", "max_y": defines the udp device's touch screen coordinate system -touch_device= - -# Most desktop operating systems do not expose a way to poll the motion state of the controllers -# so as a way around it, cemuhook created a udp client/server protocol to broadcast the data directly -# from a controller device to the client program. Citra has a client that can connect and read -# from any cemuhook compatible motion program. - -# IPv4 address of the udp input server (Default "127.0.0.1") -udp_input_address= - -# Port of the udp input server. (Default 26760) -udp_input_port= - -# The pad to request data on. Should be between 0 (Pad 1) and 3 (Pad 4). (Default 0) -udp_pad_index= - -[Core] -# Whether to use the Just-In-Time (JIT) compiler for CPU emulation -# 0: Interpreter (slow), 1 (default): JIT (fast) -use_cpu_jit = - -# Change the Clock Frequency of the emulated 3DS CPU. -# Underclocking can increase the performance of the game at the risk of freezing. -# Overclocking may fix lag that happens on console, but also comes with the risk of freezing. -# Range is any positive integer (but we suspect 25 - 400 is a good idea) Default is 100 -cpu_clock_percentage = - -[Renderer] -# Whether to render using GLES or OpenGL -# 0 (default): OpenGL, 1: GLES -use_gles = - -# Whether to use software or hardware rendering. -# 0: Software, 1 (default): Hardware -use_hw_renderer = - -# Whether to use hardware shaders to emulate 3DS shaders -# 0: Software, 1 (default): Hardware -use_hw_shader = - -# Whether to use separable shaders to emulate 3DS shaders (macOS only) -# 0: Off (Default), 1 : On -separable_shader = - -# Whether to use accurate multiplication in hardware shaders -# 0: Off (Faster, but causes issues in some games) 1: On (Default. Slower, but correct) -shaders_accurate_mul = - -# Whether to use the Just-In-Time (JIT) compiler for shader emulation -# 0: Interpreter (slow), 1 (default): JIT (fast) -use_shader_jit = - -# Forces VSync on the display thread. Usually doesn't impact performance, but on some drivers it can -# so only turn this off if you notice a speed difference. -# 0: Off, 1 (default): On -use_vsync_new = - -# Reduce stuttering by storing and loading generated shaders to disk -# 0: Off, 1 (default. On) -use_disk_shader_cache = - -# Resolution scale factor -# 0: Auto (scales resolution to window size), 1: Native 3DS screen resolution, Otherwise a scale -# factor for the 3DS resolution -resolution_factor = - -# Texture filter name -texture_filter_name = - -# Limits the speed of the game to run no faster than this value as a percentage of target speed. -# Will not have an effect if unthrottled is enabled. -# 5 - 995: Speed limit as a percentage of target game speed. 0 for unthrottled. 100 (default) -frame_limit = - -# Overrides the frame limiter to use frame_limit_alternate instead of frame_limit. -# 0: Off (default), 1: On -use_frame_limit_alternate = - -# Alternate speed limit to be used instead of frame_limit if use_frame_limit_alternate is enabled -# 5 - 995: Speed limit as a percentage of target game speed. 0 for unthrottled. 200 (default) -frame_limit_alternate = - -# The clear color for the renderer. What shows up on the sides of the bottom screen. -# Must be in range of 0.0-1.0. Defaults to 0.0 for all. -bg_red = 0.5 -bg_blue = 0.5 -bg_green = 0.5 - -# Whether and how Stereoscopic 3D should be rendered -# 0 (default): Off, 1: Side by Side, 2: Anaglyph, 3: Interlaced, 4: Reverse Interlaced -render_3d = - -# Change 3D Intensity -# 0 - 100: Intensity. 0 (default) -factor_3d = - -# The name of the post processing shader to apply. -# Loaded from shaders if render_3d is off or side by side. -# Loaded from shaders/anaglyph if render_3d is anaglyph -pp_shader_name = - -# Whether to enable linear filtering or not -# This is required for some shaders to work correctly -# 0: Nearest, 1 (default): Linear -filter_mode = - -[Layout] -# Layout for the screen inside the render window. -# 0 (default): Default Top Bottom Screen, 1: Single Screen Only, 2: Large Screen Small Screen, 3: Side by Side -layout_option = - -# Toggle custom layout (using the settings below) on or off. -# 0 (default): Off, 1: On -custom_layout = - -# Screen placement when using Custom layout option -# 0x, 0y is the top left corner of the render window. -custom_top_left = -custom_top_top = -custom_top_right = -custom_top_bottom = -custom_bottom_left = -custom_bottom_top = -custom_bottom_right = -custom_bottom_bottom = - -# Swaps the prominent screen with the other screen. -# For example, if Single Screen is chosen, setting this to 1 will display the bottom screen instead of the top screen. -# 0 (default): Top Screen is prominent, 1: Bottom Screen is prominent -swap_screen = - -# Toggle upright orientation, for book style games. -# 0 (default): Off, 1: On -upright_screen = - -# Dumps textures as PNG to dump/textures/[Title ID]/. -# 0 (default): Off, 1: On -dump_textures = - -# Reads PNG files from load/textures/[Title ID]/ and replaces textures. -# 0 (default): Off, 1: On -custom_textures = - -# Loads all custom textures into memory before booting. -# 0 (default): Off, 1: On -preload_textures = - -[Audio] -# Whether or not to enable DSP LLE -# 0 (default): No, 1: Yes -enable_dsp_lle = - -# Whether or not to run DSP LLE on a different thread -# 0 (default): No, 1: Yes -enable_dsp_lle_thread = - - -# Which audio output engine to use. -# auto (default): Auto-select, null: No audio output, sdl2: SDL2 (if available) -output_engine = - -# Whether or not to enable the audio-stretching post-processing effect. -# This effect adjusts audio speed to match emulation speed and helps prevent audio stutter, -# at the cost of increasing audio latency. -# 0: No, 1 (default): Yes -enable_audio_stretching = - -# Which audio device to use. -# auto (default): Auto-select -output_device = - -# Output volume. -# 1.0 (default): 100%, 0.0; mute -volume = - -[Data Storage] -# Whether to create a virtual SD card. -# 1 (default): Yes, 0: No -use_virtual_sd = - -# The path of the virtual SD card directory. -# empty (default) will use the user_path -sdmc_directory = - -# The path of NAND directory. -# empty (default) will use the user_path -nand_directory = - -[System] -# The system model that Citra will try to emulate -# 0: Old 3DS, 1: New 3DS (default) -is_new_3ds = - -# The system region that Citra will use during emulation -# -1: Auto-select (default), 0: Japan, 1: USA, 2: Europe, 3: Australia, 4: China, 5: Korea, 6: Taiwan -region_value = - -# The clock to use when citra starts -# 0: System clock (default), 1: fixed time -init_clock = - -# Time used when init_clock is set to fixed_time in the format %Y-%m-%d %H:%M:%S -# set to fixed time. Default 2000-01-01 00:00:01 -# Note: 3DS can only handle times later then Jan 1 2000 -init_time = - -[Camera] -# Which camera engine to use for the right outer camera -# blank (default): a dummy camera that always returns black image -camera_outer_right_name = - -# A config string for the right outer camera. Its meaning is defined by the camera engine -camera_outer_right_config = - -# The image flip to apply -# 0: None (default), 1: Horizontal, 2: Vertical, 3: Reverse -camera_outer_right_flip = - -# ... for the left outer camera -camera_outer_left_name = -camera_outer_left_config = -camera_outer_left_flip = - -# ... for the inner camera -camera_inner_name = -camera_inner_config = -camera_inner_flip = - [Miscellaneous] -# A filter which removes logs below a certain logging level. -# Examples: *:Debug Kernel.SVC:Trace Service.*:Critical log_filter = *:Info Debug.Emulated:Debug -# Kernel:Debug Service.APT:Trace [Debugging] -# Record frame time data, can be found in the log directory. Boolean value -record_frame_times = -# Port for listening to GDB connections. -use_gdbstub=false -gdbstub_port=24689 -# To LLE a service module add "LLE\=true" +use_gdbstub=true +gdbstub_port=4000 [WebService] -# Whether or not to enable telemetry -# 0: No, 1 (default): Yes -enable_telemetry = 1 -# URL for Web API -web_api_url = https://api.citra-emu.org -# Username and token for Citra Web Service -# See https://profile.citra-emu.org/ for more info -citra_username = -citra_token = +enable_telemetry = 0 [Video Dumping] -# Format of the video to output, default: webm -output_format = - -# Options passed to the muxer (optional) -# This is a param package, format: [key1]:[value1],[key2]:[value2],... -format_options = - -# Video encoder used, default: libvpx-vp9 -video_encoder = libvpx-vp9 - -# Options passed to the video codec (optional) -video_encoder_options = quality:realtime,speed:6,tile-columns:4,frame-parallel:1,threads:8,row-mt:1 - -# Video bitrate, default: 2500000 -video_bitrate = - -# Audio encoder used, default: libvorbis -audio_encoder = libvorbis - -# Options passed to the audio codec (optional) -audio_encoder_options = - -# Audio bitrate, default: 64000 -audio_bitrate = +output_format = webm diff --git a/docker/test-runner.gdb b/docker/test-runner.gdb index c3258a7..1b7e00c 100644 --- a/docker/test-runner.gdb +++ b/docker/test-runner.gdb @@ -2,15 +2,12 @@ # or should this be `_exit` ? break __ctru_exit commands - # TODO: needed? - continue # ARM calling convention will put the exit code in r0 when __ctru_exit is called. # Just tell GDB to exit with the same code, since it doesn't get passed back when # the program exits quit $r0 end -# TODO: parametrize or pass as command line arg instead -target extended-remote 192.168.0.167:4003 -# target extended-remote :4000 +target extended-remote :4000 continue +quit From 780d45d4a6a64bf988c0cbf7ae4fbd4082303ae6 Mon Sep 17 00:00:00 2001 From: Ian Chamberlain Date: Sun, 6 Aug 2023 22:30:32 -0400 Subject: [PATCH 4/4] Fix up some test runner issues Clean up dockerfile build by using devkitarm base image to get devkitpro tools. Also upload artifacts after running, and fix some issues due to Github Actions working slightly different than plain docker. --- .github/actions/setup/action.yml | 2 ++ .github/workflows/ci.yml | 12 +++++++++-- Cargo.toml | 1 - Dockerfile | 14 +++++-------- docker/entrypoint.sh | 36 ++++++++++++++++++++++++++------ tests/integration.rs | 6 +++--- 6 files changed, 50 insertions(+), 21 deletions(-) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 077222b..95629df 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -28,6 +28,8 @@ runs: - name: Set up Rust cache uses: Swatinem/rust-cache@v2 + with: + shared-key: rust3ds - name: Install build tools for host shell: bash diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a8810fa..04d0614 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -63,8 +63,7 @@ jobs: run: cargo 3ds test --no-run --test integration - name: Build doc tests - # need build-std=test until https://github.com/rust3ds/cargo-3ds/pull/42 - run: cargo 3ds test --doc -Zbuild-std=std,test + run: cargo 3ds test --no-run --doc - name: Run lib + integration tests uses: ./.github/actions/citra @@ -74,3 +73,12 @@ jobs: # TODO: run doc tests. We might be able to do something with e.g. # cargo's "runner" configuration, but it seems we also need a test # runtime and stuff for that to work. + + - name: Upload citra logs and capture videos + uses: actions/upload-artifact@v3 + if: success() || failure() + with: + name: citra-logs-${{ matrix.toolchain }} + path: | + target/armv6k-nintendo-3ds/debug/deps/*.txt + target/armv6k-nintendo-3ds/debug/deps/*.webm diff --git a/Cargo.toml b/Cargo.toml index 60a6399..6d49699 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,4 +12,3 @@ socket = [] ctru-rs = { git = "https://github.com/rust3ds/ctru-rs" } ctru-sys = { git = "https://github.com/rust3ds/ctru-rs" } libc = "0.2.147" -shim-3ds = { git = "https://github.com/rust3ds/shim-3ds", version = "0.1.0" } diff --git a/Dockerfile b/Dockerfile index b0f5728..f183e67 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,16 +8,12 @@ COPY ./docker/download_citra.sh /usr/local/bin/download_citra RUN apt-get update -y && apt-get install -y jq RUN download_citra ${CITRA_CHANNEL} ${CITRA_RELEASE} -RUN wget https://apt.devkitpro.org/install-devkitpro-pacman && \ - chmod +x ./install-devkitpro-pacman && \ - yes | /tmp/install-devkitpro-pacman -RUN dkp-pacman -S --noconfirm \ - devkitARM-gdb \ - libctru +FROM devkitpro/devkitarm:latest as devkitarm FROM ubuntu:latest -RUN apt-get update -y && \ +RUN --mount=type=cache,sharing=locked,target=/var/cache/apt \ + apt-get update -y && \ apt-get install -y \ libswscale5 \ libsdl2-2.0-0 \ @@ -25,11 +21,11 @@ RUN apt-get update -y && \ libavfilter7 \ xvfb -COPY --from=builder /opt/devkitpro /opt/devkitpro +COPY --from=devkitarm /opt/devkitpro /opt/devkitpro ENV PATH=/opt/devkitpro/devkitARM/bin:${PATH} COPY --from=builder /tmp/citra.AppImage /usr/local/bin/citra -COPY ./docker/sdl2-config.ini /root/.config/citra-emu/ +COPY ./docker/sdl2-config.ini /app/ COPY ./docker/test-runner.gdb /app/ COPY ./docker/entrypoint.sh /app/ diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index b514fdd..a64e91d 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -1,25 +1,49 @@ #!/bin/bash # Clean up child processes on exit: https://stackoverflow.com/a/2173421/14436105 -trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT +trap "pkill -P $$" EXIT INT TERM -ls -lart $@ +mkdir -p ~/.config/citra-emu +cp /app/sdl2-config.ini ~/.config/citra-emu +# For some reason, log file is only written when this dir already exists, +# but it is only created after the first run of citra (our only run, in the container) +mkdir -p ~/.local/share/citra-emu/ ERRS=0 # shellcheck disable=SC2068 for EXE in $@; do - VIDEO_OUT="$(dirname "$EXE")/$(basename "$EXE" .elf)_out.webm" + VIDEO_OUT="$(dirname "$EXE")/$(basename "$EXE" .elf)_capture.webm" # colored logs would be nice, but we can always just grab the plaintext log file - xvfb-run citra --appimage-extract-and-run --dump-video="$VIDEO_OUT" "$EXE" &>/dev/null & + xvfb-run citra \ + --appimage-extract-and-run \ + --dump-video="$VIDEO_OUT" \ + "$EXE" \ + &>/dev/null & + PID=$! # Citra takes a little while to start up, so wait a little before we try to connect sleep 3 - arm-none-eabi-gdb --batch-silent --command /app/test-runner.gdb "$EXE" + arm-none-eabi-gdb --silent --batch-silent --command /app/test-runner.gdb "$EXE" STATUS=$? if [ $STATUS -ne 0 ]; then - ERRS=$((ERRS + 1)) + echo >&2 "FAILED (exit status $STATUS): $EXE" + ERRS=$(( ERRS + 1 )) + fi + + kill -INT $PID &>/dev/null + sleep 1 + if kill -0 $PID &>/dev/null; then + kill -KILL $PID &>/dev/null + fi + + CITRA_LOG=~/.local/share/citra-emu/log/citra_log.txt + CITRA_LOG_OUT="$(dirname "$EXE")/$(basename "$EXE" .elf)_citra_log.txt" + if test -f "$CITRA_LOG"; then + cp "$CITRA_LOG" "$CITRA_LOG_OUT" + else + echo "WARNING: citra log not found" fi done diff --git a/tests/integration.rs b/tests/integration.rs index b00b99f..1cd14ac 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -1,5 +1,5 @@ -// Workaround for https://github.com/rust-lang/rust/issues/94348 -extern crate shim_3ds; +#![feature(custom_test_frameworks)] +#![test_runner(test_runner::run_gdb)] #[test] fn it_works() { @@ -8,6 +8,6 @@ fn it_works() { #[test] #[should_panic] -fn it_fails() { +fn it_panics() { assert_eq!(2 + 2, 5); }