73 lines
2.1 KiB
C++
73 lines
2.1 KiB
C++
#include <boost/test/unit_test.hpp>
|
|
|
|
#include <atomic>
|
|
#include <barrier>
|
|
#include <thread>
|
|
#include <vector>
|
|
|
|
#include <sonus.hpp>
|
|
#include "detail/playback_devices.hpp"
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(sonus_updates_cannot_undo_concurrent_start_or_stop) {
|
|
auto config = sonus::audio_config{};
|
|
config.no_device = true;
|
|
auto created = sonus::engine::create(config);
|
|
BOOST_REQUIRE(created);
|
|
auto rendezvous = std::barrier{2};
|
|
auto failed = std::atomic<bool>{false};
|
|
auto updater = std::thread{[&] {
|
|
for (auto index = 0; index < 1000; ++index) {
|
|
for (auto phase = 0; phase < 2; ++phase) {
|
|
rendezvous.arrive_and_wait();
|
|
if (!created->update_metronome({})) {
|
|
failed.store(true);
|
|
}
|
|
rendezvous.arrive_and_wait();
|
|
}
|
|
}
|
|
}};
|
|
for (auto index = 0; index < 1000; ++index) {
|
|
rendezvous.arrive_and_wait();
|
|
if (!created->start_metronome({})) {
|
|
failed.store(true);
|
|
}
|
|
rendezvous.arrive_and_wait();
|
|
if (!created->metronome_active()) {
|
|
failed.store(true);
|
|
}
|
|
rendezvous.arrive_and_wait();
|
|
created->stop_metronome();
|
|
rendezvous.arrive_and_wait();
|
|
if (created->metronome_active()) {
|
|
failed.store(true);
|
|
}
|
|
}
|
|
updater.join();
|
|
BOOST_TEST(!failed.load());
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(sonus_device_selection_handles_empty_and_duplicate_devices) {
|
|
auto devices = std::vector<sonus::device_info>{
|
|
{.id = "0:1:speaker", .name = "speaker", .is_default = true},
|
|
{.id = "1:0:speaker", .name = "speaker", .is_default = false},
|
|
};
|
|
auto select = [&](auto id, auto name) {
|
|
return sonus::detail::find_playback_device(devices, id, name);
|
|
};
|
|
auto selected = select(devices[1].id, "speaker");
|
|
BOOST_REQUIRE(selected);
|
|
BOOST_TEST(*selected == 1U);
|
|
selected = select("stale-id", "speaker");
|
|
BOOST_REQUIRE(selected);
|
|
BOOST_TEST(*selected == 0U);
|
|
selected = select("", "speaker");
|
|
BOOST_REQUIRE(selected);
|
|
BOOST_TEST(*selected == 0U);
|
|
BOOST_TEST(!select("stale-id", ""));
|
|
BOOST_TEST(!select("", ""));
|
|
BOOST_TEST(!select("", "missing"));
|
|
devices.clear();
|
|
BOOST_TEST(!select("0:1:speaker", "speaker"));
|
|
}
|