core: Update playback code to take change track into account.

This change has us checking the return value of change_track when deciding if
the play call was a success or if the track is unplayable. Which ensures that
the following can no longer happen: 1) play stream 2) play stream that fails
change_track 3) stream 1) continues playing. Correct behavior being the next
stream playing instead.
This commit is contained in:
Thomas Adamcik 2015-03-22 22:12:51 +01:00
parent 67d4dac862
commit efe9430c7a
2 changed files with 20 additions and 3 deletions

View File

@ -312,8 +312,8 @@ class PlaybackController(object):
if backend: if backend:
backend.playback.prepare_change() backend.playback.prepare_change()
backend.playback.change_track(tl_track.track) success = (backend.playback.change_track(tl_track.track).get() and
success = backend.playback.play().get() backend.playback.play().get())
if success: if success:
self.core.tracklist._mark_playing(tl_track) self.core.tracklist._mark_playing(tl_track)

View File

@ -12,6 +12,7 @@ from mopidy.models import Track
from tests import dummy_audio as audio from tests import dummy_audio as audio
# TODO: split into smaller easier to follow tests. setup is way to complex.
class CorePlaybackTest(unittest.TestCase): class CorePlaybackTest(unittest.TestCase):
def setUp(self): # noqa: N802 def setUp(self): # noqa: N802
self.backend1 = mock.Mock() self.backend1 = mock.Mock()
@ -113,7 +114,7 @@ class CorePlaybackTest(unittest.TestCase):
self.playback2.change_track.assert_called_once_with(self.tracks[1]) self.playback2.change_track.assert_called_once_with(self.tracks[1])
self.playback2.play.assert_called_once_with() self.playback2.play.assert_called_once_with()
def test_play_skips_to_next_on_unplayable_track(self): def test_play_skips_to_next_on_track_without_playback_backend(self):
self.core.playback.play(self.unplayable_tl_track) self.core.playback.play(self.unplayable_tl_track)
self.playback1.prepare_change.assert_called_once_with() self.playback1.prepare_change.assert_called_once_with()
@ -124,6 +125,22 @@ class CorePlaybackTest(unittest.TestCase):
self.assertEqual( self.assertEqual(
self.core.playback.current_tl_track, self.tl_tracks[3]) self.core.playback.current_tl_track, self.tl_tracks[3])
def test_play_skips_to_next_on_unplayable_track(self):
"""Checks that we handle change track failing."""
self.playback2.change_track().get.return_value = False
self.core.tracklist.clear()
self.core.tracklist.add(self.tracks[:2])
tl_tracks = self.core.tracklist.tl_tracks
self.core.playback.play(tl_tracks[0])
self.core.playback.play(tl_tracks[1])
# TODO: we really want to check that the track was marked unplayable
# and that next was called. This is just an indirect way of checking
# this :(
self.assertEqual(self.core.playback.state, core.PlaybackState.STOPPED)
@mock.patch( @mock.patch(
'mopidy.core.playback.listener.CoreListener', spec=core.CoreListener) 'mopidy.core.playback.listener.CoreListener', spec=core.CoreListener)
def test_play_when_stopped_emits_events(self, listener_mock): def test_play_when_stopped_emits_events(self, listener_mock):