# Testing ## Automated unit tests WirePlumber has automated tests that you can easily run with: ``` $ meson test -C build ``` This will automatically compile all test dependencies, so you can be sure that this always tests your latest changes. If you wish to run a specific test instead of all of them, you can run: ``` $ meson test -C build test-name ``` When debugging a single test, you can additionally enable verbose test output by appending `-v` and you can also run the test in gdb by appending `--gdb`. For more information on how to use `meson test`, please refer to [meson's manual](https://mesonbuild.com/Unit-tests.html) > When submitting changes for review, always ensure that all tests pass ## WirePlumber examples WirePlumber ships examples in `test/examples`. Execute them from the top-level directory like this: ``` $ WIREPLUMBER_MODULE_DIR=build/modules ./build/tests/examples/audiotestsrc-play ``` Assuming there is no other process actively using `hw:0,0` from alsa, the above example should play a test tone on `hw:0,0` without errors. ## Native API clients ### pw-cat Using the default endpoint: ``` $ wpctl status # verify the default endpoints $ pw-record test.wav $ pw-play test.wav ``` Using a non-default endpoint: ``` $ pw-record --list-targets # find the node id $ pw-record --target test.wav $ pw-play --list-targets # find the node id $ pw-play --target test.wav ``` or ``` $ wpctl status # find the capture & playback endpoint ids $ pw-record --target test.wav $ pw-play --target test.wav ``` > Note: node ids and endpoint ids can be used interchangeably when specifying targets in all use cases. ### video-play Using the default endpoint: ``` $ cd path/to/pipewire-source-dir $ ./build/src/examples/video-play ``` Using a non-default endpoint: ``` $ wpctl status # find the endpoint id from the list $ cd path/to/pipewire-source-dir $ ./build/src/examples/video-play ``` > Tip: enable videotestsrc in wireplumber's configuration to have more video sources available (see `videotestsrc.node.disabled` in the configuration directory) ## PulseAudio compat API clients ### pacat Using the default endpoint: ``` $ wpctl status # verify the default endpoints $ pw-pulse parecord test.wav $ pw-pulse paplay test.wav ``` Using a non-default endpoint: ``` $ wpctl status # find the capture & playback endpoint ids $ PIPEWIRE_NODE= pw-pulse parecord test.wav $ PIPEWIRE_NODE= pw-pulse paplay test.wav ``` ### pavucontrol ``` $ pw-pulse pavucontrol ``` * Volume level meters should work * Changing the volume should work ## ALSA compat API clients ### aplay / arecord > Note: unless you have installed PipeWire in the default system prefix (`/usr`), the ALSA compat API will not work, unless you copy `libasound_module_pcm_pipewire.so` in the alsa plugins directory (usually `/usr//alsa-lib/`) and that you add the contents of `pipewire-alsa/conf/50-pipewire.conf` in your `~/.asoundrc` (or anywhere else, system-wide, where libasound can read it) Using the default endpoint: ``` $ wpctl status # verify the default endpoints $ arecord -D pipewire -f S16_LE -r 48000 test.wav $ aplay -D pipewire test.wav ``` Using a non-default endpoint: ``` $ wpctl status # find the capture & playback endpoint ids $ PIPEWIRE_NODE= arecord -D pipewire -f S16_LE -r 48000 test.wav $ PIPEWIRE_NODE= aplay -D pipewire test.wav ``` or ``` $ wpctl status # find the capture & playback endpoint ids $ arecord -D pipewire:NODE= -f S16_LE -r 48000 test.wav $ aplay -D pipewire:NODE= test.wav ``` ## JACK compat API clients ### qjackctl ``` pw-jack qjackctl ``` * This should correctly connect. * The "Graph" window should show the PipeWire graph. ### jack_simple_client ``` $ wpctl status # find the target endpoint id $ wpctl inspect # find the node.id $ PIPEWIRE_NODE= pw-jack jack_simple_client ``` > The JACK layer is not controlled by the session manager, it creates its own links; which is why it is required to specify a node id (endpoint id will not work) ## Device Reservation ### with PulseAudio 1. With PulseAudio running, start a pulseaudio client: ``` gst-launch-1.0 audiotestsrc ! pulsesink ``` 2. Start PipeWire & WirePlumber - The device in use by PA will not be available in PW 3. Stop the PA client - A few seconds later, WirePlumber should assume control of the device 4. `wpctl status` should be able to confirm that the device is available 5. Start a PA client again - It should not be able to play; it will just freeze 6. Stop WirePlumber - The PA client should immediately start playing ### with JACK 1. Start PipeWire & WirePlumber - All devices should be available 2. Start `jackdbus` - through `qjackctl`: - Enable `Setup` -> `Misc` -> `Enable JACK D-Bus interface` - Click `Start` on the main window - or manually: - Run `jackdbus auto` - Run `qdbus org.jackaudio.service /org/jackaudio/Controller org.jackaudio.JackControl.StartServer` 3. Wait a few seconds and run `wpctl status` to inspect - The devices taken by JACK should no longer be available - There should be two `JACK System` endpoints (sink & source) 4. Run an audio client on PipeWire (ex `pw-play test.wav`) - Notice how audio now goes through JACK 5. Stop JACK - through `qjackctl`, click `Stop` - or manually: `qdbus org.jackaudio.service /org/jackaudio/Controller org.jackaudio.JackControl.StopServer` 6. Wait a few seconds and run `wpctl status` to inspect - The devices that were release by JACK should again be available - There should be no `JACK System` endpoint > You may also start WirePlumber *after* starting JACK. It should immediately go to the state described in step 3