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:
backend.playback.prepare_change()
backend.playback.change_track(tl_track.track)
success = backend.playback.play().get()
success = (backend.playback.change_track(tl_track.track).get() and
backend.playback.play().get())
if success:
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
# TODO: split into smaller easier to follow tests. setup is way to complex.
class CorePlaybackTest(unittest.TestCase):
def setUp(self): # noqa: N802
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.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.playback1.prepare_change.assert_called_once_with()
@ -124,6 +125,22 @@ class CorePlaybackTest(unittest.TestCase):
self.assertEqual(
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(
'mopidy.core.playback.listener.CoreListener', spec=core.CoreListener)
def test_play_when_stopped_emits_events(self, listener_mock):