40
40
namespace media = core::ubuntu::media;
42
TEST(MusicService, accessing_and_creating_a_session_works)
44
test::CrossProcessSync sync_service_start;
46
auto service = [&sync_service_start]()
46
inline SigTermCatcher()
48
sigemptyset(&signal_mask);
50
if (-1 == sigaddset(&signal_mask, SIGTERM))
51
throw std::system_error(errno, std::system_category());
53
if (-1 == sigprocmask(SIG_BLOCK, &signal_mask, NULL))
54
throw std::system_error(errno, std::system_category());
57
inline void wait_for_signal()
60
::sigwait(&signal_mask, &signal);
66
void sleep_for(const std::chrono::milliseconds& ms)
68
long int ns = ms.count() * 1000 * 1000;
70
::nanosleep(&ts, nullptr);
74
TEST(MusicService, DISABLED_accessing_and_creating_a_session_works)
76
core::testing::CrossProcessSync sync_service_start;
78
auto service = [this, &sync_service_start]()
48
82
auto service = std::make_shared<media::ServiceImplementation>();
49
83
std::thread t([&service](){service->run();});
51
sync_service_start.signal_ready();
85
sync_service_start.try_signal_ready_for(std::chrono::milliseconds{500});
87
sc.wait_for_signal(); service->stop();
92
return ::testing::Test::HasFailure() ? core::posix::exit::Status::failure : core::posix::exit::Status::success;
57
auto client = [&sync_service_start]()
95
auto client = [this, &sync_service_start]()
59
sync_service_start.wait_for_signal_ready();
97
sync_service_start.wait_for_signal_ready_for(std::chrono::milliseconds{500});
61
99
auto service = media::Service::Client::instance();
62
100
auto session = service->create_session(media::Player::Client::default_configuration());
64
102
EXPECT_TRUE(session != nullptr);
104
return ::testing::Test::HasFailure() ? core::posix::exit::Status::failure : core::posix::exit::Status::success;
67
ASSERT_NO_FATAL_FAILURE(test::fork_and_run(service, client));
107
EXPECT_EQ(core::testing::ForkAndRunResult::empty,
108
core::testing::fork_and_run(service, client));
70
TEST(MusicService, remotely_querying_track_meta_data_works)
111
TEST(MusicService, DISABLED_remotely_querying_track_meta_data_works)
72
113
const std::string test_file{"/tmp/test.ogg"};
73
114
const std::string test_file_uri{"file:///tmp/test.ogg"};
74
115
std::remove(test_file.c_str());
75
116
ASSERT_TRUE(test::copy_test_ogg_file_to(test_file));
77
test::CrossProcessSync sync_service_start;
118
core::testing::CrossProcessSync sync_service_start;
79
auto service = [&sync_service_start]()
120
auto service = [this, &sync_service_start]()
81
124
auto service = std::make_shared<media::ServiceImplementation>();
82
125
std::thread t([&service](){service->run();});
84
sync_service_start.signal_ready();
127
sync_service_start.try_signal_ready_for(std::chrono::milliseconds{500});
129
sc.wait_for_signal(); service->stop();
134
return ::testing::Test::HasFailure() ? core::posix::exit::Status::failure : core::posix::exit::Status::success;
90
auto client = [&sync_service_start]()
137
auto client = [this, &sync_service_start]()
92
sync_service_start.wait_for_signal_ready();
139
sync_service_start.wait_for_signal_ready_for(std::chrono::milliseconds{500});
94
141
static const media::Track::UriType uri{"file:///tmp/test.ogg"};
118
168
std::remove(test_file.c_str());
119
169
ASSERT_TRUE(test::copy_test_mp3_file_to(test_file));
121
test::CrossProcessSync sync_service_start;
171
core::testing::CrossProcessSync sync_service_start;
123
auto service = [&sync_service_start]()
173
auto service = [this, &sync_service_start]()
125
177
auto service = std::make_shared<media::ServiceImplementation>();
126
178
std::thread t([&service](){service->run();});
128
sync_service_start.signal_ready();
180
sync_service_start.try_signal_ready_for(std::chrono::milliseconds{500});
182
sc.wait_for_signal(); service->stop();
130
184
if (t.joinable())
187
return ::testing::Test::HasFailure() ? core::posix::exit::Status::failure : core::posix::exit::Status::success;
134
auto client = [&sync_service_start]()
190
auto client = [this, &sync_service_start]()
136
sync_service_start.wait_for_signal_ready();
192
sync_service_start.wait_for_signal_ready_for(std::chrono::milliseconds{500});
138
194
static const media::Track::UriType uri{"file:///tmp/test.mp3"};
140
196
auto service = media::Service::Client::instance();
141
197
auto session = service->create_session(media::Player::Client::default_configuration());
143
ASSERT_EQ(true, session->can_play().get());
144
ASSERT_EQ(true, session->can_pause().get());
145
ASSERT_EQ(true, session->can_seek().get());
146
ASSERT_EQ(true, session->can_go_previous().get());
147
ASSERT_EQ(true, session->can_go_next().get());
148
ASSERT_EQ(media::Player::PlaybackStatus::null, session->playback_status());
149
ASSERT_EQ(media::Player::LoopStatus::none, session->loop_status());
150
ASSERT_NEAR(1.f, session->playback_rate().get(), 1E-5);
151
ASSERT_EQ(true, session->is_shuffle());
152
ASSERT_EQ(true, session->track_list()->can_edit_tracks().get());
199
EXPECT_EQ(true, session->can_play().get());
200
EXPECT_EQ(true, session->can_pause().get());
201
EXPECT_EQ(true, session->can_seek().get());
202
EXPECT_EQ(true, session->can_go_previous().get());
203
EXPECT_EQ(true, session->can_go_next().get());
204
EXPECT_EQ(media::Player::PlaybackStatus::null, session->playback_status());
205
EXPECT_EQ(media::Player::LoopStatus::none, session->loop_status());
206
EXPECT_NEAR(1.f, session->playback_rate().get(), 1E-5);
207
EXPECT_EQ(true, session->is_shuffle());
208
EXPECT_EQ(true, session->track_list()->can_edit_tracks().get());
154
210
EXPECT_TRUE(session->open_uri(uri));
156
test::WaitableStateTransition<media::Player::PlaybackStatus>
212
core::testing::WaitableStateTransition<media::Player::PlaybackStatus>
157
213
state_transition(
158
214
media::Player::stopped);
160
216
session->playback_status().changed().connect(
161
std::bind(&test::WaitableStateTransition<media::Player::PlaybackStatus>::trigger,
217
std::bind(&core::testing::WaitableStateTransition<media::Player::PlaybackStatus>::trigger,
162
218
std::ref(state_transition),
163
219
std::placeholders::_1));
166
std::this_thread::sleep_for(std::chrono::seconds{1});
167
ASSERT_EQ(media::Player::PlaybackStatus::playing, session->playback_status());
222
sleep_for(std::chrono::seconds{1});
223
EXPECT_EQ(media::Player::PlaybackStatus::playing, session->playback_status());
169
std::this_thread::sleep_for(std::chrono::seconds{1});
170
ASSERT_EQ(media::Player::PlaybackStatus::stopped, session->playback_status());
225
sleep_for(std::chrono::seconds{1});
226
EXPECT_EQ(media::Player::PlaybackStatus::stopped, session->playback_status());
172
std::this_thread::sleep_for(std::chrono::seconds{1});
173
ASSERT_EQ(media::Player::PlaybackStatus::playing, session->playback_status());
228
sleep_for(std::chrono::seconds{1});
229
EXPECT_EQ(media::Player::PlaybackStatus::playing, session->playback_status());
174
230
session->pause();
175
std::this_thread::sleep_for(std::chrono::seconds{1});
176
ASSERT_EQ(media::Player::PlaybackStatus::paused, session->playback_status());
231
sleep_for(std::chrono::seconds{1});
232
EXPECT_EQ(media::Player::PlaybackStatus::paused, session->playback_status());
234
sleep_for(std::chrono::seconds{1});
235
EXPECT_EQ(media::Player::PlaybackStatus::stopped, session->playback_status());
237
return ::testing::Test::HasFailure() ? core::posix::exit::Status::failure : core::posix::exit::Status::success;
179
ASSERT_NO_FATAL_FAILURE(test::fork_and_run(service, client));
240
EXPECT_EQ(core::testing::ForkAndRunResult::empty,
241
core::testing::fork_and_run(service, client));
186
248
std::remove(test_file.c_str());
187
249
ASSERT_TRUE(test::copy_test_mp3_file_to(test_file));
189
test::CrossProcessSync sync_service_start;
251
core::testing::CrossProcessSync sync_service_start;
191
auto service = [&sync_service_start]()
253
auto service = [this, &sync_service_start]()
193
257
auto service = std::make_shared<media::ServiceImplementation>();
194
258
std::thread t([&service](){service->run();});
196
sync_service_start.signal_ready();
260
sync_service_start.try_signal_ready_for(std::chrono::milliseconds{500});
262
sc.wait_for_signal(); service->stop();
198
264
if (t.joinable())
267
return ::testing::Test::HasFailure() ? core::posix::exit::Status::failure : core::posix::exit::Status::success;
202
auto client = [&sync_service_start]()
270
auto client = [this, &sync_service_start]()
204
sync_service_start.wait_for_signal_ready();
272
sync_service_start.wait_for_signal_ready_for(std::chrono::milliseconds{500});
206
274
static const media::Track::UriType uri{"file:///tmp/test.mp3"};
207
275
static const bool dont_make_current{false};
209
277
auto service = media::Service::Client::instance();
210
278
auto session = service->create_session(media::Player::Client::default_configuration());
212
ASSERT_EQ(true, session->can_play().get());
213
ASSERT_EQ(true, session->can_play().get());
214
ASSERT_EQ(true, session->can_pause().get());
215
ASSERT_EQ(true, session->can_seek().get());
216
ASSERT_EQ(true, session->can_go_previous().get());
217
ASSERT_EQ(true, session->can_go_next().get());
218
ASSERT_EQ(media::Player::PlaybackStatus::null, session->playback_status());
219
ASSERT_EQ(media::Player::LoopStatus::none, session->loop_status());
220
ASSERT_NEAR(1.f, session->playback_rate().get(), 1E-5);
221
ASSERT_EQ(true, session->is_shuffle());
222
ASSERT_EQ(true, session->track_list()->can_edit_tracks().get());
280
EXPECT_EQ(true, session->can_play().get());
281
EXPECT_EQ(true, session->can_play().get());
282
EXPECT_EQ(true, session->can_pause().get());
283
EXPECT_EQ(true, session->can_seek().get());
284
EXPECT_EQ(true, session->can_go_previous().get());
285
EXPECT_EQ(true, session->can_go_next().get());
286
EXPECT_EQ(media::Player::PlaybackStatus::null, session->playback_status());
287
EXPECT_EQ(media::Player::LoopStatus::none, session->loop_status());
288
EXPECT_NEAR(1.f, session->playback_rate().get(), 1E-5);
289
EXPECT_EQ(true, session->is_shuffle());
290
EXPECT_EQ(true, session->track_list()->can_edit_tracks().get());
224
292
session->track_list()->add_track_with_uri_at(uri, media::TrackList::after_empty_track(), dont_make_current);
226
EXPECT_EQ(1, session->track_list()->tracks()->size());
294
EXPECT_EQ(std::uint32_t{1}, session->track_list()->tracks()->size());
228
test::WaitableStateTransition<media::Player::PlaybackStatus>
296
core::testing::WaitableStateTransition<media::Player::PlaybackStatus>
229
297
state_transition(
230
298
media::Player::stopped);
232
300
session->playback_status().changed().connect(
233
std::bind(&test::WaitableStateTransition<media::Player::PlaybackStatus>::trigger,
301
std::bind(&core::testing::WaitableStateTransition<media::Player::PlaybackStatus>::trigger,
234
302
std::ref(state_transition),
235
303
std::placeholders::_1));